context 在不同类型组件的使用理解

对 react 中 context 的理解

使用 context 的大致目的:共享数据,避免数据的层层传递

类组件中的 context
  • 步骤一:创建一个 context 对象,当加载到订阅这个 context 对象的组件的时候,会自动匹配下文 provider 中的 value 值。

    const AuthContext = React.createContext(undefined);
    
  • 步骤二:创建 provider,传递给消费组件,并订阅 conetext 的变化,即 value 值的变化,可以将 响应式数据绑定给 value

    <AuthContext.Provider value={this.state.theme}>
    	<子组件 />
    </AuthContext>
    

    问题: Provider 里面 怎么添加 children

  • 步骤三:消费组件订阅 context,使用 this.context 来消费 最近的context

    static contextType = AuthContext;
    return (
    	<div>{ this.context }</div>
    )
    
函数组件中的 context
  • 步骤一:创建一个 context 对象

    const ThemeContext = React.createContext<{themeState: string} | undefined>(undefined);
    
  • 步骤二:在创建一个 provider 函数组件

    export const ThemeProvider = (props: {children: ReactNode}) => 	{
    	const [themeState, setThemeState] = useState('light');
    	useEffect(() => {
        	setTimeout(() => {
            	setThemeState('dark')
        	}, 4000);
    	}, [])
    	return (
        	<ThemeContext.Provider value={{themeState}}>
            	{ props.children }
        	</ThemeContext.Provider>
    	)
    }
    
    // 自定义一个 hooks,下文使用
    export const useAuth = () => {
    	const context = useContext(ThemeContext);
    	if(!context){
        	throw new Error()
    	}else{
        	return context
    	}
    }
    
  • 步骤三:消费组件订阅 context,有两种消费方式:一是通过 useContext 获取,另一种是通过 <ThemeContext.Consumer> 来消费

    // 先将需要消费的组件用 `provider` 包括起来
    <ThemeProvider>
    	<App />
    </ThemeProvider>
    
    // 第一种方式
    // 在app组件中,通过自定义的 useAuth 获取订阅的 context
    const { themeState } = useAuth();
    
    // 第二种方式
    // 直接在组件中消费
    <ThemeContext.Consumer>
      	{
        	(value) => value?.themeState
     	 }
    </ThemeContext.Consumer>
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值