react数据管理

  react的设计思想就是界面由数据驱动,公式:UI = f(data)。UI代表最终渲染的界面,f表示的是一个函数,data就是数据。data可以来自于组件内部的state,也可以是props。就是下文中讲到的内容。

一、组件状态state

  组件内的数据分为两种

  • state    组件内部数据,外部不可见
  • props  外部传入的数据

   所以,判断一个数据应该放在哪里,用下面的原则:

   1、如果数据由外部传入,放在 props 中;

   2、如果是组件内部状态,是否这个状态更改应该立刻引发一次组件重新渲染?如果是,放在 state 中;不是,放在成员变量中。

  如何修改state:

1 this.state.foo = ‘bar‘; //错误的方式
2 this.setState({foo:‘bar‘}); //正确的方式

  如上面代码所示,如果只是修改 this.state,那改了也就只是改了这个对象,其他的什么都不会发生;如果使用 setState 函数,那不光修改 state,还能引发组件的重新渲染,在重新渲染中就会使用修改后的 state,这也就是达到根据 state 改变公式左侧 UI 的目的。

  但是setState并不是每次调用都能触发渲染。React为了优化渲染,避免每次setState都去渲染而浪费性能,用了任务队列的方式来解决,多次setState调用会往队列里放多个任务,然后React会选择合适的时机去处理,当批量处理开始时,会合并多个setState,比如下面:

1 this.setState({count: 1});
2 this.setState({caption: ‘foo‘});
3 this.setState({count: 2});

  最终会被合并为this.setState({count: 2, caption: ‘foo‘});所以被合并后多次的setState只会更新一次,从而只引发一次重新渲染。当然也因为有这个队列的存在setState在React中无法保证同步更新state中的数据。注意:setState中的对象合并都是->浅合并

   state的批处理: 

  可以这么理解,当 React 调用某个组件的生命周期函数或者事件处理函数时,React 会想:“嗯,这一次函数可能调用多次 setState,我会先打开一个标记,只要这个标记是打开的,所有的 setState 调用都是往任务队列里放任务,当这一次函数调用结束的时候,我再去批量处理任务队列,然后把这个标记关闭。”

