资讯专栏INFORMATION COLUMN

React,Redux学习笔记

lauren_liuling / 879人阅读

摘要:维护着一个全局的,并且根据来进行事件分发处理。如果想和其它框架集成,使用或者来设置定时器,或者发送请求,可以在该方法中执行这些操作。在该函数中调用将不会引起第二次渲染。在该方法中执行任何必要的清理,比如无效的定时器,或者清除在中创建的元素。

@(StuRep)2016.06.10

React的PropTypes使用方法

</>复制代码

  1. React.PropTypes.array // 数组
  2. React.PropTypes.bool.isRequired // Boolean 且必要。
  3. React.PropTypes.func // 函式
  4. React.PropTypes.number // 数字
  5. React.PropTypes.object // 对象
  6. React.PropTypes.string // 字符串
  7. React.PropTypes.node // 任何类型的: numbers, strings, elements 或者任何这种类型的数组
  8. React.PropTypes.element // React 元素
  9. React.PropTypes.instanceOf(XXX) // 某种类型的实例
  10. React.PropTypes.oneOf(["foo", "bar"]) // 其中一个字符串
  11. React.PropTypes.oneOfType([React.PropTypes.string,React.PropTypes.array]) // 其中一种格式类型
  12. React.PropTypes.arrayOf(React.PropTypes.string) // 某种类型的数组(字符串型)
  13. React.PropTypes.objectOf(React.PropTypes.string) // 具有某种属性类型的对象(字符串类型)
  14. React.PropTypes.shape({ // 是否符合指定格式的对象
  15. color: React.PropTypes.string,
  16. fontSize: React.PropTypes.number
  17. });
  18. React.PropTypes.any.isRequired // 可以是任何格式,且必要。

_

react-redux中的connect方法

</>复制代码

  1. //绑定状态到props上面
  2. function mapStateToProps(state) {
  3. return {
  4. year: state.calendarReducer.year,
  5. month: state.calendarReducer.month,
  6. day: state.calendarReducer.day
  7. }
  8. }
  9. //把action所有方法绑定到props上面,同时action具有了dispatch能力
  10. function mapDispatchToProps(dispatch) {
  11. return {actions: bindActionCreators(CalendarActions, dispatch)}
  12. }
  13. export default connect(mapStateToProps, mapDispatchToProps)(App)

mapStateToProps 监听store变化,添加这个才能让组件监听到store里面的状态;

Redux 有一个全局的state,通过将根组件包进Provider,将store分发给所有的子组件,而子组件通过connect方法,获取dispatch事件分发函数,以及需要的props(如果有需要也可以通过connect传入想分发给子组件的action)
_

如何用Redux去管理React的状态

</>复制代码

  1. 在不使用Redux的时候,React组件间的状态管理需要一层层地传递,使用Redux可以在最顶层的store中存储所有的状态,每个组件都可以获得这些状态值。
Redux主要的三部分:

Store

Action

Reducer

简单的流程:dispatch(action)把action分发到reducer,reducer更新状态然后返回到store,总的容器组件(app)从store(this.props)中获取的值有变,传给子组件的属性变化,触发render重新渲染。

action

Redux中,action主要用来传递操作State的信息,以一个js对象的形式存在,除了其中的type字段为必须的,其他字段都可以定义。如果采用直接声明action的方式,在action越来越多的时候就会很难管理,所以有了action的构造工厂:

</>复制代码

  1. //action创建函数
  2. export function getNextMonth() {
  3. return {type: GET_NEXT_MONTH}
  4. }
reducer

action用来传递信息,reducer就用来处理信息,传入一个旧的state来返回一个新的state。

reducer应该保持“纯函数”特性,入参相同,出参结果一定相同。这也是函数式编程的特点。

</>复制代码

  1. function calendarReducer(state = initialState, action) {
  2. switch (action.type) {
  3. case GET_NEXT_MONTH:
  4. return state.month >= 12 ? {...state, year: ++state.year, month: 1} : {...state, month: ++state.month};
  5. case GET_PRE_MONTH:
  6. return state.month <= 1 ? {...state, year: --state.year, month: 12} : {...state, month: --state.month};
  7. default:
  8. console.log("default calendarReducer state");
  9. return state;
  10. }
  11. }

在reducer中,需要传入一个默认的state参数,在dispatch一个action区触发state修改的时候,如果reducer中并没有匹配到该action,那就一定要返回一个旧的state,不然会造成undefined。

另外,在修改状态的时候,不要通过直接修改当前state,而是通过创建一个副本去修改,可以用ES6中的Object.assign方法:

</>复制代码

  1. return Object.assign({}, state, {
  2. XXX:XXX
  3. })

或者使用ES7提案中的对象展开运算符(...):

</>复制代码

  1. switch (action.type) {
  2. case GET_NEXT_MONTH:
  3. return state.month >= 12 ? {...state, year: ++state.year, month: 1} : {...state, month: ++state.month};
  4. case GET_PRE_MONTH:
  5. return state.month <= 1 ? {...state, year: --state.year, month: 12} : {...state, month: --state.month};
  6. default:
  7. console.log("default calendarReducer state");
  8. return state;
  9. }

在使用ES7的展开运算符的时候需要添加一个插件来支持,因为目前该语法还处于stage2阶段:

</>复制代码

  1. query: {
  2. presets: ["react", "es2015"],
  3. plugins: ["transform-object-rest-spread"]
  4. }
store

在 Redux 项目中,Store 是单一的。维护着一个全局的 State,并且根据 Action 来进行事件分发处理 State。可以看出 Store 是一个把 Action 和 Reducer 结合起来的对象。

