zoukankan      html  css  js  c++  java
  • react-组件间的通信

    方式一:通过props传递(只能父子之间传值)

    1.共同的数据放在父组件上,特有的数据放在自己组件内部(state)

    2.通过props可以传递一般数据和函数数据,只能一层一层传递

    3.一般数据--->父组件传递数据给子组件--->子组件读取数据

    4.函数数据--->子组件传递数据给父组件--->子组件调用函数

    方式二:使用消息订阅(subscribe)-发布(publish)机制

    1.工具库:PubSubJS

    2.下载:npm install pubsub --save

    在使用PubSub之前是使用props传递的:祖组件<--->父组件<--->子组件

    祖组件:

    import React,{Component} from 'react'
    import CommentAdd from '../comment-add/comment-add'
    import CommentList from '../comment-list/comment-list'
    import '../../../main.css'
    export default class App extends Component{
        state={
            comments:[
                {username:'tom',content:'reactr'},
                {username:'jack',content:'qweq'},
            ]
        }
        deleteComment = (index) => {
            const {comments} = this.state
            comments.splice(index,1)
            this.setState({comments})
        }
        render(){
            const {comments}=this.state
            return(
                <div>
                    <h1 className="title">TITLE,TITLE,TITLE</h1>
                    <CommentAdd/>
                    <CommentList comments={comments} deleteComment={this.deleteComment}/>
                //      传递参数             传递方法 </div> ) } }

    父组件:

    import React,{Component} from 'react'
    import PropTypes from '_prop-types@15.7.2@prop-types'
    import CommentItem from '../comment-item/comment-item'
    export default class CommentList extends Component{
        static propTypes={//接收并定义类型和限制
            comments:PropTypes.array.isRequired,
            deleteComment:PropTypes.func.isRequired
        }
        render(){
            const {comments,deleteComment}=this.props
            const display = comments.length==0?'block':'none'
            return(
                <div className="commentList">
                    <h3>评论回复:</h3>
                    <h4 style={{display}}>贺岁档和附件三</h4>
                    <ul>
                        {comments.map((comment,index) => <CommentItem comment={comment} key={index} deleteComment={deleteComment} index={index}/>)}
                  //                                               再次传递方法 </ul> </div> ) } }

    子组件:

    import React,{Component} from 'react'
    import PropTypes from 'prop-types'
    export default class CommentItem extends Component{
        static propTypes = {//接收参数和方法,定义类型和限制
            comment:PropTypes.object.isRequired,
            deleteComment:PropTypes.func.isRequired,
            index:PropTypes.number.isRequired
        }
        handleDelete = () => {
            const {comment,deleteComment,index} = this.props
            //提示
            if(window.confirm(`确定删除${comment.username}的评论吗?`)){
                //确定后删除
                deleteComment(index)
                //        调用
            }
        }
        render(){
            const {comment} = this.props
            return(
                <li>
                    <div className="commentItem">
                        <p>{comment.username}:</p>
                        <p>{comment.content}</p>
                        <button onClick={this.handleDelete}>delete</button>
                    </div>
                </li>
            )
        }
    }    

    使用PubSubJS传递:

    子组件:

    import React,{Component} from 'react'
    import PropTypes from 'prop-types'
    import PubSub from 'pubsub-js'
    export default class CommentItem extends Component{
        static propTypes = {
            comment:PropTypes.object.isRequired,
            index:PropTypes.number.isRequired
        }
        handleDelete = () => {
            const {comment,index} = this.props
            //提示
            if(window.confirm(`确定删除${comment.username}的评论吗?`)){
                //确定后删除
                //发布消息(一个叫delete的方法),index是要传的参数
                PubSub.publish('delete',index)
            }
        }
        render(){
            const {comment} = this.props
            return(
                <li>
                    <div className="commentItem">
                        <p>{comment.username}:</p>
                        <p>{comment.content}</p>
                        <button onClick={this.handleDelete}>delete</button>
                    </div>
                </li>
            )
        }
    }

    祖组件:

    import React,{Component} from 'react'
    import PubSub from 'pubsub-js'
    import CommentAdd from '../comment-add/comment-add'
    import CommentList from '../comment-list/comment-list'
    import '../../../main.css'
    export default class App extends Component{
        state={
            comments:[
                {username:'tom',content:'reactreactreactreactreactreact'},
                {username:'jack',content:'qweqweqweqweqweqwe'},
            ]
        }
        componentDidMount() {
            //订阅一个叫delete的消息
            PubSub.subscribe('delete',(msg,index) => {
                this.deleteComment(index)
            })
        }
        addComment = (comment) => {
            //获取
            const {comments} = this.state
            //修改
            comments.unshift(comment)/**/
            //状态更新
            this.setState({comments})
        }
        deleteComment = (index) => {
            //获取
            const {comments} = this.state
            //删除
            comments.splice(index,1)
            //状态更新
            this.setState({comments})
        }
        render(){
            const {comments}=this.state
            return(
                <div>
                    <h1 className="title">TITLE,TITLE,TITLE</h1>
                    <CommentAdd addComment={this.addComment}/>
                    <CommentList comments={comments}/>
                </div>
            )
        }
    }

    方式三:redux(重点哦)

    先略过

  • 相关阅读:
    Caliburn micro 学习笔记...
    First steps with Caliburn Micro in Windows Phone 8 系列文章
    WPF and Silverlight.ComboBox 如何通过 Binding IsDropDownOpen 实现下拉菜单展开
    http各个状态码的详解
    点阵字库产生的原理
    Windows 服务调试方法(基于.net framwork4.6)
    关于.net Core 笔记
    JS+ google.maps.api 实现基本的导航功能
    C# 遍历控件检查是否有被选中的项(通用)
    C#编程习惯
  • 原文地址:https://www.cnblogs.com/czh64/p/12120749.html
Copyright © 2011-2022 走看看