react中实现全局状态共享---学习笔记

目录复制

1. redux概括

主要用处

  • provider内的组件状态全局共享
  • 跨组件传值,改变值

主要组成

  • store 储存数据源
  • reducer 负责将通过不同行为改变状态
  • action 行为 一般由行为类型+新状态
  • dispatch 派遣(调用)reducer的方法

1.1 redux、react-redux使用

git项目 链接: 类组件与函数组件中redux的基本使用.

2. Hook实现全局状态共享(Hook+ts)

  • 创建一个全局上下文(相当于store)
interface IglobalContext {
 value: any;
 dispatch?: (action: { type: actionType; value?: number }) => void;
}
const globalContext = createContext<IglobalContext>({ value: 0 });
  • 创建 reducer (并自定义Hook返回)
const useGlobal = () => {
  const reducers = (
    state: any,
    action: { type: actionType; value?: number },
  ) => {
    switch (action.type) {
      case actionTypeEnum.ADD:
        return {
          ...state,
          number: state.number + action.value,
        };
      case actionTypeEnum.SUB:
        return {
          ...state,
          number: state.number - (action.value ?? 0),
        };
      case actionTypeEnum.INV:
        return {
          ...state,
          number: Math.pow(state.number, 2),
        };
      case actionTypeEnum.EMPTY:
        return {
          ...state,
          number: 0,
        };
      default:
        return state;
    }
  };
  const [state, dispatch] = useReducer(reducers, { number: 0 });
  const { number } = state;
  return { number, dispatch };
};
  • Provider全局 包裹使用上下文
  // 调用自定义Hook
  const { number, dispatch } = useGlobal();
  <globalContext.Provider value={{ value: number, dispatch }}>
      <Foo />
      <Foo2 />
    </globalContext.Provider>
  • 其中 actionType
type actionType = 'add' | 'sub' | 'inv' | 'empty'; //加|减|乘方|清空
enum actionTypeEnum {
  ADD = 'add',
  SUB = 'sub',
  INV = 'inv',
  EMPTY = 'empty',
}
  • 组件1中使用
interface IFooProps {}
const Foo: FC<IFooProps> = () => {
  const { value, dispatch } = useContext(globalContext);
  return (
    <div>
      <h1> 组件1 共享全局值 : {value}</h1>
      <div>
        <Radio.Group>
          <Radio.Button
            value="add"
            onClick={() => {
              dispatch?.({ type: 'add', value: 1 });
            }}
          ></Radio.Button>
          <Radio.Button
            value="sub"
            onClick={() => {
              dispatch?.({ type: 'sub', value: 1 });
            }}
          ></Radio.Button>
          <Radio.Button
            value="inv"
            onClick={() => {
              dispatch?.({ type: 'inv', value: 1 });
            }}
          >
            乘方
          </Radio.Button>
          <Radio.Button
            value="empty"
            onClick={() => {
              dispatch?.({ type: 'empty' });
            }}
          >
            清零
          </Radio.Button>
        </Radio.Group>
      </div>
    </div>
  );
};
  • 组件2 使用
const Foo2: FC<IFooProps> = () => {
  const { value } = useContext(globalContext);
  return <h1 style={{ marginTop: '20px' }}>组件2 共享全局值: {value}</h1>;
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值