美文网首页
[react]8、跨组件通信

[react]8、跨组件通信

作者: 史记_d5da | 来源:发表于2021-11-06 22:06 被阅读0次

    1、props传递

    实际上,JSX 仅仅只是 React.createElement(component, props, ...children) 函数的语法糖。如下 JSX 代码:

    import React, { Component } from 'react'
    function ProfileHeader(props) {
        return(
            <div>
                <h2>{"用户昵称:" + props.nickName}</h2>
                <h2>{"用户等级:" + props.level}</h2>
            </div>
        )
    }
    function  Profile(props) {
        return(
            <div>
                <ProfileHeader {...props}/>
                <ul>
                    <li>设置1</li>
                </ul>
            </div>
        )
    }
    export default class App extends Component {
        constructor(props) {
            super(props)
            this.state = {
                nickName: "codeWhy",
                level: 99
            }
        }
        render() {
            return (
                <div>
                    {/* <Profile nickName={this.state.nickName} level={this.state.level}/> */}
                    <Profile {...this.state}/>
                    App
                </div>
            )
        }
    }
    

    2、Context

    Context 提供了一种在组件之间共享此类值的方式,而不必显式地通过组件树的逐层传递 props。
    1、何时使用 Context
    Context 设计目的是为了共享那些对于一个组件树而言是“全局”的数据,例如当前认证的用户、主题或首选语言。
    Context 提供了一种在组件之间共享此类值的方式,而不必显式地通过组件树的逐层传递 props。
    2、Context相关API
    1、React.createContext
    创建一个需要共享的Context对象,如果一个组件订阅了Context,那么这个组件会从离自身最近的那个匹配的 Provider 中读取到当前的context值
    2、Context.Provider
    每个 Context 对象都会返回一个 Provider React 组件,它允许消费组件订阅 context 的变化。
    Provider 接收一个 value 属性,传递给消费组件,一个 Provider 可以和多个消费组件有对应关系。
    多个 Provider 也可以嵌套使用,里层的会覆盖外层的数据
    当 Provider 的 value 值发生变化时,它内部的所有消费组件都会重新渲染
    3、Class.contextType
    挂载在 class 上的 contextType 属性会被重赋值为一个由 React.createContext() 创建的 Context 对象。
    this.context的值,来自于Class.contextType的设置
    4、Context.Consumer
    这里,React 组件也可以订阅到 context 变更。这能让你在 函数式组件 中完成订阅 context。
    UserContext.Provider 和 ProfileHeader.contextType的配合使用

    import React, { Component } from 'react'
    const UserContext = React.createContext({
        nickName: "aaaa",
        level: -1
    })
    
    class ProfileHeader extends Component {
        render() {
            console.log(this.context);
            return(
                <div>
                    <h2>{"用户昵称:"+ this.context.nickName }</h2>
                    <h2>{"用户等级:" + this.context.level}</h2>
                </div>
            )
        }
    }
    // 将 UserContext 的默认值直接赋值给 ProfileHeader 的 context
    ProfileHeader.contextType = UserContext;
    function  Profile(props) {
        return(
            <div>
                <ProfileHeader {...props}/>
                <ul>
                    <li>设置1</li>
                </ul>
            </div>
        )
    }
    
    export default class App extends Component {
        constructor(props) {
            super(props)
            this.state = {
                nickName: "codeWhy",
                level: 99
            }
        }
        render() {
            return (
                <div>
                    <UserContext.Provider value={this.state}>
                        <Profile />
                    </UserContext.Provider>
                    App
                </div>
            )
        }
    }
    

    函数式组件Provider的传值方式+多个Context的传值取值方式

    import React, { Component } from 'react'
    // import UserContext from 'context'
    const UserContext = React.createContext({
        nickName: "aaaa",
        level: -1
    })
    
    const ThemContext = React.createContext({
        color: 'red'
    })
    
    function ProfileHeader() {
        return(
            <UserContext.Consumer>
                {
                    value => {
                        return (
                            <ThemContext.Consumer>
                                {
                                    themValue => {
                                        return (
                                            <div>
                                                <h2 style={{color: themValue.color}}>{"用户昵称:"+ value.nickName }</h2>
                                                <h2>{"用户等级:" + value.level}</h2>
                                                <h2>{"颜色" + themValue.color}</h2>
                                            </div>
                                        )
                                    }
                                }
                            </ThemContext.Consumer>
                        )
                    }
                }
            </UserContext.Consumer>
        )
    }
    
    function  Profile(props) {
        return(
            <div>
                <ProfileHeader />
                <ul>
                    <li>设置1</li>
                </ul>
            </div>
        )
    }
    
    export default class App extends Component {
        constructor(props) {
            super(props)
            this.state = {
                nickName: "codeWhy",
                level: 99
            }
        }
        render() {
            return (
                <div>
                    <UserContext.Provider value={this.state}>
                        <ThemContext.Provider value={{color: "red"}}>
                            <Profile />
                        </ThemContext.Provider>
                    </UserContext.Provider>
                </div>
            )
        }
    }
    

    相关文章

      网友评论

          本文标题:[react]8、跨组件通信

          本文链接:https://www.haomeiwen.com/subject/pltszltx.html