[React] Context 基础用法

196 阅读1分钟

参考 React 官方文档

props传值示例

function Father() {
    const [color, setColor] = React.useState('black');

    return (
        <div>
            {/* 父组件将 color 变量传递给子组件 */}
            <Son color={color}/>
            <button onClick={() => setColor(color === 'black' ? 'red' : 'black')}>Toggle Color</button>
        </div>
    );
}

function Son(props) {
    // 子组件接收到 color 属性,然后传递给孙子组件,其本身用不到这个变量
    // 如果应用中每一个 GrandSon 都需要知道 color 的值,代码会变得很繁琐
    return (
        <div>
            <GrandSon1 color={props.color}/>
            <GrandSon2 color={props.color}/>
        </div>
    );
}

function GrandSon1(props) {
    return <div style={{ color: props.color }}>The first grandson likes cat.</div>
}

function GrandSon2(props) {
    return <div style={{ color: props.color }}>The second grandson likes dog.</div>
}

export default Father;

使用 Context 跨组件传值

React.createContext:创建一个 Context 对象,每个 Context 对象都会返回一个 Provider React 组件,它允许消费组件订阅 context 的变化。

Context.Provider: 接收一个 value 属性,传递给消费组件;value 值发生变化时,它内部的所有消费组件都会重新渲染。

Context.Consumer: 消费组件,基于 context 值进行渲染

// 为当前的 color 创建一个 context 变量,createContext的参数为默认值
const ColorContext = React.createContext('red');

function Father() {
    const [color, setColor] = React.useState('black');

    return (
        <div>
            <ColorContext.Provider value={color}>
                <Son/>
            </ColorContext.Provider>
            <button onClick={() => setColor(color === 'black' ? 'red' : 'black')}>Toggle Color</button>
        </div>
    );
}

function Son() {
    return (
        <div>
            <GrandSon1/>
            <GrandSon2/>
        </div>
    );
}

function GrandSon1() {
    return (
        <ColorContext.Consumer>
            {color => <div style={{ color }}>The first grandson likes cat.</div>}
        </ColorContext.Consumer>
    )
}

function GrandSon2() {
    return (
        <ColorContext.Consumer>
            {color => <div style={{ color }}>The second grandson likes dog.</div>}
        </ColorContext.Consumer>
    )
}

export default Father;

useContext 取代 Context.Consumer

function GrandSon1() {
    const color = React.useContext(ColorContext);
    return <div style={{ color }}>The first grandson likes cat.</div>
}