美文网首页
React Context

React Context

作者: Petricor | 来源:发表于2023-04-21 16:23 被阅读0次

    前言:React Context是什么?

    • 原因:传统的react组件,父组件向子组件进行传参,子组件通过props进行接收,再往复循环传递给更深层 次的子组件,这样是比较臃肿和麻烦的,所有有了 React Context
    • Context 通过组件树提供了一个传递数据的方法,从而避免了在每一个层级手动的传递 props 属性
    示意图

    1.0 在类组件中使用Context

    • 在类组件中我们需要通过 React.createContext来进行新建一个content ,在父组件中通过 Provider(发布者)的value属性进行参数设置 。
    • 在需要用更深次子组件中通过 Consumer(消费者) 获取到value上的值,从而达到跨组件传参的目的 。


      效果图

    1.1 在parment.jsx 父组件中创建 Context

    import React from 'react';
    import Child from './child.jsx'
    
    export const UserContext = React.createContext(); //创建Context 定义为“UserContext ”,并且输出
    
    
    
    1.1.1 在parment.jsx 引入需要传参的组件,并且挂载 contextType
    import React from 'react';
    import Child from './child.jsx'
    import GrandChild from './grandChild.jsx'
    
    export const UserContext = React.createContext(); //创建Context 定义为“UserContext ”,并且输出
    
    GrandChild .contextType = UserContext;   //需要传参的组件 
    
    
    1.1.2 在parment.jsx 通过 Provider(发布者)value 属性传递参数
    import React from 'react';
    import Child from './child.jsx'
    import GrandChild from './grandChild.jsx'
    
    export const UserContext = React.createContext(); //创建Context 定义为“UserContext ”,并且输出
    
    GrandChild .contextType = UserContext;   //需要传参的组件 
    //父组件
    export default class Parment extends React.Component {
        static contextType
        render() {
            //2, Context.Provider 标签注释掉,则传入默认的 
            return (
                <div>
                    <UserContext.Provider value={{ userName: "zhangsang" }}>
                        <Child />
                    </UserContext.Provider>
                </div>
            );
        }
    }
    

    1.2 在child.jsx 组建中正常引用 grandChild.jsx 组件

    import React from 'react';
    import GrandChild from './grandChild.js'  //引入组件
    
    //用户信息 - 二级页面
    export default class Child extends React.Component {
        render() {
            return (<GrandChild />);
        }
    }
    

    1.3.0 引入在parment.jsx 中定义的 context

    import React from 'react';
    import  { UserContext } from './parment.jsx'
    
    1.3.1 通过Consumer(消费者)来获取传输的参数
    import React from 'react';
    import  { UserContext } from './parment.jsx'
    
    class GrandChild extends React.Component {
        render() {
            // console.log(this.context, '===userBaseInfo');
            return (
                <div>
                    用户名:{this.context.userName}
                    <br />
                    <UserContext.Consumer>
                        {(value) => {
                            return (<span>{value.userName}</span>);
                        }}
                    </UserContext.Consumer>
                </div>
            );
        }
    }
    
    export default  GrandChild 
    

    注: 如果想要在Consumer外使用参数,需要用this.context 进行获取

    2.0 在hook 中使用Context

    • 在hook组件中也是需要用React.createContext来进行新建一个content, 在父组件中通过 Provider(发布者)的value属性进行参数设置
    • 但是, 可以通过内置的hook方法 useContext 来进行获取value上的值。


      样式图
    2.1 在parment.jsx 父组件中创建 Context并且挂载传递参数
    import React from 'react';
    import Child from './child'
    
    export const hookContext = React.createContext()
    
    export default function UContext() {
        return (
          <div>
            // 当Provider 标签不在的时候,会渲染默认值
            <ThemeContext.Provider value={{ userName: "zhangsang" }}>
                <Child  />
            </ThemeContext.Provider>
          </div>
        );
    }
    
    
    2.2 在child.jsx 组建中正常引用 grandChild.jsx 组件
    import React from 'react';
    import GrandChild from './grandChild'
    
    export default function Toolbar() {
        return (
            <div>
                <GrandChild />
            </div>
        );
    }
    
    2.3.0 引入在parment.jsx 中定义的 context 和useContext
    import React, { useContext } from 'react';
    import { hookContext } from './parment.jsx'
    
    
    2.3.1 获取和使用参数
    import React, { useContext } from 'react';
    import { hookContext } from './parment.jsx'
    
    export default function GrandChild() {
        const  value  = useContext(hookContext);
        return (
           <span>{value.userName}</span>
        );
    }
    

    结语

    • 正是因为默认语言的可配置性,可以将系统设置成多语言系统
    • 希望各位朋友能精通React ,这里有react 的 demo ,望多指教 。
      码云地址:react-question-v6
      码云地址 :react-question-vite

    相关文章

      网友评论

          本文标题:React Context

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