React 全局状态管理器 redux, mobx, react-immut 等横向对比

广告位招租
扫码页面底部二维码联系

受网友指点,要写一篇关于 React 的本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。全局状态管理器的对比文章,从而说明 re【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】act-immut 的优势和不足。为此,原创内容,盗版必究。原创内容,盗版必究。我再次调查和研究了相关的状态管理器,并打【版权所有,侵权必究】【本文受版权保护】算以我厂钟正楷著作权归作者所有,禁止商业用途转载。大佬的未经授权,禁止复制转载。这篇【原创内容,转载请注明出处】文章作为蓝本,对我所观察到的不同 rea【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】ct 全局状态管理器进行横向对比。本次对【本文首发于唐霜的博客】【本文首发于唐霜的博客】比的指标主要包含:

【原创不易,请尊重版权】未经授权,禁止复制转载。原创内容,盗版必究。
  • 开发体验方面 【转载请注明来源】
    • store 配置/model 定义本文版权归作者所有,未经授权不得转载。
    • 【本文受版权保护】本文版权归作者所有,未经授权不得转载。【作者:唐霜】本文作者:唐霜,转载请注明出处。【未经授权禁止转载】
    • 状态使用方式【原创内容,转载请注明出处】
    • 原创内容,盗版必究。【作者:唐霜】未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。
    • 状态修改方式原创内容,盗版必究。
    • 未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】
    • 缓存衍生计算未经授权,禁止复制转载。
    • 【版权所有】唐霜 www.tangshuang.net【作者:唐霜】未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。
    • 最小化更新【原创不易,请尊重版权】
    • 【作者:唐霜】【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。
    • 目录结构(索引)【转载请注明来源】
    • 【未经授权禁止转载】【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。
  • 【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】
  • 运行方面 著作权归作者所有,禁止商业用途转载。
    • 性能【访问 www.tangshuang.net 获取更多精彩内容】
    • 【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】
  • 【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】【访问 www.tangshuang.net 获取更多精彩内容】

参与对比的主要包含如下几个:【未经授权禁止转载】

【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。
  • immutable 典型代表 redux【未经授权禁止转载】【版权所有,侵权必究】 (react-redux)
  • 【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net
  • mutable 典型代表 mobx (m【转载请注明来源】【版权所有】唐霜 www.tangshuang.netobx-react)
  • 本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net【本文受版权保护】【版权所有,侵权必究】【原创不易,请尊重版权】
  • 纯 hooks 实现,例如 consta【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。te, unstate-next,此次挑本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net选 constate
  • 著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。
  • Redux 包装,例如 Dva, rem本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】atch,此次挑选 rematch
  • 原创内容,盗版必究。本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。
  • 先定义 model 再以 hooks 消著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net费,例如 overmind, overs著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】tated,此次挑选 overstate转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】d
  • 【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。【原创不易,请尊重版权】【转载请注明来源】
  • 自家产品 react-immut【关注微信公众号:wwwtangshuangnet】
  • 未经授权,禁止复制转载。【本文首发于唐霜的博客】未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】

下面我们开始进行对比吧。本文版权归作者所有,未经授权不得转载。

【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】【原创不易,请尊重版权】

配置/定义方式转载请注明出处:www.tangshuang.net

著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。

简单的说,基本上大部分全局状态管理器都依未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。赖一个初始的配置/定义,来明确要管理的状本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。态的初始结构。

【本文受版权保护】未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net

redux【本文受版权保护】

【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net
function reducer(state = { name: null }, action) {
  switch(action.type) {
    case 'CHANGE_NAME':
      return { ...state, name: action.data }
  }
}

const store = createStore(reducer)

<Provider store={store}>
  ...
</Provider>

reducer 是一个纯函数,接收前一个【本文受版权保护】【版权所有】唐霜 www.tangshuang.net state,返回下一个 state。其【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】中 reducer 支持 combine【未经授权禁止转载】【本文受版权保护】 操作来进行分区(分区概念是指将一个庞大【原创内容,转载请注明出处】【原创不易,请尊重版权】的 state 按照功能切分不同块来进行著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。管理)。

【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】

mobx转载请注明出处:www.tangshuang.net

【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】【本文受版权保护】转载请注明出处:www.tangshuang.net
class Store {
  @observable
  name = null

  @action.bound
  setName(name) {
    this.name = name
  }
}

const store = new Store()

<Provider store={store}>
  ...
</Provider>

单纯从这段代码看,mobx 和 redu原创内容,盗版必究。【作者:唐霜】x 的最大不同在于如何定义 store 【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。部分。redux 基于 reducer,本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】而 mobx 基于观察者模式,两者在思想原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】层面完全是两回事。

转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】

constate本文版权归作者所有,未经授权不得转载。

著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。
function defineStore() {
  const [state, setState] = useState({ name: null })
  const setName = name => setState(state => {
    return { ...state, name }
  })
  return { state, setName }
}

const [Provider, useStore] = constate(defineStore)

<Provider>
  ...
</Provider>

和前面定义 store 的方式不同,而且【转载请注明来源】【原创不易,请尊重版权】 constate 本身是没有 stor本文作者:唐霜,转载请注明出处。【作者:唐霜】e 概念的,只是我为了便于理解,把名字命【原创内容,转载请注明出处】【作者:唐霜】名为 store 而已。它通过一个 co【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.netnstate 函数,生成一个 Provi原创内容,盗版必究。未经授权,禁止复制转载。der 和一个 useStore hoo【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。k 函数。它完全基于 hooks,没有自【作者:唐霜】未经授权,禁止复制转载。己的 store。

