当前位置: 首页 > Web前端 > JavaScript

reacthookreduxuseReduceruseContext实现redux可以从外部js访问

时间:2023-03-27 17:35:34 JavaScript

创建主文件根目录src创建reducer文件夹文件夹创建useDataX.js文件//useDataX.jsimport{createContext,useContext,useReducer}from"react";//?抛出,创建context上下文,可以访问(通过DataContext.provider的值)exportconstDataContext=createContext({});//?定义初始值(创建useReducer使用)constcreatData={loading:false}//?throw,方法可以在普通js中访问exportfunctiondispatchRef(value){return{current:value};}//?Value(改变creatData之后),action:改变了value(dispatch的值)functionreducer(state,action){if(action.type==='loading'){letstateClone={...state}//深拷贝这里需要,可以使用JSON.parse(JSON.stringify(state))转换stateClone.loading=action.valuereturnstateClone}}//?抛出,可以在DataContext导出函数useData(){const{Xdata}=useContext(DataContext);中获取值returnXdata;};//main函数(可以包裹根组件)exportfunctionGlobalLoadingProvider(props){//todouseReducer接受一个reducer函数作为参数,reducer接受两个参数一个是另一个state是action//todo然后返回一个statecount和dispath,count是返回状态中的值,dispatch是可以释放更新状态的事件。//?修改dispath后更新dataArr!const[dataArr,dispatch]=useReducer(reducer,creatData);//?在普通js中访问dispatchRef.current=dispatch;return({props.children});}使用index.js主入口文件添加包标签//index.jsimportReactfrom"react";importReactDOMfrom"react-dom";import"./index.css";importAppfrom"./App.jsx";//importreportWebVitalsfrom'./reportWebVitals';从"./reducer/useDataX"导入{GlobalLoadingProvider};ReactDOM.render(;从“./reducer/useDataX”获取数据import{useData};functionTest(){const{loading}=useData();return

{loading}
;}exportdefaultTest;修改组件中的数据importReact,{useContext}from"react";import{DataContext}from"./reducer/useDataX";functionTest(){const{dispatch}=useContext(DataContext);return(
{dispatch({type:"loading",value:true});}}>Loading
);}exportdefault测试;普通js修改数据import{dispatchRef}from"../reducer/useDataX";dispatchRef.current({type:'loading',value:true});这是这里结束的结束。引用的时候要注意路径是否正确。现在主要的文件都写在一起了。业务逻辑复杂后,可以做一些封装。