React.js 入门(四)
Thinking in React
当你在创建app时, React是如何使你思考的。
- Break The UI Into A Component Hierarchy,根据设计图,用方框画划分出组件层级。以“single responsibility principle”单一责任原则,划分组件。UI和数据模型倾向于遵循相同的信息体系结构。
- Build A Static Version in React,用 React 构建一个静态版。(用已有的数据模型渲染一个不包含交互功能的 UI)通过 props 传递数据,完全不使用 state(state 仅保留用于交互)。简单例子,自上而下写组件;大型项目,自下而上写,顺便写下test case。
- Identify The Minimal (but complete) Representation Of UI State,确定 UI 所需最少的可变状态。以Don’t Repeat Yourself原则。以下情况可以排除使用 state:
- 通过 props 从父组件传进来
- 不随时间改变
- 可以基于当前组件其他 state 或 props 计算得到
- Identify Where Your State Should Live,鉴定哪个组件应该拥有这个状态,铭记 React 是单向数据流。对于应用中每一个 state,看看哪些组件需要基于它来渲染,找到公共 owner(在所有需要这个 state 的组件层级树之上)组件,如果没找到合适的组件,单独创建一个新的来 hold 这个状态
- Add Inverse Data Flow,最后通过
setState()
方法,支持反向的数据流动
用以上方式写 React 会比我们习惯的方式多一些 typing。但是请 remember that code is read far more than it’s written, and it’s less difficult to read this modular, explicit code。
比起写,代码更多地是给人看的。当你开始构建更大的组件库时,你会意识到这种代码模块化和清晰度的重要性。并且随着代码重用程度的加深,你的代码行数也会显著地减少。
React 是 one-way data flow(单向数据流)。
Redux
什么时候需要用Redux:
- 跨多层组件共享状态/数据,不好追踪,还会引起性能问题,每一个数据变动引起所有子组件重新渲染。
- 通过 hot reload 提升开发效率。
不建议使用inline style,除非需要在render time动态添加计算的样式。
file structure:一个项目中文件层级嵌套不要超过3-4层。
Virtual DOM:更多的是一种模式,而不是一种特定的技术。在 React 的话术里,经常与 React elements 相关,它们是代表UI的对象。
Redux:
- 单一 store(一个巨大的 JSON 对象)
- store中的state不可变
- 通过action触发改变
- 通过reducers更新状态
MobX:
- 可以有多个 store(许多应用设计有至少2个store,一个为当前应用设计的UI store,一个可复用的领域状态)
- 无需进一步交互的任何可从state推导出的东西,都是推导
- action是可以改变state的一段代码
- state改变时,所有推导自动更新
popularity: Redux learning curve:Mobx(Redux - Flux architecture and functional programming concepts;MobX - object-oriented programming,writing less code) data structure:MobX(Redux:纯JS对象存储state,需手动跟踪变化,更难维护大型状态;MobX使用可观察数据,通过隐式订阅自动跟踪更改) 代码量:MobX(Redux 本质上是显式的,必须对许多功能进行显式编码。MobX相比代码量少,易于学习和设置) Developer community:Redux(从github start数、npm周下载量) scalability:Redux(纯函数易扩展、测试)
如果您希望快速起步并以更少的代码构建简单的应用程序,那么选 MobX。
Redux 是 pure 的,function(state, action) => newState MobX 中状态是可变的,是 impure 的。难以测试和维护,不总是返回可预测的输出。