• 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
    
  • 相关阅读:
    java中float内存存储原理
    java生产者消费者模式代码示例
    数据库死锁解决方案
    eclipse插件FindBugs使用笔记
    cmd查看环境变量
    springsECURITYDemo依赖
    2.27上课使用页面
    激活idea
    麻蛋 居然在jdk 问题上弱智
    Erek
  • 原文地址:https://www.cnblogs.com/csnd/p/12061870.html
Copyright © 2020-2023  润新知