超小型react 全局状态管理demo,不用下载插件,方便好用,可统一管理全局状态,可读取,修改

使用场景:

提示:自己瞎琢磨有用就用,没用勿喷

react管理全局状态管理小demo,可统一管理全局参数,方便后期维护,利于代码的读取;
不用下载插件真的很方便,仅需一丢丢代码


这里是demo代码

提示:这里是userData-unitls.tsx

//引入必要Hook
import React, { createContext, useState, useContext, useEffect, useMemo } from 'react';
//这个是外部定义的数据类型
import { UserDataType } from "./fromDataType";
//这个是默认数据大家随意
const UserData = {
	bossName:'小桂子',
	bossSex:'未知',
	user:[
		{
			name:'老王',
			sex:'难'
		}
	]
};
//这个是ts的类型校验不用就删掉<{ userData: UserDataType; setData: React.Dispatch<React.SetStateAction<UserDataType>> }>
// 创建一个 Context 对象
export const AllUserData = createContext<{ userData: UserDataType; setData: React.Dispatch<React.SetStateAction<UserDataType>> }>({
  userData: UserData,
  setData: () => { },
});
// 创建一个 Context Provider 组件,用于提供共享数据
export const AllUserDataProvider: React.FC = ({ children }) => {
  // 定义共享数据的初始值
  const [userData, setData] = useState<UserDataType>(UserData);
  // 使用 useMemo 包裹 contextValue; ps:这个是用来检查接收到的值是否有修改
  const contextValue = useMemo(() => ({
    userData,
    setData,
  }), [userData]);
  // ps:这个是加载组件的时候执行的一个Hook,也可以用来监听数据变化,详情可以查看文档
  useEffect(() => {
    try {
      setData({...userData,bossName:'小六子',bossSex:'暂定为男'})
      console.log('这里可以在demo第一次加载时添加一些数据给userData');
    } catch (e) {
      console.log('出错了');
    }
  }, [])
  //ps:这里不用动写的是useMemo的名字如果没加useMemo就改成:{/* <AllUserData.Provider value={{ userData, setData }}> */}
  return (
    <AllUserData.Provider value={contextValue}>
      {children}
    </AllUserData.Provider>
  );
}
//导出方法ps: 与外部沟通的桥梁使用时要用
export function useAppContext() {
  return useContext(AllUserData);
}

接下来是使用方法

//组件内引入需要的Hook
import React, { useState, useEffect } from "react";
// 使用一个Input组件示范效果
import { Input } from "@alifd/next";
//这个是引入刚才的demo
import { useAppContext } from "../userData-unitls"

function InputsComStr(){
  //!!!!!从useAppContext()内取出demo内的userData(全局数据)和setData(修改全局数据的方法)
  const { userData, setData } = useAppContext();
  //这个是change方法
  const dxchan = (e: string | number) => {
  	  //这里是给全局状态做修改
      setData({...userData,bossName:e})
  };
  return <div className="InputDiv">
    <Input className="w100"
      placeholder="输入boss姓名" 
      aria-label="Medium" 
      defaultValue={userData.bossName}
      value={userData.bossName}
      onChange={(e:string)=>dxchan(e)}/>
      <h3>Boss的名字是:{userData.bossName}</h3>
  </div>
}
export default InputsComStr;
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值