转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】

rematch【关注微信公众号:wwwtangshuangnet】

原创内容,盗版必究。原创内容,盗版必究。【版权所有,侵权必究】原创内容,盗版必究。

Rematch 是在 redux 上面封转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。装了一层,本质上还是 redux。封装的【本文受版权保护】【作者:唐霜】一层对于我们而言,最主要是对前文所说的 【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.netreducer 分区进行了调整,让 ac原创内容,盗版必究。转载请注明出处:www.tangshuang.nettion 的功能分开,不需要写在一个函数本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net内部。同时,它增加了 action 的扩【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。展,支持异步操作。

【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。【本文首发于唐霜的博客】
const some = {
  state: {
    name: null,
  },
  reducers: {
    setName(state, name) {
      return { ...state, name }
    },
  },
  effects: {
    async updateName(name) { // 默认支持异步
      this.setName(name)
    },
  },
}

const store = init({
  models: { some },
})

<Provider store={store}>
  ...
</Provider>

它的大前提,就是要求开发者在 reduc本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。er 基础上进行分区,传不同分区给 mo原创内容,盗版必究。【本文受版权保护】dels 这个参数。另一个好处是,不需要本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。自己去配置,自动默认支持异步操作。但是,著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】本质上,和 reducer 那套没有任何【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net区别,而且在代码量上,几乎没有任何优势,本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。甚至感觉要写很多重复代码。

【未经授权禁止转载】【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。

overstated本文作者:唐霜,转载请注明出处。

原创内容,盗版必究。【版权所有,侵权必究】【原创内容,转载请注明出处】
class Some extends Store {
  state = { name: null }
  setName(name) {
    return this.setState(state => {
      return { ...state, name }
    })
  }
}

<Provider>
  ...
</Provider>

和前面所有的实现方案不同 oversta本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。ted 是内部自己保管了一个共享的全局 【作者:唐霜】【关注微信公众号:wwwtangshuangnet】store。真正在用的时候,需要把上面定【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】义好这个 store 传入到 hooks原创内容,盗版必究。【原创内容,转载请注明出处】 中使用,例如:

【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】
function MyComponent() {
  const { name, setName } = useStore(Some, store => {
    return { name: store.state.name, setName: store.setName }
  })
  ...
}

后面这个 store 是 Some 的实本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。例对象。用的时候才传入 Some,而非直原创内容,盗版必究。本文作者:唐霜,转载请注明出处。接提供给 Provider。但是我比较困【本文受版权保护】【版权所有】唐霜 www.tangshuang.net惑的是,它为啥要提供一个 Provide本文作者:唐霜,转载请注明出处。【本文受版权保护】r 呢?感觉没啥意义啊。

转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。【转载请注明来源】本文版权归作者所有,未经授权不得转载。

react-immut【本文首发于唐霜的博客】

【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】
const store = createStore({
  name: '',
})

<Provider store={store}>
  ...
</Provider>

用法上保持和 react-redux 一本文作者:唐霜,转载请注明出处。原创内容,盗版必究。致,仅仅是在定义 store 的时候,只未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。需要传入初始状态就行了,但是为了分区(上【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net面代码写法),传入第二个参数更简单,比 本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】rematch 那种省了 10 倍效率。【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net不需要写大堆 reducer 代码。

【作者:唐霜】【原创不易,请尊重版权】【本文首发于唐霜的博客】【未经授权禁止转载】

小结【未经授权禁止转载】

【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】【原创内容,转载请注明出处】未经授权,禁止复制转载。
配置/定义【版权所有】唐霜 www.tangshuang.net redux(react-redux)【访问 www.tangshuang.net 获取更多精彩内容】 mobx(mobx-react)【版权所有,侵权必究】 constate【版权所有】唐霜 www.tangshuang.net rematch原创内容,盗版必究。 overstated本文版权归作者所有,未经授权不得转载。 react-immut【版权所有,侵权必究】
定义方式【访问 www.tangshuang.net 获取更多精彩内容】 reducer function【原创内容,转载请注明出处】 store class转载请注明出处:www.tangshuang.net hooks function【未经授权禁止转载】 model object【原创不易,请尊重版权】 store class【版权所有,侵权必究】 object【本文受版权保护】
支持分区原创内容,盗版必究。 本文作者:唐霜,转载请注明出处。 本文作者:唐霜,转载请注明出处。 本文版权归作者所有,未经授权不得转载。 【关注微信公众号:wwwtangshuangnet】 【未经授权禁止转载】 【关注微信公众号:wwwtangshuangnet】
支持无根 Provider【版权所有,侵权必究】 【原创内容,转载请注明出处】 著作权归作者所有,禁止商业用途转载。 【版权所有,侵权必究】 未经授权,禁止复制转载。 【未经授权禁止转载】 【原创内容,转载请注明出处】
无 this本文作者:唐霜,转载请注明出处。 本文作者:唐霜,转载请注明出处。 【原创不易,请尊重版权】 转载请注明出处:www.tangshuang.net 【版权所有】唐霜 www.tangshuang.net 转载请注明出处:www.tangshuang.net 【访问 www.tangshuang.net 获取更多精彩内容】

