React.createContext 用法

1,582 阅读1分钟

首先需要了解Context几个语法

React.createContext(默认值)创建一个context容器,里面保存着默认值 Provider是一个生产者就是分享值的标签吧,defaultValue意思是要给标签内部引用组件传的值Consumer是一个消费者可以理解为接受Provider传下来的值,用法如下

<Consumer>{(value)=>{//此时的value是Provide标签里面value的值}} 在此箭头函数中就可以使用参数value

以下是两种方法实现一种功能,就是子组件和孙组件不需要一层一层props传递直接使用组件树上的属性

第一种方法

父组件

import Son from "./components/Test/Son";
 
let name ="谱谱"
export const testContext = React.createContext(name);
 
const App: React.FC = (props) => {
    return (
        <div className={styles.app}>
            <testContext.Provider value={"dsadsa"}>
                <div style={{border:'1px solid red',width:'30%',margin:'50px 
auto',textAlign:'center'}}>
                    <p>父组件定义的值:{name}</p>
                    <Son />
                </div>
            </testContext.Provider>  
        </div>  
    )
}

子组件

import React, {useContext} from 'react';
import Grandson from './GrandSon'
import {testContext} from '../../App'
 
function Son() {
    const value = useContext(testContext)
    return (
        <div style={{border: '1px solid blue', width: '60%', margin: '20px auto', textAlign: 'center'}}>
            <p>子组件。获取父组件的值:{value}</p>
            <Grandson/>
        </div>
    );
}
 
export default Son;

孙组件

import React, {useContext} from 'react';
import {testContext} from '../../App'
 
function GrandSon() {
    const value = useContext(testContext)
    return (
        <div style={{border: '1px solid green', width: '60%', margin: '50px auto', textAlign: 'center'}}>
            <p>孙组件。获取传递下来的值:{value}</p>
        </div>
    );
}
 
export default GrandSon;

上述代码输出结果是,父组件name是谱谱,子组件和孙组件的name值都是dsadsa

第二种方法

父组件

import Son from "./components/Test/Son";
let name ="谱谱"
export const {Provider,Consumer} = React.createContext(name);
 
const App: React.FC = (props) => {
    return (
        <div className={styles.app}>
            <Provider value={name}>
                <div style={{border:'1px solid red',width:'30%',margin:'50px auto',textAlign:'center'}}>
                    <p>父组件定义的值:{name}</p>
                    <Son />
                </div>
            </Provider>            
        </div>
    );
}

子组件

import React from 'react';
import {Consumer} from '../../App'
import Grandson from './GrandSon'
 
function Son() {
    return (
        //Consumer容器,可以拿到上文传递下来的name属性,并可以展示对应的值
        <Consumer>
            {( name ) =>
                <div style={{ border: '1px solid blue', width: '60%', margin: '20px auto', textAlign: 'center' }}>
                    <p>子组件。获取父组件的值:{name}</p>
                    {/* 孙组件内容 */}
                    <Grandson />
                </div>
            }
        </Consumer>
    );
}
 
export default Son;

孙组件

import React from 'react';
import {Consumer} from '../../App'
 
function GrandSon() {
    return (
        //Consumer容器,可以拿到上文传递下来的name属性,并可以展示对应的值
        <Consumer>
            {(name ) =>
                <div style={{border:'1px solid green',width:'60%',margin:'50px auto',textAlign:'center'}}>
                    <p>孙组件。获取传递下来的值:{name}</p>
                </div>
            }
        </Consumer>
    );
}
 
export default GrandSon;