zoukankan      html  css  js  c++  java
  • React-Context

    在一个典型的 React 应用中,数据是通过 props 属性自上而下(由父及子)进行传递的,但这种做法对于某些类型的属性而言是极其繁琐的,这些属性是应用程序中许多组件都需要的。Context 提供了一种在组件之间共享此类值的方式,而不必显式地通过组件树的逐层传递 props。
    把参数传递到组件树的底层。
    <div id="root" ></div>
    <script type="text/babel">
    class App extends React.Component {
      render() {
        return <Toolbar theme="dark" />;
      }
    }
    function Toolbar(props) {
      // Toolbar 组件接受一个额外的“theme”属性,然后传递给 ThemedButton 组件。
      // 如果应用中每一个单独的按钮都需要知道 theme 的值,这会是件很麻烦的事,
      // 因为必须将这个值层层传递所有组件。
      return (
        <div>
          <ThemedButton theme={props.theme} />
        </div>
      );
    }
    class ThemedButton extends React.Component {
      render() {
        return <button>theme:{this.props.theme}</button>
      }
    }
     
        ReactDOM.render(
            <App />,
            document.getElementById('root')
        );
    </script>
    
    使用 context, 我们可以避免通过中间元素传递 props
    
    <script type="text/babel">
    // Context 可以让我们无须明确地传遍每一个组件,就能将值深入传递进组件树。
    // 为当前的 theme 创建一个 context(“light”为默认值)。
    const ThemeContext = React.createContext('light');
    class App extends React.Component {
      render() {
        // 使用一个 Provider 来将当前的 theme 传递给以下的组件树。
        // 无论多深,任何组件都能读取这个值。
        // 在这个例子中,我们将 “dark” 作为当前的值传递下去。
        return (
          <ThemeContext.Provider value="dark">
            <Toolbar />
          </ThemeContext.Provider>
        );
      }
    }
    // 中间的组件再也不必指明往下传递 theme 了。
    function Toolbar(props) {
      return (
        <div>
          <ThemedButton />
        </div>
      );
    }
    class ThemedButton extends React.Component {
      // 指定 contextType 读取当前的 theme context。
      // React 会往上找到最近的 theme Provider,然后使用它的值。
      // 在这个例子中,当前的 theme 值为 “dark”。
      // static contextType = ThemeContext;
      render() {
        return (
        <ThemeContext.Consumer>
            {
              x => <h1>BatteryX : {x}</h1>
            }
          </ThemeContext.Consumer>
        );
      }
    }
    
    ReactDOM.render(
        <App />,
        document.getElementById('root')
    );
    
    </script>
    
    相关API:
    
    React.createContext
    const ThemeContext = React.createContext('defaultValue');
    创建一个 Context 对象。当 React 渲染一个订阅了这个 Context 对象的组件,这个组件会从组件树中离自身最近的那个匹配的 Provider 中读取到当前的 context 值。只有当组件所处的树中没有匹配到 Provider 时,其 defaultValue 参数才会生效。这有助于在不使用 Provider 包装组件的情况下对组件进行测试。注意:将 undefined 传递给 Provider 时,消费组件的 defaultValue 不会生效。
    
    Context.Provider
    <MyContext.Provider value={/* 某个值 */}>
    每个 Context 对象都会返回一个 Provider React 组件,它允许消费组件订阅 context 的变化。Provider 接收一个 value属性,传递给消费组件。一个 Provider 可以和多个消费组件有对应关系。多个 Provider 也可以嵌套使用,里层的会覆盖外层的数据。当 Provider 的value值发生变化时,它内部的所有消费组件都会重新渲染。Provider 及其内部 consumer 组件都不受制于shouldComponentUpdate函数,因此当 consumer 组件在其祖先组件退出更新的情况下也能更新。
    
    Context.Consumer
    <MyContext.Consumer>
    {value => /* 基于 context 值进行渲染*/}
    </MyContext.Consumer>
    这里,React 组件也可以订阅到 context 变更。这能让你在函数式组件中完成订阅 context。
    这需要函数作为子元素(function as a child)这种做法。这个函数接收当前的 context 值,返回一个 React 节点。传递给函数的value值等同于往上组件树离这个 context 最近的 Provider 提供的value值。如果没有对应的 Provider,value参数等同于传递给createContext() 的 defaultValue。
    更详细的文档
    https://react-1251415695.cos-website.ap-chengdu.myqcloud.com/docs/context.html
    
  • 相关阅读:
    POJ 1141 括号匹配 DP
    881. Boats to Save People
    870. Advantage Shuffle
    874. Walking Robot Simulation
    文件操作
    861. Score After Flipping Matrix
    860. Lemonade Change
    842. Split Array into Fibonacci Sequence
    765. Couples Holding Hands
    763. Partition Labels
  • 原文地址:https://www.cnblogs.com/csnd/p/12061870.html
Copyright © 2011-2022 走看看