React使用useReducer,createContext,useContext实现redux的功能

封装的共享数据组件(核心)

import React,{useReducer,createContext} from 'react';

export const prodata=createContext({})//创建共享数据

export const reducer=(state,action)=>{ //创建reducer条件
    switch (action.type){
        case 'color':
            return action.color
        default:
            return state
    }
}

export const Color=props=>{
    const [color,dispatch]=useReducer(reducer,'red')
    return (
        <prodata.Provider value={{color,dispatch}}>//使用Provider 包裹便于传递数据
            {props.children}
        </prodata.Provider>
    )
}

需要传值的组件

//app.js
import React from 'react';
import Btn from './Btn'
import Font from './Font'
import {Color} from './data'  //引入包裹组件
function App(){
    return (
        <Color>
            <Font></Font>
            <Btn></Btn>
        </Color>
    )
}
export default App 
//文字
import React,{useContext} from 'react';
import {prodata} from './data' //引入context名
function Font(){
    const {color}=useContext(prodata) //解构得到属性
    return(
        <h1 style={{color:color}}>颜色为{color}</h1>
    )
}

export default Font
//按钮
import React,{useContext} from 'react';
import {prodata} from './data'//引入context名
function Btn(){
    const {dispatch}=useContext(prodata)//解构得到dispatch方法
    return(
        <div>
            <button onClick={()=>{dispatch({type:'color',color:'green'})}}>red</button>
            <button onClick={()=>{dispatch({type:'color',color:'yellow'})}}>yellow</button >
        </div>
    )
}
export default Btn
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值