首页 每日新资讯 flux context是什么,如何在React项目中正确使用

flux context是什么,如何在React项目中正确使用

作者:每日新资讯
发布时间: 浏览量:3 0

flux context基础概念解析

说到flux context,得先拆开来看,flux是Facebook提出的一种前端架构模式,核心是单向数据流,就像水流只能顺着一个方向流,数据在应用里的流动也有明确路径,context是React自带的上下文API,作用是让组件树中的数据不用一层层手动传递,直接在需要的地方取用,flux context就是把这俩捏到一起,用flux的规则管理数据,再通过context把数据共享给组件,相当于给数据搭了个“带导航的共享通道”。

我刚开始接触的时候,总把它和React Context混为一谈,后来才明白,普通React Context只管共享数据,不管数据怎么来、怎么改,就像一个没锁的仓库,谁都能进去放东西拿东西,容易乱,flux context不一样,它给这个仓库加了管理员(flux的action和reducer),所有数据变动都得通过管理员登记,拿数据也得按规矩来,这样多人协作的时候就不容易打架。

flux context工作原理详解

flux context的工作流程其实很像餐厅后厨,用户在前端操作(比如点击按钮),就像顾客点菜,会触发一个“动作”(action),这个action得说清楚要干嘛(加购物车”)和带什么数据(比如商品id),接着action会被送到“调度中心”(dispatcher),dispatcher再把任务派给“数据处理员”(reducer)。

reducer拿到action后,会根据action的类型处理数据,比如原来购物车是空的,收到“加购物车”的action,就会把商品id加到购物车里,生成新的“状态”(state),这个新状态会被存到“数据仓库”(store)里,store再通过context把最新的状态“广播”给所有需要的组件,组件拿到新状态后,就会重新渲染,更新页面。

flux context像一条有序的传送带,数据从源头出发,经过处理后准确送到需要的组件手中,每个环节都有明确分工,不会乱套。

flux context是什么,如何在React项目中正确使用

flux context使用步骤指南

我第一次在项目里用flux context时,踩了不少坑,后来总结出一套步骤,走下来就顺多了,第一步是创建context,用React.createContext()函数,括号里可以放个默认值,比如空对象,这样就算后面没Provider,组件也不会报错。

第二步是定义action类型和创建action创建函数,action类型就是给动作起个名字,ADD_ITEM”,最好用常量存起来,免得拼写错,action创建函数是个普通函数,返回一个包含type和payload(数据)的对象,比如const addItem = (id) => ({ type: ADD_ITEM, payload: id })。

第三步写reducer,reducer是个纯函数,接收当前状态和action,返回新状态,这里要注意,不能直接改原来的状态,得返回一个新对象,就像改作业不能在原卷上涂画,得拿张新纸重写,比如function reducer(state, action) { switch(action.type) { case ADD_ITEM: return { ...state, cart: [...state.cart, action.payload] } default: return state } }

第四步创建store,store里要存当前状态,还要有更新状态的方法,可以用useReducer钩子,把reducer和初始状态传进去,得到[state, dispatch],dispatch就是用来发送action的“发射器”。

第五步用Provider包装组件树,把store里的state和dispatch通过context.Provider的value属性传下去,这样子组件就能通过useContext拿到它们了,最后在组件里用const { state, dispatch } = useContext(MyContext)获取数据和dispatch,需要改数据时就调用dispatch(action)。

flux context适用场景说明

不是所有React项目都需要flux context,我觉得最适合它的是中大型应用,特别是组件层级多、共享状态频繁的场景,比如电商网站的购物车,首页、商品详情页、个人中心都要显示购物车数量,用flux context管理,改一次数据,所有地方自动更新,不用每个页面都写一遍请求和状态。

还有后台管理系统,用户信息、权限控制这些全局状态,用flux context就很合适,之前我做过一个CRM系统,用户登录后,头像、名字、权限等级要在侧边栏、顶部导航、设置页面都显示,用flux context统一管理,登录成功后dispatch一个“SET_USER”的action,所有组件瞬间就能拿到最新用户信息,比一层层props传方便太多。

flux context是什么,如何在React项目中正确使用

小型项目或者状态简单的场景就没必要了,比如一个静态展示页,就几个按钮切换内容,用useState+useContext足够,硬上flux context反而像杀鸡用牛刀,增加代码复杂度。

flux context常见问题解决

用flux context时,最容易遇到的问题是“状态更新了,组件没反应”,我之前就碰过,明明dispatch了action,reducer也返回了新状态,组件就是不重新渲染,后来发现是自己在reducer里偷懒,直接改了原状态,比如state.cart.push(action.payload),而不是返回{ ...state, cart: [...state.cart, action.payload] },React判断状态是否变化是浅比较,原对象引用没变,它就觉得状态没改,自然不渲染,这个坑大家一定要避开。

另一个问题是context嵌套太多,有人觉得flux context好用,就什么状态都往里塞,结果搞出好几个context,Provider一层套一层,代码看起来像千层饼,其实可以把相关的状态合并到一个store里,比如用户信息和权限放一个context,购物车和订单放另一个,别堆在一起。

