响应式系统与 React (3) | 青训营笔记

67 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第8天。

一、本堂课重点内容

  • React状态管理库
  • React应用级框架

二、详细知识点介绍

React状态管理库

当两个关系较远的组件需要共享状态的时候,需要将状态上升到较高的位置,为解决所有状态上升到较高节点的问题。

React状态管理库将状态抽离到UI外部进行统一管理。 image.png

但为啥还要将状态放在组件内部?全部使用这种方式的问题是什么?

  • 这种集中的状态管理方案会降低组件的复用性,组件和外部的数据store造成了强耦合,不利于组件库的开发。这种情况多出现在业务代码中,而不会出现在组件库中。
  • 从语义上讲,一个状态完全被一个组件拥有的话,这个状态不应该被其他组件看到,最好在store中只存放各个组件需要共享的状态。

抽象的看,把所有的组件看成一个大的组件,这个大的组件的状态是store的状态。

React状态管理库,将状态抽离到UI外部进行统一管理

  • redux
  • xstate,状态机思想
  • mobx
  • recoil

放在状态管理库的原则:当前状态是否是整个app拥有的?如currentUser,就可以是整个app拥有的状态。

React应用级框架

React未提供服务端渲染,页面路由等功能

Next.js,Vercel公司开发,编译快,性能高

Modern.js,字节跳动开发,内置很多开箱即用能力

Blitz,无API思想的全栈开发框架,避免了前后端的HTTP接口,写代码的时候相当于前端直接访问数据库,但生成的时候会前后端连接,但开发者无需过问。

三、实践实习例子

Modern.js/Reduck

countModel只要被声明,就可以在app任何位置使用,而且是单例的,全局是共享的。

import { model,useModel } from "@modern-js/runtime/model";
const countModel = model("count").define({
    state:{
        x:0,
        y:0,
    },
    actions:{
        incrementX(state){
            state.x+=1;
        },
        incrementY(state){
            state.y+=1;
        },
    },
});
// 在组件中只需要通过[{x,y},{incrementX,incrementY}]=useModel(countModel);即可使用
// 组件中直接调用 incrementX();即可

四、课后个人总结

本节课学习了React的状态管理库,介绍了使用状态管理库的利弊,学习了使用状态管理库的原则,并了解了一些常见的React状态管理库,尝试使用Modern.js实现React的状态管理。本节课还学习了React应用级框架,了解到React原生框架的不足,并了解了一些React的应用级框架,希望以后继续学习研究。

五、参考链接

Modern.js - 现代 Web 工程体系 (modernjs.dev)

Next.js - React 应用开发框架 | Next.js中文网 (nextjs.cn)

Blitz.js - The Missing Fullstack Toolkit for Next.js (blitzjs.com)