overstated 将传入的 Stor【版权所有,侵权必究】【作者:唐霜】e 类或实例作为索引,两个不同的 use【本文首发于唐霜的博客】【作者:唐霜】Store 但却根据传入的参数,引用相同【转载请注明来源】本文作者:唐霜,转载请注明出处。的一个 store。这种方式,我也不知道【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。算不算是一种分区的方式,仁者见仁吧。

【版权所有,侵权必究】【本文首发于唐霜的博客】【版权所有,侵权必究】

状态使用方式【本文受版权保护】

著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。【版权所有,侵权必究】【原创不易,请尊重版权】未经授权,禁止复制转载。

组件通过什么方式才能读取到全局状态?不同【本文受版权保护】【关注微信公众号:wwwtangshuangnet】管理器还还是有一点区别。

【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。

Redux & rematch【转载请注明来源】

【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。

React-redux 是 redux 【未经授权禁止转载】【转载请注明来源】连接组件的工具,由于 rematch 实【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。际上只是对 redux reducer 【转载请注明来源】【版权所有,侵权必究】逻辑的封装,所以也是用 react-re【转载请注明来源】【未经授权禁止转载】dux 来做连接器。

转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net
const mapStateToProps = (state) => {
  return { ...state }
}
export default connect(mapStateToProps)(MyComponent)

完全通过将 state map 到 pr转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】ops 的方式,将 state 传入组件【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】后使用。

【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。原创内容,盗版必究。

Mobx原创内容,盗版必究。

本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】
@observer
class MyComponent extends React.Component {
  render() {
    const { state } = this.props.store
  }
}

本质上,@observer 和 conn【转载请注明来源】【作者:唐霜】ect 功能一致,是组件的包装器,它会自【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】动注入 store 到 props 上。【转载请注明来源】【转载请注明来源】Mobx-react 还可以通过 @in未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。ject 来将 Provider 提供的【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】状态属性注入到组件中。@inject 接著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】收的内容和 map 效果一致。

【本文首发于唐霜的博客】未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net

constate【版权所有,侵权必究】

【原创不易,请尊重版权】转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。
function MyComponent() {
  const { state } = useStore() // 这个 useStore 是 constate 函数生成的,需要引入
}

useStore 得到的结果完全由 de未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。fineStore 的返回值决定,感觉非本文作者:唐霜,转载请注明出处。【转载请注明来源】常直接。

转载请注明出处:www.tangshuang.net【版权所有,侵权必究】转载请注明出处:www.tangshuang.net

overstated【关注微信公众号:wwwtangshuangnet】

本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。
function MyComponent() {
  const { name } = useStore(Some, store => {
    return { name: store.state.name }
  })
}

读取到 store 上的什么内容,完全靠【版权所有,侵权必究】转载请注明出处:www.tangshuang.net第二个参数的返回值决定。这里 Some 本文作者:唐霜,转载请注明出处。【作者:唐霜】这个 class 一方面是作为实例化出 原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】store 的依据,另一方面也是取出对应本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。 store 的依据。

【转载请注明来源】【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。【本文受版权保护】

react-immut未经授权,禁止复制转载。

【转载请注明来源】本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】
function MyComponent() {
  const [state] = useStore()
}

虽然 react-immut 也提供 c【版权所有,侵权必究】【版权所有,侵权必究】onnect 方案,但是使用 hooks原创内容,盗版必究。【作者:唐霜】 更方便,通过 useStore 直接读转载请注明出处:www.tangshuang.net【转载请注明来源】取整个 store 的 state 和 【转载请注明来源】【版权所有,侵权必究】dispatch。通过传入 keyPat本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。h 可以缩小作用域。

【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。
function MyComponent() {
  const [bookName] = useStore('books[0].name')
}

小结【作者:唐霜】

【本文受版权保护】未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】【本文受版权保护】本文版权归作者所有,未经授权不得转载。
状态读取方式【版权所有】唐霜 www.tangshuang.net redux(react-redux)【作者:唐霜】 mobx(mobx-react)未经授权,禁止复制转载。 constate【未经授权禁止转载】 rematch【访问 www.tangshuang.net 获取更多精彩内容】 overstated著作权归作者所有,禁止商业用途转载。 react-immut【转载请注明来源】
推荐连接方式著作权归作者所有,禁止商业用途转载。 connect本文作者:唐霜,转载请注明出处。 @observe【版权所有,侵权必究】 hooks著作权归作者所有,禁止商业用途转载。 【原创内容,转载请注明出处】 hooks【访问 www.tangshuang.net 获取更多精彩内容】 hooks原创内容,盗版必究。
使用时无需 map【关注微信公众号:wwwtangshuangnet】 未经授权,禁止复制转载。 著作权归作者所有,禁止商业用途转载。 未经授权,禁止复制转载。 【访问 www.tangshuang.net 获取更多精彩内容】 著作权归作者所有,禁止商业用途转载。 【原创不易,请尊重版权】
便捷支持 hooks【本文首发于唐霜的博客】 【本文首发于唐霜的博客】 著作权归作者所有,禁止商业用途转载。 原创内容,盗版必究。 原创内容,盗版必究。 本文版权归作者所有,未经授权不得转载。 本文作者:唐霜,转载请注明出处。
便捷获取子属性【版权所有,侵权必究】 【作者:唐霜】 【版权所有,侵权必究】 【本文受版权保护】 著作权归作者所有,禁止商业用途转载。 【本文受版权保护】 【原创内容,转载请注明出处】

