react学习笔记系列(四)(react-redux)

redux模式的原理此处不再赘述,以下主要参考了Redux详解,以及阮一峰老师的博客,其他内容可以参考我的前一篇博客:react学习笔记系列(二)

  • redux是什么?

类比vux,就是状态管理

  • redux的设计思想

(1)Web 应用是一个状态机,视图与状态是一一对应的。

(2)所有的状态,保存在一个对象里面。

  • 使用场景

 

  1. 用户的使用方式复杂
  2. 不同身份的用户有不同的使用方式(比如普通用户和管理员)
  3. 多个用户之间可以协作
  4. 与服务器大量交互,或者使用了WebSocket
  5. View要从多个来源获取数据
  6. 某个组件的状态,需要共享;某个状态需要在任何地方都可以拿到;一个组件需要改变全局状态;一个组件需要改变另一个组件的状态
  • 基本概念
  • Store:保存数据的地方,你可以把它看成一个容器。整个应用只能有一个 Store。Redux 提供createStore这个函数,用来生成 Store。
  • State:store对象中的定义的初始数据(初始状态)。Store对象包含所有数据。如果想得到某个时点的数据,就要对 Store 生成快照。这种时点的数据集合,就叫做 State。当前时刻的 State,可以通过store.getState()拿到。reducer里面定义初始状态,它是reducer函数的第一个参数
  • Action:是一个对象用来描述当前发生的事情,action就是视图View发出的通知,表示state要发生改变;Action 是一个对象。其中的type属性是必须的,表示 Action 的名称。
const action = {
  type: 'ADD_TODO', //Action 的名称是ADD_TODO
  payload: 'Learn Redux' //携带的信息是字符串Learn Redux。
};
  • Action creator:View 要发送多少种消息,就会有多少种 action;通过action creator(action 创建函数)生成action,用来改变state状态。它是reducer函数的第二个参数
  • store.dispatch()View发出action的唯一方法,store.dispatch接受一个 action对象作为参数,将它发送出去。
import { createStore } from 'redux';
const store = createStore(fn);

store.dispatch({
  type: 'ADD_TODO',
  payload: 'Learn Redux'
});
  • Reducer:定义state改变的规则即:store收到action后,必须给出新的state,这样view才会发生变化;这种state的计算过程就叫做reducer;Reducer 是一个函数,它接受 Action 和当前 State 作为参数,返回一个新的 State。
const defaultState = 0;
const reducer = (state = defaultState, action) => {
  switch (action.type) {
    case 'ADD':
      return state + action.payload;
    default: 
      return state;
  }
};

const state = reducer(1, {
  type: 'ADD',
  payload: 2
});

实际应用中,Reducer 函数不用像上面这样手动调用,store.dispatch方法会触发 Reducer 的自动执行。为此,Store 需要知道 Reducer 函数,做法就是在生成 Store 的时候,将 Reducer 传入createStore方法。也就是说:

import { createStore } from 'redux';
const store = createStore(reducer);

为什么叫reducer呢:因为它可以作为数组的reduce方法的参数

const actions = [
  { type: 'ADD', payload: 0 },
  { type: 'ADD', payload: 1 },
  { type: 'ADD', payload: 2 }
];

const total = actions.reduce(reducer, 0); // 3

由于 Reducer 是纯函数,就可以保证同样的State,必定得到同样的 View。但也正因为这一点,Reducer 函数里面不能改变 State,必须返回一个全新的对象(利用es6的扩展运算符)


// State 是一个对象
function reducer(state, action) {
  return Object.assign({}, state, { thingToChange });
  // 或者
  return { ...state, ...newState };
}

// State 是一个数组
function reducer(state, action) {
  return [...state, newItem];
}
  • store.subscribe()Store 允许使用store.subscribe方法设置监听函数,一旦 State 发生变化,就自动执行这个函数。store.subscribe方法返回一个函数,调用这个函数就可以解除监听。有关于store的实现,reducer的拆分,待细看

  • redux的中间件:

定义:中间件就是一个函数,对store.dispatch方法进行了改造,在发出 Action 和执行 Reducer 这两步之间,添加了其他功能。

常用的中间件:redux-logger:用来打印日志

import createLogger from 'redux-logger';

有关于react-redux:

  • UI component & container component

※dumb component(es5写法stateless component)

  • 只负责 UI 的呈现,不带有任何业务逻辑
  • 没有状态(即不使用this.state这个变量)
  • 所有数据都由参数(this.props)提供
  • 不使用任何 Redux 的 API
const Title =
  value => <h1>{value}</h1>;

※smart component

  • 负责管理数据和业务逻辑,不负责 UI 的呈现
  • 带有内部状态
  • 使用 Redux 的 API

React-Redux 规定,所有的 UI (dumb)组件都由用户提供,容器组件(smart)则是由 React-Redux 自动生成。也就是说,用户负责视觉层,状态管理则是全部交给它。

  • connect:React-Redux 提供connect方法,用于从 UI 组件生成容器组件。connect的意思,就是将这两种组件连起来。

(1)输入逻辑:外部的数据(即state对象)如何转换为 UI 组件的参数

(2)输出逻辑:用户发出的动作如何变为 Action 对象,从 UI 组件传出去。

 

import { connect } from 'react-redux'

const VisibleTodoList = connect(
  mapStateToProps,
  mapDispatchToProps
)(TodoList)
// 容器组件的代码
//    <FilterLink filter="SHOW_ALL">
//      All
//    </FilterLink>

const mapStateToProps = (state, ownProps) => {
  return {
    active: ownProps.filter === state.visibilityFilter
  }
}

//mapStateToProps是一个函数,它接受state作为参数,返回一个对象。mapStateToProps的第一个参数总是state对象,还可以使用第二个参数,代表容器组件的props对象。
//mapStateToProps会订阅 Store,每当state更新的时候,就会自动执行,重新计算 UI 组件的参数,从而触发 UI 组件的重新渲染。
//mapDispatchToProps是connect函数的第二个参数,用来建立 UI 组件的参数到store.dispatch方法的映射。也就是说,它定义了哪些用户的操作应该当作 Action,传给 Store。它可以是一个函数,也可以是一个对象。

上面代码中,connect方法接受两个参数:mapStateToPropsmapDispatchToProps。它们定义了 UI 组件的业务逻辑。前者负责输入逻辑,即将state映射到 UI 组件的参数(props),后者负责输出逻辑,即将用户对 UI 组件的操作映射成 Action

  • <Provider> 组件

connect方法生成容器组件以后,需要让容器组件拿到state对象,才能生成 UI 组件的参数。React-Redux 提供Provider组件,可以让容器组件拿到state

References:

使用真正的 Redux 和 React-redux

Redux详解

Redux 入门教程(一):基本用法

Redux 入门教程(二):中间件与异步操作

Redux 入门教程(三):React-Redux 的用法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值