React与Redux学习总结(一)

0、React 的事件绑定

React 并未把事件绑定在特定的 DOM 节点上,实际上它是用事件代理的方式在最外层绑定了一个事件回调,当组件 unmounted 的时候,这个事件回调会被自动删除。

(1)组件的生命周期

image

(2)state 设计原则(最小化设计原则

这几种数据不应该包含到 state 中:

  • 可以由 state 计算得出的数据
  • 组件
  • props 中的数据
(3)Virtual DOM 用 JavaScript 对象来表述 DOM 元素。
1、对组件的拆分

React-Redux将组件分为 UI 组件(presentational component)和容器组件(container component)。

(1)UI 组件/无状态函数式组件(stateless functional component)
  • 关心应用的外观
  • 可能会包含展示组件或容器组件,除此之外常常还会包含属于组件自身的 DOM 节点与样式信息
  • 常常允许通过 this.props.children 实现嵌套
  • 对应用的其余部分(如 Flux action 及 store)没有依赖
  • 不会指定数据如何加载或改变
  • 只通过 props 获取数据与行为(回调函数)
  • 极少会包含自身的状态(state),如果有,一定是界面状态而非数据
  • 一般都携程函数式组件(functional component),除非需要包含状态、生命周期钩子或性能优化
  • 典型的例子:Page、Sidebar、Story、UserInfo、List

例子:
const Item = ({text}) => (<span>{text}</span>)

(2)容器组件
  • 关心应用如何工作
  • 可能会包含展示组件或容器组件,但通常不会包含 DOM 节点(除包裹用的 div 外),一定不会包含样式信息。
  • 为展示组件或其他容器组件提供数据与行为(回调函数)
  • 调用 Flux action,并将其作为提供给展示组件的回调函数
  • 往往是有状态的,扮演数据源的角色
  • 往往无须手工实现,而是通过高级组件生成,如 react-redux 提供的 connect()、Relay 提供的 createContainer() 及 FluxUtils 提供的 Container.create()等
  • 典型的例子:UserPage、FollowersSidebar、StoryContainer、FollowedUserList

如果一个组件既有 UI 又有业务逻辑,就需要将它拆分为: 外面是一个容器组件,里面是一个 UI 组件。前者负责与外部通信,将数据传递给后者,后者负责渲染 view 。
总之,UI 组件负责 UI 的呈现,容器组件负责管理数据和逻辑。

2、connect() / 高阶组件(higher-order-components/enhancer)
  • 输入逻辑:外部的数据(即 state 对象)如何转换为 UI 组件的参数
  • 输出逻辑:用户发出的动作如何变为 Action 对象,从 UI 组件传出去
  • 接收一个已有的组件作为参数,并返回一个新的组件,后者将前者封装于内部。
  • 经过 enhancer 处理得到的组件,能够直接接触到 store,监听、读取状态数据并触发action。
import { connect } from 'react-redux'

const VisibleTodoList = connect(
  mapStateToProps,
  mapDispatchToProps
)(TodoList)

connect方法接受两个参数,mapStateToPropsmapDispatchToProps。他们定义了 UI 组件的业务逻辑。mapStateToProps 负责 state 映射到 UI 组件的参数 props,mapDispatchToProps 负责用户对 UI 组件的操作映射成 Action。

(1)mapStateToProps()

mapStateToProps是一个函数,用于建立一个从(外部的)state 对象到(UI组件的)props对象的映射关系。
mapStateToProps会订阅 Store,每当 state 更新的时候,会自动执行,重新计算 UI 组件的参数,从而触发 UI 组件的重新渲染。
mapStateToProps 的第一个参数总是 state 对象,还可以使用第二个参数,代表容器组件的 props 对象。

connect 方法可以省略 mapStateToProps 参数,这样 UI 组件就不会订阅 Store,导致 Store 的更新不会引起 UI 组件的更新。

接收的参数 state (即 store.getState() 的结果),返回一个普通的 JavaScript 对象,对象的内容会被合并到最终的展示组件上。简单来说, mapStateToProps 就是从全局的状态数据中挑选、计算得到展示组件(UI 组件)所需数据的过程,即从 state 到组件属性的映射,正如其名。

(2)mapDispatchToProps()

如果 mapDispatchToProps 是一个函数,会得到 dispatch 和 ownProps (容器组件的 props 对象)两个参数。
mapDispatchToProps作为函数会返回一个对象,该对象的每个键值对都是一个映射,定义了 UI 组件的参数如何发出 Action。

mapDispatchToProps 接收参数 dispatch(正是 store 的 dispatch 方法),并返回一个普通的 JavaScript 对象,对象的内容也会被合并到最终的展示组件上。mapDispatchToProps 一般用于生成行为属性。

(3) UI 组件通过 enhancer 成为容器组件
(4) 总有一些组件,它们应该从父级通过属性获得部分或全部信息,另外一些组件,它们通过 connect 方法直接获取全局唯一的状态数据。
3、<Provider>组件

connect 方法生成容器组件后,需要容器拿到 state 对象,这样才能生成 UI 组件的参数。React-Redux 提供了 Provider 组件,可以让容器组件拿到 state。
Provider 在根组件外面包一层,这样 App 的所以子组件就默认都可以拿到 state 了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值