react 中 Context 的用法

news/2024/7/15 18:11:01 标签: react.js, javascript, 前端
  1. 用法1

    import React,{ Component, createContext } from "react";
    
    //得到一个context 对象
    // const Context = createContext()
    const { Provider, Consumer } = createContext()
    
    export default class Father extends Component {
        constructor() {
            super()
            this.state = {
                msg: '字符串',
                number: 10
            }
        }
    
        //修改msg
        changeMsg = ()=> {
            this.setState({
                msg:'修改后的字符'
            })
        }
    
        render() {
    
            let val = {
                msg: this.state.msg,
                number: this.state.number,
                changeMsg:this.changeMsg
            }
    
            return (
    
                //value属性 就放你要共享出去的数据
                <Provider value={val}>
                    <div>
                        <p>Father 组件</p>
                        <Child1></Child1>
                    </div>
                </Provider>
    
            )
        }
    }
    
    
    class Child1 extends Component {
        render() {
            return (
                <div>
                    <p>Child1组件</p>
                    <Child2></Child2>
                </div>
            )
        }
    
    }
    
    
    class Child2 extends Component {
        render() {
            return (
    
                // 使用数据
                <Consumer>
                    {(value) => {
                        return(
                            <div>
                                <p>Child2组件</p>
                                <h2>//使用数据</h2>
                                <p>共享出来的数据msg:{value.msg}</p>
                                <p>共享出来的数据num:{value.number}</p>
                                {/* ()=> {value.changeMsg()} 写成箭头函数 可以传参 */}
                                <button onClick={()=> {value.changeMsg()}}>修改父组件数据</button>
                            </div>
                        )
    
                    }}
                </Consumer>
    
            )
        }
    
    }
    
  2. 用法2

     import React, { Component, createContext } from "react";
    
    //得到一个context 对象
    const Context = createContext()
    
    export default class Father extends Component {
        constructor() {
            super()
            this.state = {
                msg: '字符串',
                number: 10
            }
        }
    
        //修改msg
        changeMsg = () => {
            this.setState({
                msg: '第二种方法修改'
            })
        }
    
        render() {
    
            let val = {
                msg: this.state.msg,
                number: this.state.number,
                changeMsg: this.changeMsg
            }
    
            return (
    
                //value属性 就放你要共享出去的数据
                <Context.Provider value={val}>
                    <div>
                        <p>Father 组件</p>
                        <Child1></Child1>
                    </div>
                </Context.Provider>
    
            )
        }
    }
    
    class Child1 extends Component {
        render() {
            return (
                <div>
                    <p>Child1组件</p>
                    <Child2></Child2>
                </div>
            )
        }
    
    }
    
    class Child2 extends Component {
        render() {
            return (
                <div>
                    <p>Child2组件</p>
                    <h2>//使用数据</h2>
                    <p>共享出来的数据msg:{this.context.msg}</p>
                    <p>共享出来的数据num:{this.context.number}</p>
                    {/* ()=> {value.changeMsg()} 写成箭头函数 可以传参 */}
                    <button onClick={() => { this.context.changeMsg() }}>修改父组件数据</button>
                </div>
    
            )
        }
    
    }
    
    //contextType react里面自带的
    Child2.contextType = Context
    
  3. 用法3

    // 函数式组件
    import { Component, createContext, useState, useEffect,useContext } from "react";
    
    //得到一个context 对象
    const MyContext = createContext();
    
    
    const Father = () => {
        //const [msg,serMsg] = useState(); 的完整写法
        // const a = useState();
        // const msg = a[0];
        // const serMsg = a[1];
    
        //以上可以简写为以下 写法
        const [msg, setMsg] = useState('我是父元素的数据');     //结构 赋值
        const [num, SetNum] = useState('我是父组件的数据');
        const changeMsg = () => {
            setMsg('新的数据')
        }
    
        const val = {
            msg,
            num,
            changeMsg,
        }
    
        return (
            //value属性 就放你要共享出去的数据
            <MyContext.Provider value={val}>
                <div>
                    <p>Father 组件</p>
                    <Child1></Child1>
                </div>
            </MyContext.Provider>
        )
    }
    
    
    const Child1 = () => {
        return (
            <div>
                <p>Child1组件</p>
                <Child2></Child2>
            </div>
        )
    }
    
    const Child2 = () => {
        const value = useContext(MyContext);
        return (
            <div>
                <p>Child2组件</p>
                <h2>//使用数据</h2>
                <p>共享出来的数据msg:{value.msg}</p>
                <p>共享出来的数据num:{value.number}</p>
                {/* ()=> {value.changeMsg()} 写成箭头函数 可以传参 */}
                <button onClick={() => { value.changeMsg() }}>修改父组件数据</button>
            </div>
        )
    }
    
    export default Father
    