react-redux 提供了 useS【版权所有】唐霜 www.tangshuang.net【原创不易,请尊重版权】elector 这个 hook 函数,不【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。仅可以在里面直接 map state,而转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。且还借鉴了 reslect 的思想实现缓本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】存。

本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net【本文受版权保护】【原创不易,请尊重版权】【版权所有】唐霜 www.tangshuang.net

状态修改方式原创内容,盗版必究。

【转载请注明来源】本文作者:唐霜,转载请注明出处。原创内容,盗版必究。

怎么才能修改到全局状态呢?可不可以只修改【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。局部的状态,或者可否快速更新嵌套的属性?【原创内容,转载请注明出处】【未经授权禁止转载】经过我观察,更新状态的方式是对我们开发体【作者:唐霜】未经授权,禁止复制转载。验最明显的地方。特别是异步操作,不同状态【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】管理器给人的感受可能存在天壤之别。

【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。【版权所有,侵权必究】【作者:唐霜】

Redux【版权所有,侵权必究】

本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】【作者:唐霜】

connect 会自动将 dispatc本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。h 方法加入 props 给组件使用。组本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】件从 props 上读取来自 conne转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】ct map 的内容。最常用的异步处理,【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。是使用中间件 redux-thunk。这本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net个中间件允许 dispatch 接收一个未经授权,禁止复制转载。【未经授权禁止转载】函数。

【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】【本文受版权保护】本文作者:唐霜,转载请注明出处。
function createAction(type) {
  return (dispatch, getState) => {
    fetch().then((data) => {
      dispatch({ type, data })
    })
  }
}

this.props.dispatch(createAction('UPDATE_NAME'))

这个 createAction 函数被称原创内容,盗版必究。未经授权,禁止复制转载。为 action creator,用于生【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】成一个被 dispatch 接收的函数,【本文受版权保护】本文版权归作者所有,未经授权不得转载。而生成的函数拥有 dispatch 和 著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。getState 两个参数函数,在该函数原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net中,可以执行异步操作,并且使用 getS本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。tate 来获取整个 state。

【作者:唐霜】【转载请注明来源】本文版权归作者所有,未经授权不得转载。

Mobx【原创不易,请尊重版权】

【未经授权禁止转载】本文作者:唐霜,转载请注明出处。原创内容,盗版必究。【未经授权禁止转载】

在 store 中,修改全局状态极其简单原创内容,盗版必究。【未经授权禁止转载】,直接修改对应的属性即可,它是 muta【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。ble 的。

【本文首发于唐霜的博客】【本文受版权保护】本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net
class Store {
  @observable
  name = null

  setName(name) {
    this.name = name // 直接修改属性
  }
}

由于可直接修改属性,所以异步操作变得很简本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】单,异步请求完,将新的数据赋值给对应的属【原创不易,请尊重版权】本文作者:唐霜,转载请注明出处。性即可。

【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】【未经授权禁止转载】

constate【本文受版权保护】

转载请注明出处:www.tangshuang.net【版权所有,侵权必究】【原创不易,请尊重版权】

直接使用创建的 hook 函数返回值进行转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。更新。由于完全基于 hooks,所以异步本文作者:唐霜,转载请注明出处。【作者:唐霜】操作都是走 hooks 的异步方式。

【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】

rematch【转载请注明来源】

【未经授权禁止转载】【本文受版权保护】【转载请注明来源】转载请注明出处:www.tangshuang.net原创内容,盗版必究。
const Some = {
  state: { name: null }
  reducers: {
    setName(state, name) {
      return { ...state, name }
    },
  },
  effects: {
    async fetchName() {
      const { name } = await fetch()
      this.setName(name)
    },
  },
}

Rematch 自动加入了 map di【转载请注明来源】本文版权归作者所有,未经授权不得转载。spatch 的逻辑:

转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。
const mapDispatchToProps = (dispatchers) => {
  const { Some } = dispatchers
  const { fetchName } = Some // 把 effects.fetchName 读取出来给 props
  return { fetchName }
}

但总体而言,还是 react-redux著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。 那一套。

原创内容,盗版必究。【版权所有,侵权必究】【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。

overstated著作权归作者所有,禁止商业用途转载。

【关注微信公众号:wwwtangshuangnet】【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】

由于在 overstated 中需要事先【版权所有】唐霜 www.tangshuang.net【转载请注明来源】定义 store,而在定义时需要调用 t【本文受版权保护】【原创不易,请尊重版权】his.setState 来更新状态,所【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。以异步操作也自然而言不需要复杂逻辑。

本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net
class Some extends Store {
  state = {
    name: null,
  }

  async fetchName() {
    fetch().(({ name }) => {
      this.setState({ name })
    })
  }
}

react-immut【版权所有】唐霜 www.tangshuang.net

本文版权归作者所有,未经授权不得转载。【作者:唐霜】【原创不易,请尊重版权】【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。

react-immut 提供了多种 di【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。spatch 的方式,最容易理解的就是通转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】过 key->value 的形式更转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。新状态。

未经授权,禁止复制转载。【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。
dispatch('key', value)

简单直观,但是不适合批量更新。而依赖 i【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】mmer 的能力,批量更新也很方便

【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】
dispatch(state => {
  state.name = 'name'
  state.age = 10
  state.books = []
})