(这里可以对应到pendingTime:https://react.jokcy.me/book/update/expiration-time.html

批处理推荐文章:https://www.jianshu.com/p/7ab07f8c954c

那么如何进行setState的连续操作并产生同步效果?使用函数式setState

setState 的第一个参数为函数时,任务列表上增加的就是一个可执行的任务函数了,React 每处理完一个任务,都会更新 this.state,然后把新的 state 传递给这个任务函数。

1 function increment(state, props) {
2     return {count: state.count + 1};
3 }
4 this.setState(increment);
5 this.setState(increment);
6 this.setState(increment);

二、Redux数据管理工具

  Redux相当于是所有组件共享的数据store,打破了父子、子父、兄弟组件之间的数据传递的路径,都可以直接去store里拿。

适合redux的场景:

第一步,看这个状态是否会被多个 React 组件共享。

所谓共享,就是多个组件需要读取或者修改这个状态,如果是,那不用多想,应该放在 Store 上,因为 Store 上状态方便被多个组件共用,避免组件之间传递数据;如果不是,继续看第二步。

第二步,看这个组件被 unmount 之后重新被 mount,之前的状态是否需要保留。

举个简单例子,一个对话框组件。用户在对话框打开的时候输入了一些内容,不做提交直接关闭这个对话框,这时候对话框就被 unmount 了,然后重新打开这个对话框(也就是重新 mount),需求是否要求刚才输入的内容依然显示?如果是,那么应该把状态放在 Store 上,因为 React 组件在 unmount 之后其中的状态也随之消失了,要想在重新 mount 时重获之前的状态,只能把状态放在组件之外,Store 当然是一个好的选择;如果需求不要求重新 mount 时保持 unmount 之前的状态,继续看第三步。

第三步,到这一步,基本上可以确定,这个状态可以放在 React 组件中了。

主要掌握点

  1. Redux 中的基本概念 action、reducer 和 store;
  2. 使用 react-redux 会应用哪些设计模式;
  3. 如何设计 Redux 的 Store。

三、Mobx数据管理工具

  简单直接的数据操作,不需要做dispatch,不必如redux走一遍严格的范式,调用action就能修改数据。而且适合使用多个store,当然使用configure配置可以禁止直接修改observable数据,只能使用action。

主要掌握点

  1. Mobx 的基本功能就是“观察者模式”
  2. decorator 是“装饰者模式”在 JavaScript 语言中的实现
  3. Mobx 通常利用 decorator 来使用
  4. 如何利用 mobx-react 来管理 React组件的状态

四、不同方式的对比

  Redux 认为,数据的一致性很重要,为了保持数据的一致性,要求Store 中的数据尽量范式化,也就是减少一切不必要的冗余,为了限制对数据的修改,要求 Store 中数据是不可改的(Immutable),只能通过 action 触发 reducer 来更新 Store。

  Mobx 也认为数据的一致性很重要,但是它认为解决问题的根本方法不是让数据范式化,而是不要给机会让数据变得不一致。所以,Mobx 鼓励数据干脆就“反范式化”,有冗余没问题,只要所有数据之间保持联动,改了一处,对应依赖这处的数据自动更新,那就不会发生数据不一致的问题。

主要区别:

  1. Redux 鼓励一个应用只用一个 Store,Mobx 鼓励使用多个 Store;
  2. Redux 使用“拉”的方式使用数据,这一点和 React是一致的,但 Mobx 使用“推”的方式使用数据,和 RxJS 这样的工具走得更近;
  3. Redux 鼓励数据范式化,减少冗余,Mobx 容许数据冗余,但同样能保持数据一致。

适用场景:

Mobx 应用小而简单  快速开发

Redux 大而复杂  需要长期维护

  当然随着react的不断更新发展,也有可能出现react内部的数据共享机制。

原文地址:https://www.cnblogs.com/dfzc/p/11404618.html

时间: 2024-10-10 20:17:38

react数据管理的相关文章

react 数据管理之state思想指南

react的数据管理库有不少,最常听到的可能是mobx redux altjs之类的,当然还有很多其他,可以自己搜索. 为什么需要数据管理库呢,因为react本身只是为了实现view的表现,而不是数据的管理. 而数据类库就是为了实现react的不能之数据管理.也就是model层的分区管理.这个model层你可以实现对后台数据的引入和输送到view层的展示,还有可以依靠数据的改变触发view层的展现的改变,从而实现前端视觉状态的改变和复杂展示.动态展示等,所以我们需要有一个数据类库如mobx来帮我

react中数据管理:react-redux和redux的使用

---------------根模块App.js中import {Provider} from 'react-redux'; import store from './store';import Header from './header/Header.js'; class App extends Component { render (){ return ( <Provider store={store}> //Provider将store里面的数据提供给Provider包含的所有模块使用

使用React重构百度新闻webapp前端

http://wangfupeng.coding.me/share/2016/08/06/restruct-bdnews-webapp-by-react.html 声明 本文仅仅是对前几个月使用React重构百度新闻webapp项目的一个总结和思考,不会泄露任何项目代码(文章中的代码都是fis3或其他开源产品的配置代码,fis3是百度开源产品),因此“伸手党”可绕行. 现在2016年8月,web前端技术这几年变化太快,因此一些信息的时效性非常重要,还是把时间写上比较好. 项目介绍 百度新闻的 w

React Native在特赞的应用与实践

基于React技术栈构建开发前端项目,并使用React Native开发特赞移动APP 目前正在使用Node.js开发和维护特赞服务网关,希望Node.js能够在更轻量级的微服务架构中发挥重要作用 课程介绍: 课程摘要: APP开发技术的选型 React Native开发过程中的主要问题 异常监控.热更新与RN性能优化 距离过年还有一个月不到,产品突然提出一个需求说,咱们要不做一个IOS应用吧,快过年了,给设计师一个新礼物吧.当时我的内心其它是拒绝的,于是我面带微笑着说:“好啊,我们尽量吧...

浅析react中间件机制

看过react的人都知道, react是一个view层的展现库,要想实现对页面数据和路由的管理还需要配合其它的库.这其中最常用的就是redux和react-router库. 通过redux库能够统一管理页面数据,保证数据的单向流动,其大概流程是 用户触发页面交互,页面根据用户交互产生一个action并将这个action通过store的dispatch方法传给 sotre,store根据一定关系找到reducer,reducer根据action的type类型产生新的state值并将新产生的stat

React +Redux+ Ant Design + echarts 项目实践

项目框架 采用React.js作为项目的框架 采用redux作为数据管理的框架 采用antd作为项目的UI组件 采用echarts完成项目中折线图的绘制 个人项目工作流程总结 拿到UI高保真图片之后先对整个页面进行模块化分,大的模块分为上部的折现图部分,中间部分的网元的拓扑图部分,下部分表格部分以及表格点击后的弹出层部分.每个模块有可以再次细分为模块的头部(头部数据基本不变化),以及模块的内容展示部分. 基本就这样把整个页面细分成不同的组件模块,子组件又可以组成父组件,大的父组件完整组合成整个页

【腾讯Bugly干货分享】React移动web极致优化

本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/579083d1c9da73584b02587d 最近一个季度,我们都在为手Q家校群做重构优化,将原有那套问题不断的框架换掉.经过一些斟酌,决定使用react 进行重构.选择react,其实也主要是因为它具有下面的三大特性. React的特性 1.Learn once, write anywhere 学习React的好处就是,学了一遍之后,能够写web, node直出,以及nat

React 组件性能优化探索实践

转自:http://www.tuicool.com/articles/Ar6Zruq React本身就非常关注性能,其提供的虚拟DOM搭配上Diff算法,实现对DOM操作最小粒度的改变也是非常的高效.然而其组件渲染机制,也决定了在对组件进行更新时还可以进行更细致的优化. react组件渲染 react的组件渲染分为初始化渲染和更新渲染. 在初始化渲染的时候会调用根组件下的所有组件的render方法进行渲染,如下图(绿色表示已渲染,这一层是没有问题的): 但是当我们要更新某个子组件的时候,如下图的

React.js 是什么?

在相当长的一段时间内,我很努力地去尝试理解 React 是什么以及它在应用架构上的健壮程度.这篇文章解答了我希望别人为我解答的疑惑. React 是什么? 和 Angular,Ember,Backbone 等等比起来 React 的表现如何?要如何处理数据?要如何连接服务器?JSX 到底是什么?“组件”又是如何定义的? 停. 立刻停下来. React 仅仅是 VIEW 层. React 通常和其他的 JavaScript 框架同时被提及,但是说“React 对比 Angular”却讲不通,因为它