前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >React-跨组件通讯-context

React-跨组件通讯-context

原创
作者头像
杨不易呀
发布2023-09-30 14:35:54
2000
发布2023-09-30 14:35:54
举报
文章被收录于专栏:杨不易呀

在之前的通讯代码当中,发现一个问题,如果传递数据层次太深, 一层一层的传递比较麻烦, 所以 React 也提供了其它的解决方案:

  • 通过 context 上下文传递
  • 通过 Redux 传递 (相当于 Vuex)
  • 通过 Hooks 传递 (相当牛X)

通过 context 上下文传递数据

调用创建上下文的方法, 只要我们调用了创建上下文的方法, 这个方法就会给我们返回两个容器组件,生产者容器组件(Provider) / 消费者容器组件(Consumer),只要拿到了这两个容器组件, 那么我们就可以通过这两个容器组件从祖先传递数据给所有的后代了,首先在祖先组件中利用 '生产者容器组件' 包裹后代组件,然后在后代组件中利用 '消费者容器组件' 获取祖先组件传递过来的数据即可,接下来就是代码实现案例。

  1. 创建一个上下文对象
代码语言:javascript
复制
const AppContext = React.createContext({});
  1. 从上下文对象中获取容器组件
    1. Provider: 生产者容器组件, 专门用于负责生产数据
    2. Consumer: 消费者容器组件, 专门用于消费生产者容器组件生产的数据的
    3. 容器组件: 专门用于包裹其它组件的组件, 我们就称之为容器组件
代码语言:javascript
复制
const {Provider, Consumer} = AppContext;

我们可以在生产者容器组件中通过 value 来生产数据:

代码语言:javascript
复制
import React from 'react';
import './App.css';

const AppContext = React.createContext({});
const {Provider, Consumer} = AppContext;
class Son extends React.Component {
    render() {
        return (
            <Consumer>
                {
                    (value) => {
                        return (
                            <div>
                                <p>{value.name}</p>
                                <p>{value.age}</p>
                            </div>
                        )
                    }
                }
            </Consumer>
        );
    }
}

class Father extends React.Component {
    render() {
        return (
            <div>
                <Son/>
            </div>
        );
    }
}

class App extends React.Component {
    render() {
        return (
            <Provider value={{name: 'yangbuyiya', age: 18}}>
                <Father/>
            </Provider>
        )
    }
}

export default App;
image-20220413201718507
image-20220413201718507

第二种方式传递数据

也是利用 context 上下文进行传递,只不过使用的方式不同,我不知道你们有没有发现在创建上下文对象的时候,当中有一个参数,那么第二种方式就是在于这个参数当中,将我们需要传递的数据写在这个参数当中,然后我们在需要使用的组件利用 组件.contextType = 上下文对象, 然后在使用的组件当中直接使用 this.context.数据 这样即可进行使用。

代码语言:javascript
复制
import React from 'react';
import './App.css';

const AppContext = React.createContext({
    name: 'yangbuyiya',
    age: 18
});

class Son extends React.Component {
    render() {
        return (
            <div>
                <p>{this.context.name}</p>
                <p>{this.context.age}</p>
            </div>
        )
    }
}

Son.contextType = AppContext;

class Father extends React.Component {
    render() {
        return (
            <div>
                <Son/>
            </div>
        );
    }
}

class App extends React.Component {
    render() {
        return (
            <div>
                <Father/>
            </div>
        )
    }
}

export default App;

多个生产者与多个消费者

在这种模式下,是无法使用我们的第二种方式进行消费数据的,因为 contextType 是一个属性,后面编写的会覆盖前面的,所以使用不了,那么就来看一个多个生产者与多个消费者的用法吧:

代码语言:javascript
复制
import React from 'react';
import './App.css';

// 创建上下文对象
const AppContext1 = React.createContext({});
const AppContext2 = React.createContext({});

class Son extends React.Component {
    render() {
        return (
            <AppContext1.Consumer>
                {
                    (value1) => {
                        return (
                            <AppContext2.Consumer>
                                {
                                    (value2) => {
                                        return (
                                            <div>
                                                <p>{value1.name}</p>
                                                <p>{value2.age}</p>
                                            </div>
                                        )
                                    }
                                }
                            </AppContext2.Consumer>
                        )
                    }
                }
            </AppContext1.Consumer>
        )
    }
}

class Father extends React.Component {
    render() {
        return (
            <div>
                <Son/>
            </div>
        );
    }
}

class App extends React.Component {
    render() {
        return (
            // 生产者1
            <AppContext1.Provider value={{name: 'BNTang666'}}>

                {/*
                生产者2
                */}
                <AppContext2.Provider value={{age: 18}}>
                    <Father/>
                </AppContext2.Provider>
            </AppContext1.Provider>
        )
    }
}

export default App;
输入图片说明
输入图片说明

最后

本期结束咱们下次再见👋~

🌊 关注我不迷路,如果本篇文章对你有所帮助,或者你有什么疑问,欢迎在评论区留言,我一般看到都会回复的。大家点赞支持一下哟~ 💗

我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表

输入图片说明
输入图片说明

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 通过 context 上下文传递数据
  • 第二种方式传递数据
  • 多个生产者与多个消费者
  • 最后
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档