Redux 提供了 createStore() 方法来 生产 Store,如:

</>复制代码

  1. let store = createStore(calendarApp);

react-redux 提供一个组件把整个app包在里面,以 React 组件的形式来为 Provider 注入 store,从而使得其子组件能够在上下文中得到 store 对象,共享同一个store,如:

</>复制代码

  1. let rootElement = document.getElementById("main");
  2. render(
  3. ,
  4. rootElement
  5. );

_

组件的生命周期 componentWillMount

</>复制代码

  1. componentWillMount()

服务器端和客户端都只调用一次,在初始化渲染执行之前立刻调用。如果在这个方法内调用 setStaterender() 将会感知到更新后的 state,将会执行仅一次,尽管 state 改变了。

componentDidMount

</>复制代码

  1. componentDidMount()

在初始化渲染执行之后立刻调用一次,仅客户端有效(服务器端不会调用)。在生命周期中的这个时间点,组件拥有一个 DOM 展现,可以通过 this.getDOMNode() 来获取相应 DOM 节点。

如果想和其它JavaScript 框架集成,使用setTimeout 或者setInterval 来设置定时器,或者发送 AJAX 请求,可以在该方法中执行这些操作。

componentWillReceiveProps

</>复制代码

  1. componentWillReceiveProps(object nextProps)

在组件接收到新的 props 的时候调用。在初始化渲染的时候,该方法不会调用。

用此函数可以作为 reactprop 传入之后, render() 渲染之前更新 state 的机会。老的 props 可以通过 this.props 获取到。在该函数中调用 this.setState() 将不会引起第二次渲染。

shouldComponentUpdate

</>复制代码

  1. boolean shouldComponentUpdate(object nextProps, object nextState)

在接收到新的 props 或者 state,将要渲染之前调用。该方法在初始化渲染的时候不会调用,在使用 forceUpdate 方法的时候也不会。

如果确定新的 propsstate 不会导致组件更新,则此处应该 返回 false

</>复制代码

  1. shouldComponentUpdate: function(nextProps, nextState) {
  2. return nextProps.id !== this.props.id;
  3. }

如果 shouldComponentUpdate 返回 false,则 render() 将不会执行,直到下一次 state 改变。(另外,componentWillUpdatecomponentDidUpdate 也不会被调用。)

默认情况下,shouldComponentUpdate 总会返回 true,在 state 改变的时候避免细微的 bug,但是如果总是小心地把 state 当做不可变的,在 render() 中只从 props state 读取值,此时可以覆盖 shouldComponentUpdate 方法,实现新老 propsstate 的比对逻辑。

如果性能是个瓶颈,尤其是有几十个甚至上百个组件的时候,使用 shouldComponentUpdate 可以提升应用的性能。

componentWillUpdate

</>复制代码

  1. componentWillUpdate(object nextProps, object nextState)

在接收到新的 props 或者 state 之前立刻调用。在初始化渲染的时候该方法不会被调用。
使用该方法做一些更新之前的准备工作。

componentDidUpdate

</>复制代码

  1. componentDidUpdate(object prevProps, object prevState)

在组件的更新已经同步到 DOM 中之后立刻被调用。该方法不会在初始化渲染的时候调用。
使用该方法可以在组件更新之后操作 DOM 元素。

componentWillUnmount

</>复制代码

  1. componentWillUnmount()

在组件从 DOM 中移除的时候立刻被调用。

在该方法中执行任何必要的清理,比如无效的定时器,或者清除在 componentDidMount中创建的 DOM 元素。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/90991.html

相关文章

  • react-native, react-navigation, redux 学习笔记

    摘要:的使用用户发出函数算出新的重新渲染三大原则单一数据源,利用的形式向下传播数据流决定只读,通过修改通过纯函数来修改组件状态,是描述动作的纯函数连接和基于全局的,选择我们要注入的不同的组件分开把注入,读取方法三剑客先确定一下初始状 redux的使用 react-native, react, react-redux, react-navigaition, redux-thunk, redu...

    妤锋シ 评论0 收藏0
  • 好程序员React精品项目全集:商城管理后台(视频+源码+笔记

    摘要:今天给大家带来了好程序员实战项目商城管理后台。配合项目学习会让你更快掌握它的使用方法下面就来看看好程序员这套实战项目课程介绍好程序员项目本项目是一个使用开发的商城系统的管理后台,里面登录判断,接口调用,数据展示和编辑,文件上传等后台功能。 众所周知,项目经验对于一个程序员变得越来越重要。在面...

    李世赞 评论0 收藏0
  • Redux 基础 - react 全家桶学习笔记(一)

    摘要:二基础就是一个普通的。其他属性用来传递此次操作所需传递的数据,对此不作限制,但是在设计时可以参照标准。对于异步操作则将其放到了这个步骤为添加一个变化监听器,每当的时候就会执行,你可以在回调函数中使用来得到当前的。 注:这篇是16年10月的文章,搬运自本人 blog...https://github.com/BuptStEve/... 零、环境搭建 参考资料 英文原版文档 中文文档 墙...

    aaron 评论0 收藏0
  • FE.SRC-React实战与原理笔记

    摘要:异步实战状态管理与组件通信组件通信其他状态管理当需要改变应用的状态或有需要更新时,你需要触发一个把和载荷封装成一个。的行为是同步的。所有的状态变化必须通过通道。前端路由实现与源码分析设计思想应用是一个状态机,视图与状态是一一对应的。 React实战与原理笔记 概念与工具集 jsx语法糖;cli;state管理;jest单元测试; webpack-bundle-analyzer Sto...

    PumpkinDylan 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<