http://www.niftyadmin.cn/n/201904.html

相关文章

【系统集成项目管理工程师】信息系统集成专业知识

# 信息系统 1、✨ 信息系统概念 信息系统就是输入数据&#xff0c;通过加工处理&#xff0c;产生信息的系统面向管理是信息系统的显著特点以计算机为基础的信息系统可以定义为: 结合管理理论和方法&#xff0c;应用信息技术解决管理问题&#xff0c;为管理决策提供支持的系统…

LeetCode_二叉搜索树_中等_236.二叉搜索树的最近公共祖先

目录1.题目2.思路3.代码实现&#xff08;Java&#xff09;1.题目 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 …

Apache Pulsar的Connector连接器使用

目录1. 背景2. 介绍3. Pulsar Flink Connector3.1 Flink读取Pulsar消息3.1 Flink发送消息到Pulsar1. 背景 虽然可以使用produce和consume的API进行消息的发送和消费&#xff0c;但Pulsar提供了一种更简便的方式&#xff0c;用来同步其它系统的数据到Pulsar的topic&#xff0c;…

RabbitMQ 基础篇 | 黑马

目录 一、RabbitMQ简介 1、AMQP 2、基本概念 3、工作模式 4、JMS 5、小结 二、快速入门 简单模式 生产者 消费者 三、工作模式 1、Work queues 工作队列模式 2、Pub/Sub 订阅模式 3、Routing 路由模式 4、Topics 通配符模式 四、SpringBoot整合RabbitMQ 1、生产…

yaml学习

yaml支持的三种数据结构 对象&#xff1a;即键值对的集合&#xff0c;又称为映射mapping/哈希hashes/字典dictionary key: child-key:value child-key2:value2 {"key":{"child-key":"value,"child-key2":"value2"}}数…

PHP医院安全(不良)事件管理系统源码,十多种不良事件类型,上百种报告内容数据表

医院不良事件上报系统源码&#xff0c;PHP医院安全&#xff08;不良&#xff09;事件管理系统源码 技术架构&#xff1a;前后端分离&#xff0c;仓储模式&#xff0c; 开发语言&#xff1a;PHP 开发工具&#xff1a;vscode 前端框架&#xff1a;vue2element 后端框架&…

实战!项目管理实施过程的五大难点和痛点

作为一个在项目摸爬滚打十余年的管理人员&#xff0c;对项目管理的难点和痛点深有体会&#xff0c;这就结合我自身体验来说一说。 我认为&#xff0c;项目管理实施中的难点和痛点其实可以归结为两类&#xff1a;一类是对于项目任务本身&#xff0c;另一类则涉及到团队内部的管…

java使用poi解析word表格,把数据入库

77、java解析word表格&#xff0c;把数据入库 使用poi来解析word内容/*** 解析word doc 实测可以** param file* return* author LZH* date 2023/3/24 15:50:06* version 1.0*/ public Result<?> analysisWord(MultipartFile file, HttpServletRequest request) thro…