由于 react-immut 也提供分区【作者:唐霜】转载请注明出处:www.tangshuang.net方式载入到 store 中,异步能力也提【版权所有】唐霜 www.tangshuang.net【转载请注明来源】前考虑了。

【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。【转载请注明来源】【转载请注明来源】【未经授权禁止转载】
export const state = {
  name: '',
}

export const updateName = async (dispatch) => () => {
  const data = await fetch()
  dispatch('name', data.name)
}

小结转载请注明出处:www.tangshuang.net

【原创内容,转载请注明出处】【本文首发于唐霜的博客】【转载请注明来源】【本文首发于唐霜的博客】
状态修改方式【本文受版权保护】 redux(react-redux)著作权归作者所有,禁止商业用途转载。 mobx(mobx-react)著作权归作者所有,禁止商业用途转载。 constate原创内容,盗版必究。 rematch原创内容,盗版必究。 overstated原创内容,盗版必究。 react-immut【作者:唐霜】
基于不可变原则【作者:唐霜】 本文作者:唐霜,转载请注明出处。 本文版权归作者所有,未经授权不得转载。 【原创内容,转载请注明出处】 【本文首发于唐霜的博客】 【版权所有】唐霜 www.tangshuang.net 本文作者:唐霜,转载请注明出处。
原子(子属性)更新【版权所有】唐霜 www.tangshuang.net 【访问 www.tangshuang.net 获取更多精彩内容】 【原创不易,请尊重版权】 【本文受版权保护】 【转载请注明来源】 本文作者:唐霜,转载请注明出处。 转载请注明出处:www.tangshuang.net
便捷嵌套批量更新本文版权归作者所有,未经授权不得转载。 【未经授权禁止转载】 【版权所有】唐霜 www.tangshuang.net 【未经授权禁止转载】 著作权归作者所有,禁止商业用途转载。 【转载请注明来源】 【原创内容,转载请注明出处】
便捷 map dispatch【版权所有】唐霜 www.tangshuang.net 【版权所有,侵权必究】 【访问 www.tangshuang.net 获取更多精彩内容】 【本文首发于唐霜的博客】 转载请注明出处:www.tangshuang.net 【未经授权禁止转载】 【版权所有】唐霜 www.tangshuang.net
key->value 模式著作权归作者所有,禁止商业用途转载。 【本文首发于唐霜的博客】 著作权归作者所有,禁止商业用途转载。 【本文受版权保护】 【原创内容,转载请注明出处】 【本文受版权保护】 【未经授权禁止转载】
原生异步支持转载请注明出处:www.tangshuang.net 【本文受版权保护】 本文版权归作者所有,未经授权不得转载。 【作者:唐霜】 原创内容,盗版必究。 【本文受版权保护】 未经授权,禁止复制转载。
无 this【未经授权禁止转载】 【原创不易,请尊重版权】 【本文受版权保护】 转载请注明出处:www.tangshuang.net 【版权所有】唐霜 www.tangshuang.net 未经授权,禁止复制转载。 【本文首发于唐霜的博客】

缓存衍生计算原创内容,盗版必究。

未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。

读取 state 时,我们往往需要通过一【原创内容,转载请注明出处】原创内容,盗版必究。番计算之后,得到新值,再作为 props本文作者:唐霜,转载请注明出处。【原创内容,转载请注明出处】 传给组件。再 vue 中,我们熟知 c本文版权归作者所有,未经授权不得转载。【原创不易,请尊重版权】omputed property,同样,未经授权,禁止复制转载。【关注微信公众号:wwwtangshuangnet】在 mobx 中,@computed 轻【本文受版权保护】【关注微信公众号:wwwtangshuangnet】松实现计算缓存,而在 redux 生态中【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net,reselect 也可以对计算进行缓存本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。,不过开发体验上,就输很多。由于 res著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】elect 是独立库,所以,也可以用在 【转载请注明来源】著作权归作者所有,禁止商业用途转载。react-immut 中,不过,实际上【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net,react 的 memo, useMe本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。mo 可以替代 reselect 方法。

【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。【原创不易,请尊重版权】
缓存衍生计算本文作者:唐霜,转载请注明出处。 redux(reselect)著作权归作者所有,禁止商业用途转载。 mobx(mobx-react)未经授权,禁止复制转载。 constate本文作者:唐霜,转载请注明出处。 rematch【本文首发于唐霜的博客】 overstated本文版权归作者所有,未经授权不得转载。 react-immut转载请注明出处:www.tangshuang.net
支持缓存衍生计算结果转载请注明出处:www.tangshuang.net 未经授权,禁止复制转载。 未经授权,禁止复制转载。 本文版权归作者所有,未经授权不得转载。 【版权所有】唐霜 www.tangshuang.net 【作者:唐霜】 【版权所有,侵权必究】
计算属性著作权归作者所有,禁止商业用途转载。 本文作者:唐霜,转载请注明出处。 【作者:唐霜】 【本文首发于唐霜的博客】 原创内容,盗版必究。 【原创内容,转载请注明出处】 【版权所有,侵权必究】
无 this转载请注明出处:www.tangshuang.net 【版权所有,侵权必究】 原创内容,盗版必究。 【转载请注明来源】 【转载请注明来源】 【访问 www.tangshuang.net 获取更多精彩内容】 著作权归作者所有,禁止商业用途转载。

最小化渲染原创内容,盗版必究。

著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】