还有性能问题,context更新时,所有消费它的组件都会重新渲染,解决办法是用React.memo包装组件,或者把不常变的状态拆出来单独用一个context,避免无关组件跟着刷新,我试过把用户基础信息(不常变)和购物车数量(常变)分开,效果立竿见影,页面卡顿少多了。

flux context与其他状态管理对比

现在前端状态管理工具不少,flux context和它们比有啥不一样呢?先说说Redux,Redux是flux的“加强版”,有更严格的规范,中间件生态也丰富,适合超大型项目,但配置麻烦,要写一堆模板代码,flux context更轻量,不用装额外依赖(React自带context),上手简单,中小型项目用它足够,就是功能没Redux全,比如没有内置的异步处理方案。

再看MobX,MobX是“响应式”的,改数据直接赋值,不用写action和reducer,像操作普通对象一样,对新手友好,但它的“魔法”太多,数据变化过程不透明,出了bug不好查,flux context走的是“显式数据流”,每个变化都有action记录,调试时顺着action找,很快能定位问题,这点我更喜欢。

和React Context+useReducer比,flux context其实就是基于这俩的组合,但更强调flux的单向数据流思想,单纯的Context+useReducer可能在数据流程上没那么规范,flux context相当于给它加了“使用说明书”,团队协作时不容易跑偏。

flux context是什么,如何在React项目中正确使用

flux context实战案例分享

去年我带团队做一个在线教育平台,需要管理课程列表、用户学习进度、购物车这几个全局状态,一开始用的是Redux,配置store、中间件、actionTypes,搞了半天还没开始写业务代码,新人上手也慢,后来我提议换成flux context,大家都觉得可以试试。

我们先创建了三个context:CourseContext(课程数据)、UserContext(用户信息和学习进度)、CartContext(购物车),每个context都配了对应的reducer和action创建函数,拿UserContext举例,初始状态是{ userInfo: null, progress: {} },action类型有SET_USER、UPDATE_PROGRESS,reducer根据action类型更新状态,再通过Provider传给全局组件。

有个场景是用户在课程详情页点击“标记已学”,需要更新学习进度,同时在个人中心的“我的课程”里显示进度条,用flux context实现特别简单:在详情页组件里调用dispatch(UPDATE_PROGRESS, { courseId: '123', progress: 60 }),reducer更新progress对象,UserContext的Provider把新状态广播出去,个人中心的组件收到新状态,进度条自动从30%变成60%,整个过程不到10行代码,比之前用Redux省了至少一半工作量。

项目上线后,维护起来也方便,有个实习生刚入职,我让他改购物车加商品的逻辑,他看了action创建函数和reducer的代码,半小时就搞定了,要是Redux,他可能还在研究actionTypes和中间件呢。

常见问题解答

flux context必须和Flux架构一起用吗?

不是必须哦,flux context的核心是“用context共享状态+按一定规则管理状态”,你可以不完全照搬Flux的dispatcher这些概念,只要保证数据单向流动、状态更新有迹可循就行,比如你只用action和reducer来处理状态变化,通过context共享,也算flux context的简化用法,不用非得把Flux的全套东西都搬过来,灵活一点啦。

flux context和React Context有什么区别?

React Context就像一个快递柜,只能存东西和拿东西,不管东西是怎么放进去的、谁放的,flux context是给这个快递柜配了个管理员,规定放东西必须填单子(action),管理员按单子整理好再放进柜子,拿东西也要登记,简单说,React Context只管“共享”,flux context还管“怎么共享得更规范”,后者更适合多人合作或者状态复杂的项目。

用flux context需要安装额外依赖吗?

不需要哦!flux context是基于React自带的Context API和useReducer钩子实现的,这俩都是React内置的,不用npm install任何东西,你只要创建context、写reducer、用Provider包装组件就行,纯原生React能力,零依赖,项目打包体积也不会增加,对小型项目特别友好,不用为了状态管理多引入一堆包。

flux context适合新手学习吗?

挺适合的!flux context比Redux简单,不用记那么多概念,核心就是“action描述动作、reducer处理状态、context传数据”这三步,新手可以先从简单的小项目练手,比如做个待办事项应用,用flux context管理待办列表,熟悉之后再用到复杂项目里,我带过的几个实习生,学flux context平均就花了两天,比学Redux快多了,而且理解起来更直观。

flux context能处理异步操作吗?

可以的,但需要自己写点代码,比如你要从接口获取课程列表,不能直接在reducer里发请求(reducer必须是纯函数,不能有副作用),得在action创建函数里处理异步,可以写个异步action创建函数,先用dispatch发一个“请求中”的action(显示loading),然后fetch数据,成功后dispatch“请求成功”的action(更新状态),失败就dispatch“请求失败”的action(显示错误),我之前做项目时就是这么干的,虽然没有Redux中间件(比如redux-thunk)那么方便,但自己实现也不复杂,几行代码就搞定啦。

欢迎 发表评论:

请填写验证码

评论列表

暂无评论,快抢沙发吧~