1. 程式人生 > >react context toggleButton demo

react context toggleButton demo

//toggleButton demo:

//code:

//1.Appb.js:

import React from 'react';
import {ThemeContext, themes} from './theme-context';
import ThemeTogglerButton from './theme-toggler-button';

class Appb extends React.Component {
  constructor(props) {
    super(props);

    this.toggleTheme = () => {
      
this.setState(state => ({ theme: state.theme === themes.dark ? themes.light : themes.dark, })); }; // State 包含了 updater 函式 所以它可以傳遞給底層的 context Provider this.state = { theme: themes.light, toggleTheme: this.toggleTheme, }; } render() {
// 入口 state 傳遞給 provider return ( <ThemeContext.Provider value={this.state}> <Content /> </ThemeContext.Provider> ); } } function Content() { return ( <div> <ThemeTogglerButton /> </div> ); } export default Appb

 

//2.theme-toggler-button.js:
import {ThemeContext} from './theme-context';
import React from 'react';

function ThemeTogglerButton() {
  // Theme Toggler 按鈕不僅接收 theme 屬性
  // 也接收了一個來自 context 的 toggleTheme 函式
  return (
    <ThemeContext.Consumer>
      {({theme, toggleTheme}) => (
        <button
          onClick={toggleTheme}
          style={{backgroundColor: theme.background}}>
          Toggle Theme
        </button>
      )}
    </ThemeContext.Consumer>
  );
}

export default ThemeTogglerButton;

 

//3.theme-context.js:
// 確保預設值按型別傳遞
// createContext() 匹配的屬性是 Consumers 所期望的
import React from 'react';
export const themes = {
  light: {
    foreground: '#ffffff',
    background: '#222222',
  },
  dark: {
    foreground: '#000000',
    background: '#eeeeee',
  },
};
export const ThemeContext = React.createContext({
  theme: themes.dark,
  toggleTheme: () => {},
});