react组件间通信之context

  • 一般用于【祖组件】与【后代组件】间通信

    案例:

    A,B,C,D四个组件的关系分别为:爷爷,爸爸,儿子,孙子

    从A向C传递参数:C组件为类式组件

    从A向D传递参数:D组件为函数组件

    javascript 复制代码
    import React, { Component } from 'react'
    import './index.css'
    
    /**
     * 【祖组件】与【后代组件】间通信
     */
    
    // 创建Context容器对象:
    const MyContext = React.createContext()
    const {Provider,Consumer} = MyContext
    
    export default class A extends Component {
        state = {name:'sun',age:18}
        render() {
            const {name,age} = this.state;
            return (
                <div className='one'>
                    <h5>A组件</h5>
                    <div>我的名字是:{name}</div>
                    {/* 渲染子组件时,外面包裹Provider,通过value属性给后代组件传递参数 */}
                    <Provider value={{name,age}}>
                        <B></B>
                    </Provider>
                    
                </div>
            )
        }
    }
    
    class B extends Component {
        render() {
            return (
                <div className='two'>
                    <h5>B组件</h5>
                    <C></C>
                </div>
            )
        }
    }
    
    /**
     * 后代组件读取数据
     * 方式一:仅使用于类组件
     */
    class C extends Component {
        // 第一步:声明接受context
        static contextType = MyContext;
        render() {
            return (
                <div className='three'>
                    <h5>C组件</h5>
                    {/* 第二步:读取context中的value数据 */}
                    <div>C组件从A组件拿到的名字是:{this.context.name}</div>        
                    <D></D>
                </div>
            )
        }
    }
    
    /**
     * 后代组件读取数据
     * 方式二:函数组件与类组件都可以
     */
    function D(){
        return(
            <div className='four'>
                <h5>D组件</h5>
                <div>D组件从A组件拿到的名字是:
                    <Consumer>
                        {value => `${value.name},年龄是:${value.age}。`}
                    </Consumer>
                </div>
            </div>
        )
    }

    样式文件:

    javascript 复制代码
    .one{
        width: 500px;
        background-color: red;
        padding: 20px;
    }
    .two{
        width: 90%;
        background-color: orange;
        padding: 20px;
    }
    .three{
        width: 90%;
        background-color: yellow;
        padding: 20px;
    }
    .four{
        width: 90%;
        background-color: green;
        padding: 20px;
    }

    运行效果:

相关推荐
鸡鸭扣30 分钟前
DRF/Django+Vue项目线上部署:腾讯云+Centos7.6(github的SSH认证)
前端·vue.js·python·django·腾讯云·drf
龙井茶Sky33 分钟前
验证码与登录过程逻辑学习总结
前端·登录·验证码
sunbyte2 小时前
Three.js + React 实战系列 - 职业经历区实现解析 Experience 组件✨(互动动作 + 3D 角色 + 点击切换动画)
javascript·react.js·3d
2401_831943322 小时前
Element Plus对话框(ElDialog)全面指南:打造灵活弹窗交互
前端·vue.js·交互
strongwyy2 小时前
DA14585墨水屏学习(2)
前端·javascript·学习
好青崧2 小时前
冒泡排序的原理
前端
椒盐螺丝钉2 小时前
CSS 基础知识分享:从入门到注意事项
前端·css
冬阳春晖3 小时前
web animation API 锋利的css动画控制器 (更新中)
前端·javascript·css
Python私教4 小时前
使用FastAPI和React以及MongoDB构建全栈Web应用05 FastAPI快速入门
前端·react.js·fastapi
浪裡遊4 小时前
Typescript中的对象类型
开发语言·前端·javascript·vue.js·typescript·ecmascript