React 17 父子组件通信方式 参数默认值 参数类型限制

1.父组件给子组件传递参数


//父组件

<Header name={'czy'} phone={183*******}></Header>

//子组件

export default function Header(props) {

    console.log(props) // {name: 'czy', phone: 183*******}

    return (<div className="Header">Header</div>)

}

子组件设置参数默认值


export default function Header(props) {

    console.log(props) // {name: 'czy', phone: 183*******, age: 0}

    return (<div className="Header">Header</div>)

}

Header.defaultProps = {

    name: 'czy',

    age: 0

}

函数式子组件参数类型限制

  • 安装插件 npm i prop-types

  • 引入插件 import ReactTypes from 'prop-types'

  • 添加校验


    import ReactTypes from 'prop-types'

    export default function Header(p) {

        console.log(p)

        return (<div className="Header">Header</div>)

    }

    Header.defaultProps = {

        name: 'czy',

        age: 3

    }

    Header.propTypes = {

        name: ReactTypes.string,

        age: ReactTypes.number,

        phone: ReactTypes.number,

    }

类子组件添加默认参数与参数类型限制

  • 安装插件 npm i prop-types

  • 引入插件 import ReactTypes from 'prop-types'

  • 添加校验


    import ReactTypes from 'prop-types'

    export default class Main extends React.Component {

    render() {

        console.log(this.props)

        return (<div className="Main">Main</div>)

    }

    static defaultProps = {

        content: "content"

    }

    static propTypes = {

        type: ReactTypes.string,

    }

}

2.子父组件之间的通讯

  • 原理:父组件给子组件传递一个方法,子组件调用父组件传递过来的方法并且传参从而达到子组件给父组件传递参数的效果

    父组件

    <Footer setName={setName}></Footer>

    function setName(value) {

        console.log('setName', value)

        name = value

    }

    子组件

     <button onClick={() => {

        props.setName(name)

    }}>setName</button>

3.跨组件通讯

  • 通过父传子 子传孙一级一级传递

  • 使用context方法一

    • 1.创建一个Context,解构出Provider, Consumer

    • 2.用Provider包裹住子组件

    • 3.在Provider上通过value生产数据给子组件

    • 4.在子组件中用Consumer消费父组件生产的数据

    
    <!-- 父组件 -->
    
    export const {Provider, Consumer} = React.createContext({})
    
    <Provider value={{name:'czy'}}>子组件</Provider>
    
    <!-- 子组件 -->
    
    <Consumer>
    
     {
    
         (value)=>{
    
             return(
    
                 <div>{value.name}</div>
    
             )
    
         }
    
     }
    
    </Consumer>
    
    
  • 使用Context方法二

    • 1.创建一个Context,在创建的时候默认生产数据

    • 2.在子组件上添加静态方法

    • 3.在子组件上通过this.context.value消费数据

    • 4.局限于从父往子,无法从子到父,也无法在兄弟组件中使用

    
     <!-- 父组件 -->
    
    const Context = React.createContext({name:'czy'})
    
    <!-- 子组件 -->
    
    Son.contextType = Context
    
    
  • Context注意点

    • 1.支持多个生产者和多个消费者

    • 2.如果是通过contextType则不支持多个消费者,因为会被后面的覆盖

  • events 第三方库

    • 1.安装 npm i events

    • 2.导入 import {eventEmitter} from events

    • 3.创建全局eventBus const eventBus = new eventEmitter()

    • 4.爷爷在componentDidMount生命周期内注册事件监听:eventBus.addListener('say', this.aFn.bind(this))

    • 5.孙子eventBus.emitter(say, params)

    • 6.注意点,为了优化性能,在组件卸载(componentWillUnmount)的时候要移除事件监听eventBus.removeListener('say', this.aFn.bind(this))

eventBus.jsx
  // 全局事件总线
  import { EventEmitter } from "events";
  export default new EventEmitter() 


header.jsx
import eventBus from "./eventBus"
import React from "react"
export default class Header extends React.Component {
    say(name) {
        console.log(name)
    }
    render() {
        return (<div className="Header">
        </div>)
    }
    componentDidMount() {
        // 获取参数监听
        eventBus.addListener('say', this.say.bind(this))
    }
}


footer.jsx
import eventBus from "./eventBus"
export default function Footer(props) {
    return (
        <div className="Footer">
            // 点击传递参数
            <button onClick={() => {
                eventBus.emit('say', 'czy')
            }}>emit</button>
        </div>
    );
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容