• React组件通信技巧


    效果图


    communication.gif

    点击查看Github完整源码

    1.父向子通信

    • 直接标签中插入参数即可
    //number只是个例子
    let _number = this.state.number
    <Child number={_number} />

    需要注意,_number 可以为普通参数、this.xxx 参数、也可以是 this.state.xxx 参数,其中this.state.xxx参数若发生改变,会导致 Child 重新渲染

    2.子向父通信

    • 需要从 Parent 处接一个绑定了父组件的函数,然后在 Child 内部调用修改父的相关参数,达到效果
    //从父组件接函数
    childToParent() {
        let _backNumber = this.state.backNumber
        this.setState({
            backNumber: _backNumber + 1
        })
    }
    
    let _childToParent = this.childToParent.bind(this)
    
    <Brother childToParent={_childToParent} />
    <div>{'子向父通信:' + _backNumber}</div>
    
    //子组件触发函数
    let _childToParent = this.childToParent.bind(this)
    
    <button onClick={_childToParent}>子向父通信</button>

    同样,可以修改父组件的 this.state.xxx( this.setState() 触发渲染),也可以修改this.xxx等值

    3.通用组件通信方式(包括兄弟组件)

    • 理论上,掌握了子向父通信与父向子通信,可以处理兄弟组件通信,但是如果层级过深,这种方式极度麻烦

    • 建议使用 Event 对象处理嵌套层级过深的组件通信(当然包括兄弟组件通信)

    //建议将Event相关单独封装模块使用
    //event.js
    export var events = {
        ctc: 'ctc',
        ctp: 'ctp',
        ptc: 'ptc',
        bts: 'bts',
        stb: 'stb'
    }
    
    export var sendEvent = (eventName, params) => {
        var event = new Event(eventName)
        event.params = params
        document.dispatchEvent(event)
    }
    
    export var catchEvent = (eventName, callback) => {
        document.addEventListener(eventName, e => callback(e))
    }
    
    export var removeCatch = (eventName, callback) => {
        document.removeEventListener(eventName, callback)
    }
    
    //brother.js 发送组件
    import {events, sendEvent} from './event'
    <button onClick={_brotherToSister}>Brother向Sister通信</button>
    
    brotherToSister() {
        let _obj = {
            message: 'brother to sister'
        }
        sendEvent(events.bts, _obj)
    }
    
    //sister.js 接收组件
    import {events, catchEvent} from './event'
    
    constructor() {
        super()
        this.state = {
            message: ''
        }
    
        //防止多次引用
        this._brotherToSister = this.brotherToSister.bind(this)
    }
    
    componentDidMount() {
        catchEvent(events.bts, this._brotherToSister)
        //会造成多次引用
    //        catchEvent(events.bts, this.brotherToSister.bind(this))
    }
    
    componentWillUnmount() {
        removeCatch(event.bts, this._brotherToSister)
    }
    
    brotherToSister(e) {
        this.setState({
            message: e.params.message
        })
    }
    
    <div>
        {'message: ' + _message}
    </div>

    点击查看Github完整源码

  • 相关阅读:
    POJ 1166 The Clocks 高斯消元 + exgcd(纯属瞎搞)
    防止登录页面出如今frame中
    android--显式跳转和隐式跳转的差别使用方法
    卫星照片
    poj 2586 Y2K Accounting Bug (贪心)
    【转】关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型
    【转】在Eclipse中使用PyDev进行Python开发
    【转】eclipse + Pydev 配置Python开发环境
    【转】Python自动化测试 (一) Eclipse+Pydev 搭建开发环境
    【转】Eclipse的启动问题【an error has occurred see the log file】
  • 原文地址:https://www.cnblogs.com/libin-1/p/7083074.html
Copyright © 2020-2023  润新知