所谓最小化渲染,是指不要 state 有【本文受版权保护】本文版权归作者所有,未经授权不得转载。一点点变动,都触发所有被 connect未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net/observe 的组件进行更新,应该在著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。只有被依赖的 state 节点变化时,才【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】进行更新(依赖收集)。目前能够完全做到这【作者:唐霜】未经授权,禁止复制转载。一点的,仅有 mobx 能做到。不过在 未经授权,禁止复制转载。【原创内容,转载请注明出处】react-immut 中,也能在无根 【版权所有,侵权必究】转载请注明出处:www.tangshuang.netProvider 模式下,使用 useS未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.nettore(keyPath) 部分支持。

【本文首发于唐霜的博客】原创内容,盗版必究。【转载请注明来源】【本文受版权保护】

Mobx未经授权,禁止复制转载。

【原创内容,转载请注明出处】原创内容,盗版必究。【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net
class Some {
  @observable
  name = 'tom'

  @observable
  age = 10
}
@inject('store')
@observer
class MyComponent {
  render() {
    const { name } = this.props.store
    // 只用到 name,所以只有在 name 发生变化的时候,才会触发重新渲染
  }
}

react-immut【作者:唐霜】

转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】
init({
  name: 'tomy',
})

function MyComponent() {
  const [name] = useStore('name')
  // 在没有使用 Provider 的情况下,只有 name 发生变化,这个组件才会重新渲染
}

小结【转载请注明来源】

【版权所有,侵权必究】转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】【版权所有,侵权必究】
最小化渲染本文作者:唐霜,转载请注明出处。 redux(redux-react)【原创内容,转载请注明出处】 mobx(mobx-react)本文版权归作者所有,未经授权不得转载。 constate【版权所有】唐霜 www.tangshuang.net rematch【转载请注明来源】 overstated本文作者:唐霜,转载请注明出处。 react-immut【版权所有,侵权必究】
仅指定属性变化时再渲染转载请注明出处:www.tangshuang.net 【版权所有】唐霜 www.tangshuang.net 【访问 www.tangshuang.net 获取更多精彩内容】 转载请注明出处:www.tangshuang.net 【转载请注明来源】 未经授权,禁止复制转载。 【版权所有】唐霜 www.tangshuang.net
无 this未经授权,禁止复制转载。 【作者:唐霜】 【原创内容,转载请注明出处】 【原创内容,转载请注明出处】 【作者:唐霜】 【本文首发于唐霜的博客】 转载请注明出处:www.tangshuang.net

目录结构未经授权,禁止复制转载。

【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】

我们主要想讨论下,哪个状态管理器能够以更【版权所有】唐霜 www.tangshuang.net【本文受版权保护】清晰的目录结构来管理模块状态。

【版权所有,侵权必究】【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。

Redux【原创内容,转载请注明出处】

【访问 www.tangshuang.net 获取更多精彩内容】【本文首发于唐霜的博客】【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net
- App.js
- store.js
- components/some-component/
  - store/
    - index.js
    - reducers.js
    - actions.js
  - some.jsx

Mobx【未经授权禁止转载】

【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】【版权所有】唐霜 www.tangshuang.net
- App.js
- store.js
- components/some-component/
  - store.class.js
  - some.jsx

constate【作者:唐霜】

本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】【转载请注明来源】
- App.js
- components/some-component/
  - store/
    - a.js
    - b.js
  - some.jsx

Rematch著作权归作者所有,禁止商业用途转载。

【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】
- App.js
- store.js
- components/some-component/
  - model.js
  - some.jsx

overstated【转载请注明来源】

转载请注明出处:www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】
- App.js
- components/some-component/
  - store/
    - a.class.js
    - b.class.js
  - some.jsx

react-immut未经授权,禁止复制转载。

本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。【转载请注明来源】【本文首发于唐霜的博客】原创内容,盗版必究。
- App.js
- components/some-component/
  - store/
    - namespace-a.js
    - namespace-b.js
  - some.jsx

小结【本文受版权保护】

著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】

在所有管理器中,redux 是最复杂的。转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。mobx, rematch 需要通过一个原创内容,盗版必究。【本文受版权保护】全局的 store.js 来将所有涉及的【未经授权禁止转载】【版权所有】唐霜 www.tangshuang.net stores 收拢到一个文件中,这样才转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】能为 Provider 提供 store本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】。而 constate, oversta【原创内容,转载请注明出处】未经授权,禁止复制转载。ted, react-immut 无须收【版权所有,侵权必究】【作者:唐霜】拢所有 store,在组件文件夹内定义 本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】store 之后,直接引入使用。其中 c【原创不易,请尊重版权】【转载请注明来源】onstate 虽然可以单独为组件提供 本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】store,但是要复用它的 store,【转载请注明来源】转载请注明出处:www.tangshuang.net必须导出 Provider,将 Prov本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。ider 放在顶层,所以本质上,如果需要原创内容,盗版必究。【本文受版权保护】根 Provider,还是要收拢所有 s【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。tore。而 overstated 和 【本文受版权保护】【版权所有,侵权必究】react-immut 内置了全局 st【访问 www.tangshuang.net 获取更多精彩内容】【转载请注明来源】ore,因此,只要在组件文件夹内自己管理【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。自己相关的 store namespac【版权所有,侵权必究】【作者:唐霜】e,就可以完成开发,不需要再到外部进行引著作权归作者所有,禁止商业用途转载。【作者:唐霜】入,虽然 overstated 也需要根【关注微信公众号:wwwtangshuangnet】【作者:唐霜】 Provider,但是只要定义一处,内未经授权,禁止复制转载。未经授权,禁止复制转载。部不再需要任何操作,而且也不需要给 Pr本文作者:唐霜,转载请注明出处。【作者:唐霜】ovider 传 store。react【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net-immut 连 Provider 都不【原创内容,转载请注明出处】【转载请注明来源】需要,是所有管理器里面最简洁的。

