React
特点
1)专注视图层:专注于提供清晰、简洁的视图层解决方案,并且包括 View 和 Controller 的库(Redux)
2)Virtual DOM:提升性能,方便和其他平台集成(可以映射出对应的原生控件,react-native -> web、android、ios)
3)函数式编程:充分利用很多函数式方法去减少冗余代码
JSX
虚拟元素:构建与更新都是在内存中完成的,并不会真正渲染到 DOM 中去
1)DOM 元素:对应原生 DOM 元素,被表示成纯粹的 JSON 对象
2)组件元素:对应原生自定义元素,封装一种构建组件元素的公共方法,方法名对应 DOM 元素类型,参数对应 DOM 元素属性
JSX:将HTML语法直接加入到JavaScript代码中,再通过翻译器(Babel)转换为纯JavaScript由浏览器执行(省去了构建Json的烦琐过程,更易于阅读与开发)
1)基本语法:定义标签时,只允许被一个标签包裹;标签一定要闭合
2)元素类型:小写首字母对应 DOM 元素,大写首字母对应组件元素
3)元素属性:DOM 元素属性(标准规范属性,例外:class 改为 className、for 改为 htmlFor、style 值必须是对象),组件元素属性(由标准写法改为小驼峰写法,是完全自定义的属性,也可以理解为实现组件所需要的参数),属性转义(React避免转义:<div dangerouslySetInnerHTML={{__html: 'cc © 2015'}} />)
React 组件
组成:属性(props)、状态(state)、生命周期方法
构建方法:React.createClass、ES6 class、无状态函数(无状态组件)
React 数据流
在 React 中,数据是自顶向下单向流动的,即从父组件到子组件
智能组件、木偶组件
state:只关心每个组件自己内部的状态,这些状态只能在组件内改变
props:如果顶层组件初始化 props,那么 React 会向下遍历整棵组件树,重新尝试渲染所有相关的子组件
React 生命周期
挂载:componentWillMount 方法在 render 方法之前执行,componentDidMount 方法在 render 方法之后执行,都只会在组件初始化时运行一次
卸载:componentWillUnmount 方法在卸载前执行
更新:
自身 state 更新,会依次执行 shouldComponentUpdate(nextProps,nextState)、componentWillUpdate(nextProps,nextState)、render、componentDidUpdate(prevProps,prevState)
父组件 props 更新,先执行 componentWillReceiveProps(nextProps) 方法
React 与 DOM
事件系统
合成事件:事件委派(使用一个统一的事件监听器)、自动绑定(绑定 this 为当前组件,并且缓存这种引用,在使用 ES6 classes 或者纯函数时,需要手动实现 this 的绑定)
组件间通信
- 父组件向子组件通信:props
- 子组件向父组件通信:回调函数、自定义事件机制
- 跨级组件通信:context(父:getChildContext(){return {color: 'red'}},子:const myColor = this.context.color)
- 没有嵌套关系的组件通信:发布/订阅模式(修改和查询外部模块)
组件间抽象(一类功能需要被不同的组件公用)
- mixin
- 高阶组件:接收原始组件并返回原始组件的增强/填充版新组件的函数
组件性能优化
原理
Flux
一款用于构建用户界面的应用程序架构思想
单向数据流:数据和逻辑永远单向流动
3大组成部分:
dispatcher:负责分发事件(action)
store:负责保存数据,同时响应事件并更新数据(store 对外只暴露 getter(读取器)而不暴露 setter(设置器))
view:负责订阅(controller-view) store 中的数据,并使用这些数据渲染相应的页面( Flux 中的 view 层不能直接修改数据,必须使用 dispatcher 分发一个 action)
action:一个普通的 JavaScript 对象,一般包含 type、payload 等字段,用于描述一个事件以及需要改变的相关数据
controller-view:进行 store 与 view 层之间的绑定,定义数据更新及传递的方式
actionCreator:用来创造 action
Redux
一个“可预测的状态容器”库
Redux 应用:指使用了 redux 这个 npm 包,并结合了视图层实现(如 React)及其他前端应用必备组件(路由库、Ajax 请求库)组成的完整的类 Flux 思想的前端应用
三大原则:单一数据源、state状态是只读的、状态修改均由纯函数完成
store:在 Redux 中只有一个 store,一旦 store 接收到动作,它会将当前状态和给定动作发送给 reducer 并要求其返回一个新的状态
reducers:决定数据如何改变的逻辑以纯函数的形式存在
reducer:是一个纯函数,它的职责是根据 previousState 和 action 计算出新的 state
高阶 reducer:指将 reducer 作为参数或者返回值的函数(作用:复用、增强)