代码之家  ›  专栏  ›  技术社区  ›  Phil

在React 16.4.0中,如何使用新的上下文语法比只导出对象文本更好?

  •  1
  • Phil  · 技术社区  · 6 年前

    在React 16.4.0中,为什么要使用内置上下文组件,当您可以使用导入到需要它的人的对象文本之类的东西来完成相同的事情?

    以Facebook为例( https://reactjs.org/docs/context.html#examples ,theme-context.js文件可以直接传递对象文本,而不是使用themeContext。js代码可以读取主题上下文导出的对象文本,并将其值作为属性传递给theme-button.js。使用上下文组件似乎是不必要的。这是密码 Facebook's tutorial 以下内容:

    主题上下文.js

    export const themes = {
      light: {
        foreground: '#000000',
        background: '#eeeeee',
      },
      dark: {
        foreground: '#ffffff',
        background: '#222222',
      },
    };
    
    export const ThemeContext = React.createContext(
      themes.dark // default value
    );
    

    主题按钮.js

    import {ThemeContext} from './theme-context';
    
    function ThemedButton(props) {
      return (
        <ThemeContext.Consumer>
          {theme => (
            <button
              {...props}
              style={{backgroundColor: theme.background}}
            />
          )}
        </ThemeContext.Consumer>
      );
    }
    
    export default ThemedButton;
    

    应用程序JS

    import {ThemeContext, themes} from './theme-context';
    import ThemedButton from './themed-button';
    
    // An intermediate component that uses the ThemedButton
    function Toolbar(props) {
      return (
        <ThemedButton onClick={props.changeTheme}>
          Change Theme
        </ThemedButton>
      );
    }
    
    class App extends React.Component {
      constructor(props) {
        super(props);
        this.state = {
          theme: themes.light,
        };
    
        this.toggleTheme = () => {
          this.setState(state => ({
            theme:
              state.theme === themes.dark
                ? themes.light
                : themes.dark,
          }));
        };
      }
    
      render() {
        // The ThemedButton button inside the ThemeProvider
        // uses the theme from state while the one outside uses
        // the default dark theme
        return (
          <Page>
            <ThemeContext.Provider value={this.state.theme}>
              <Toolbar changeTheme={this.toggleTheme} />
            </ThemeContext.Provider>
            <Section>
              <ThemedButton />
            </Section>
          </Page>
        );
      }
    }
    
    ReactDOM.render(<App />, document.root);
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   Rohith Murali    6 年前

    您遗漏的一件事是,上下文中的更改将无效地通过启动一个重传器来更改在用户那里收到的值,而这个重传器无法通过导入值来实现。