【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。
目录结构转载请注明出处:www.tangshuang.net redux(redux-react)【版权所有】唐霜 www.tangshuang.net mobx(mobx-react)【本文首发于唐霜的博客】 constate【版权所有】唐霜 www.tangshuang.net rematch著作权归作者所有,禁止商业用途转载。 overstated【原创不易,请尊重版权】 react-immut【未经授权禁止转载】
简洁性评分本文版权归作者所有,未经授权不得转载。 0著作权归作者所有,禁止商业用途转载。 0.5【版权所有】唐霜 www.tangshuang.net 4【未经授权禁止转载】 3【原创不易,请尊重版权】 5未经授权,禁止复制转载。 5转载请注明出处:www.tangshuang.net
无 this【版权所有,侵权必究】 【本文首发于唐霜的博客】 【版权所有】唐霜 www.tangshuang.net 本文版权归作者所有,未经授权不得转载。 未经授权,禁止复制转载。 转载请注明出处:www.tangshuang.net 本文作者:唐霜,转载请注明出处。

性能著作权归作者所有,禁止商业用途转载。

【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。

性能测试非常麻烦,因为不同管理器的编程方【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。式不同,没有办法找到一个可以作为标准的方【未经授权禁止转载】转载请注明出处:www.tangshuang.net式衡量。但是为了进行对比,我姑且平衡下面【版权所有,侵权必究】【原创不易,请尊重版权】的因素来做对比:

【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】未经授权,禁止复制转载。【本文首发于唐霜的博客】【作者:唐霜】
  • 实现相同效果:一个渲染10000行的ta【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】ble组件的实现
  • 【版权所有,侵权必究】【转载请注明来源】原创内容,盗版必究。
  • 最优化:对所有管理器进行尽可能最高程度的本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net优化,使它们都发挥自己最大的优势
  • 【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。

评价指标:【本文首发于唐霜的博客】

【转载请注明来源】【未经授权禁止转载】本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net
  • 第一次渲染时间【版权所有】唐霜 www.tangshuang.net
  • 【本文首发于唐霜的博客】【未经授权禁止转载】【本文受版权保护】本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】
  • 更新2条不连续的记录渲染时间本文作者:唐霜,转载请注明出处。
  • 【转载请注明来源】本文作者:唐霜,转载请注明出处。原创内容,盗版必究。

评价方法:转载请注明出处:www.tangshuang.net

转载请注明出处:www.tangshuang.net未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】
  • 编写相同的基础组件,所有管理器都使用这些本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。组件
  • 【原创内容,转载请注明出处】未经授权,禁止复制转载。【作者:唐霜】【版权所有,侵权必究】原创内容,盗版必究。
  • 通过 chrome performanc【版权所有】唐霜 www.tangshuang.net【本文受版权保护】e 记录结果
  • 【未经授权禁止转载】原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。【关注微信公众号:wwwtangshuangnet】
  • 每个管理器测试 5 次,去除最高最低,取【本文受版权保护】【本文首发于唐霜的博客】最优值
  • 【本文首发于唐霜的博客】【原创内容,转载请注明出处】转载请注明出处:www.tangshuang.net【作者:唐霜】转载请注明出处:www.tangshuang.net

限制:转载请注明出处:www.tangshuang.net

【版权所有,侵权必究】未经授权,禁止复制转载。【本文首发于唐霜的博客】
  • 由于条件限制,我只做 redux, mo著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。bx 和 react-immut 的对比
  • 著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】原创内容,盗版必究。

用于对比的代码可以在【转载请注明来源】这里原创内容,盗版必究。阅读。【版权所有,侵权必究】

著作权归作者所有,禁止商业用途转载。著作权归作者所有,禁止商业用途转载。【本文受版权保护】本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】

Redux【关注微信公众号:wwwtangshuangnet】

【本文受版权保护】未经授权,禁止复制转载。【作者:唐霜】原创内容,盗版必究。

基于 redux + react-red原创内容,盗版必究。未经授权,禁止复制转载。ux 的架构,在渲染 10000 行数据【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。时,平均耗时 2295ms,更新用时平均著作权归作者所有,禁止商业用途转载。【本文受版权保护】 340ms 左右。

【版权所有】唐霜 www.tangshuang.net【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。【作者:唐霜】

本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。【本文受版权保护】【本文受版权保护】未经授权,禁止复制转载。

黄色部分是 script 执行时间,该次【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。截图消耗 1281ms。

【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。【本文受版权保护】【作者:唐霜】未经授权,禁止复制转载。

本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。

该次截图是更新时消耗,脚本部分用时 28【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。5ms。而真正执行 update 函数(【版权所有,侵权必究】【本文首发于唐霜的博客】修改数据)仅 1ms。

【版权所有】唐霜 www.tangshuang.net【作者:唐霜】著作权归作者所有,禁止商业用途转载。【本文受版权保护】【版权所有】唐霜 www.tangshuang.net

