17 初探Context的使用场景

context

  • 容器(即上下文) → 装数据 → 可以传递到程序的多个地方
  • 程序在执行时可访问的容器

import styles from ...则css要写module.css,否则无效果;
import from ...则css无须写module. ,否则无效果

使用

  • context.js
export const ThemeContext = React.createContext('red') // 这个是默认值
  • main.jsx
import BottomNav from './BottomNav/index'
import Header from './Header/index'
import BtnGroup from './BtnGroup/index'
import { ThemeContext } from './context'
class Main extends React.Component {
    state = {
        navData: [
            '第①',
            '第②',
            '第③',
            '第④',
        ],
        theme: 'black'
    }
    changeTheme = (theme) => {
        this.setState({
            theme
        })
    }
    render() {
        return (
            <ThemeContext.Provider value={this.state.theme}>
                <div style={{ display: 'flex', flexDirection: 'column', height: '100%' }}>
                    <Header>标题</Header>
                    <BtnGroup changeTheme={this.changeTheme} />
                    <BottomNav
                        data={this.state.navData}
                    ></BottomNav>
                </div>
            </ThemeContext.Provider>
        )
    }
}
export default Main
  • Header组件
import './index.css'
import { ThemeContext } from '../context'

class Header extends React.Component {
    render() {
        return (
            <ThemeContext.Consumer>
                {
                    (theme) => {
                        console.log('theme', theme);
                        return (
                            < header className={'title ' + `header-${theme}`} >
                                {this.props.children}
                            </header>
                        )
                    }
                }
            </ThemeContext.Consumer >
        )
    }
}
export default Header
  • BtnGroup组件
// 注意方法的绑定
import './index.css'
class BottomNav extends React.Component {
    render() {
        return (
            < div style={{ display: 'flex', justifyContent: 'space-around', flex: 1, paddingTop: '44px' }}
            >
                <button onClick={() => this.props.changeTheme('black')}>Black</button>
                <button onClick={() => this.props.changeTheme('orange')}>Orange</button>
                <button onClick={() => this.props.changeTheme('purple')}>Purple</button>
                <button onClick={() => this.props.changeTheme('red')}>Red</button>
            </div>
        )
    }
}
export default BottomNav

总结

① 提供: export const ThemeContext = React.createContext(‘red’)
② Provide组件包裹组件树、传递value:<ThemeContext.Provider value={this.state.theme}></<ThemeContext.Provider>
③ Consumer使用theme(jsx + 回调函数参数为theme)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值