Mobx本文版权归作者所有,未经授权不得转载。

【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net

基于 mobx + mobx-react【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net 的架构,第一次渲染耗时 1996ms,【未经授权禁止转载】【版权所有,侵权必究】更新用时 430ms 左右。

【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net

【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】本文作者:唐霜,转载请注明出处。【本文受版权保护】【作者:唐霜】

该次截图中,黄色脚本执行部分耗时 118【版权所有】唐霜 www.tangshuang.net【本文受版权保护】1ms。

【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。

【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】

该次截图更新脚本耗时 374ms。upd本文作者:唐霜,转载请注明出处。【未经授权禁止转载】ate 函数消耗 30ms。

【访问 www.tangshuang.net 获取更多精彩内容】原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。

ReactImmut转载请注明出处:www.tangshuang.net

【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。

基于 react-immut 来实现,第未经授权,禁止复制转载。未经授权,禁止复制转载。一次渲染耗时 1850ms,更新用时 3【本文首发于唐霜的博客】【原创不易,请尊重版权】88ms。

【原创内容,转载请注明出处】【本文首发于唐霜的博客】【本文首发于唐霜的博客】【转载请注明来源】

本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。【本文首发于唐霜的博客】【原创内容,转载请注明出处】著作权归作者所有,禁止商业用途转载。

本次截图脚本耗时 1049ms。【访问 www.tangshuang.net 获取更多精彩内容】

原创内容,盗版必究。本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】

【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。【作者:唐霜】

本次截图脚本用时 325ms,真正的 u【本文首发于唐霜的博客】原创内容,盗版必究。pdate 函数耗时 6ms。

未经授权,禁止复制转载。原创内容,盗版必究。【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。

小结本文作者:唐霜,转载请注明出处。

本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。【版权所有】唐霜 www.tangshuang.net

在首次渲染 1000 行数据的整体耗时上原创内容,盗版必究。【作者:唐霜】,三个状态管理器并没有太大的差别,都是在著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】一个量级,而且 layout 部分消耗时【转载请注明来源】未经授权,禁止复制转载。间也很多。真正的差别在更新阶段,单纯看 【本文受版权保护】本文版权归作者所有,未经授权不得转载。update 函数,也就是执行数据修改,本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。得到新数据这个过程,redux 系虽然需本文作者:唐霜,转载请注明出处。原创内容,盗版必究。要写更复杂的对象解构代码,却是最快的,仅【未经授权禁止转载】【原创内容,转载请注明出处】用了 1ms,因为只产生新对象,而不会对著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。原有对象进行修改。mobx 消耗 30m【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】s,差距比较大,因为 mobx 基于 o【本文受版权保护】未经授权,禁止复制转载。bservable 实现,内部需要处理复【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。杂的关系。而 react-immut 基原创内容,盗版必究。原创内容,盗版必究。于 immer 实现,而 immer 基未经授权,禁止复制转载。【未经授权禁止转载】于 Proxy 实现,理论上应该比 mo本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】bx 基于 Object.defineP【本文首发于唐霜的博客】【本文受版权保护】roperty 实现更消耗性能,但由于在【本文受版权保护】转载请注明出处:www.tangshuang.net嵌套对象拦截时处理的更好,所以,反而比 原创内容,盗版必究。转载请注明出处:www.tangshuang.netmobx 更快。在整体更新性能上,由于实【版权所有】唐霜 www.tangshuang.net【作者:唐霜】际上还是把整个 1000 行数据重新遍历【转载请注明来源】转载请注明出处:www.tangshuang.net一边,所以也没有突出的性能差别。

【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】

最终结论转载请注明出处:www.tangshuang.net

【作者:唐霜】著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net

本文主要从开发体验的角度,对比了 red原创内容,盗版必究。原创内容,盗版必究。ux(react-redux)、mobx原创内容,盗版必究。未经授权,禁止复制转载。(mobx-react)、constat【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】e、rematch、overstated转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。、react-immut 在各个方面的开本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】发体验,最后由于条件所限,只对比了 re本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。dux(react-redux)、mob【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。x(mobx-react)、react-【未经授权禁止转载】转载请注明出处:www.tangshuang.netimmut 的部分性能,性能对比不算严格【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。,但能大致了解它们之间的差别。

【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。【未经授权禁止转载】【原创内容,转载请注明出处】

做这个对比,主要还是想和读者探讨 rea转载请注明出处:www.tangshuang.net【未经授权禁止转载】ct 全局状态管理器的一些特质。在我撰写【转载请注明来源】【本文首发于唐霜的博客】 react-immut 的过程中,我最原创内容,盗版必究。原创内容,盗版必究。初只提供了非常单一的能力,代码只有 15【作者:唐霜】【版权所有】唐霜 www.tangshuang.net0 行,但是随着自己对某些场景和能力的认【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】知,最终代码也到达了 250 行。你可以【访问 www.tangshuang.net 获取更多精彩内容】【版权所有】唐霜 www.tangshuang.net这里本文作者:唐霜,转载请注明出处。阅读它的源码,如果有你自己的想法,也不妨本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】在本文下方给我留言,一起探讨。

著作权归作者所有,禁止商业用途转载。【本文受版权保护】【转载请注明来源】未经授权,禁止复制转载。【转载请注明来源】

2020-09-13 9111

为价值买单,打赏一杯咖啡

本文价值91.11RMB