内容简介:redux将整个应用的state存储到一个store中,当用户触发一个action的时候,通过调用store.dispatch(action)来触发sotre中定义好的 reducers 最终更新引用的state。下面我会对每个概念进行介绍
安装
npm install redux
核心概念
redux将整个应用的state存储到一个store中,当用户触发一个action的时候,通过调用store.dispatch(action)来触发sotre中定义好的 reducers 最终更新引用的state。
- store 用来存储整个应用的 state
- state 一个用来描述应用状态的对象
- action 一个对象用来描述程序发生的动作
- reducer 是更改state的纯函数接受 state 和action参数最后返回新的state
下面我会对每个概念进行介绍
三大原则
- 单一的数据来源,整个应用程序的状态存储在单个store 中
- state 对象是只读的改变state 的唯一方式是发出一个action
- 如何通过action改变state,通过编写春函数reducer 来实现
Actions
action
是将数据发送的 store
的有效负载,他们是store数据的唯一来源通过 store.dispatch()
将数据发送的store
action 是一个普通的js对象,action必须指定一个 type 属性用来描述执行的操作。
{ type: 'ADD_TODO', text: 'Build my first Redux app' }
Action Creators
action creators 是返回一个action 的方法,这样写可以方便开发和测试。
function addTodo(text) { return { type: ADD_TODO, text } } dispatch(addTodo('eat'))
Reducers
Reducers是指定状态树如何响应 dispatch 到store 的action的,action只是用来描述发生的动作,不描述状态的变化。
首先确定state的数据的格式
{ todos: [ { text: 'Consider using Redux', completed: true } ] }
确定state的数据格式之后我们就可以编写一个reducer,reducer 是一个纯函数接收state和action返回新的state
const initialState = { todos: [] } function todoApp(state = initialState, action) { switch (action.type) { case 'ADD_TODO': return Object.assign({}, state, { todos: [ ...state.todos, { text: action.text, completed: false } ] }) default: return state } }
注意我们使用Object.assign()返回一个新的状态,不改变参数中的state 的值
分割 Reducers
当我们应用程序的action比较多每个action在reducers中的逻辑比较复杂的时候,如果还像我们上面一直使用 switch case 可以想象我们的reducers会变的非常的长,此时我们就需要对一些复杂的操作进行分割,分割的规则是根据 state 的节点操作进行分割,针对每个节点的操作写一个reducers然后使用 combineReducers
方法进行合并。
例如
import { combineReducers } from 'redux' import { ADD_TODO, TOGGLE_TODO, SET_VISIBILITY_FILTER, VisibilityFilters } from './actions' const { SHOW_ALL } = VisibilityFilters function visibilityFilter(state = SHOW_ALL, action) { switch (action.type) { case SET_VISIBILITY_FILTER: return action.filter default: return state } } function todos(state = [], action) { switch (action.type) { case ADD_TODO: return [ ...state, { text: action.text, completed: false } ] default: return state } } const todoApp = combineReducers({ visibilityFilter, todos }) export default todoApp
Store
在redux 应用程序中只能有一个store,使用store可以将上面的reducers和actions进行组合,然后进行操作。
创建一个store
redux提供了一个createStore接收一个reducers参数,最终返回一个store,我们将之前定义好的reducers引入,然后传入createStore 就可以了。
import { createStore } from 'redux' import todoApp from './reducers' const store = createStore(todoApp)
store 提供的方法
- getState() 获取store中的状态树
- dispatch(action) 发送action 更新action
- subscribe(listener) 订阅监听返回一个unsubscribe函数用来取消订阅
react-redux
安装
npm install --save react-redux
Provider
<provider />
是redux提供的一个组件,这个组件 有一个props store (上面文档中创建出来的store)
, 这个组件可以使,使用connect()函数嵌套的组件能访问redux中的store。
用法
import React from 'react' import ReactDOM from 'react-dom' import { Provider } from 'react-redux' import { App } from './App' import createStore from './createReduxStore' const store = createStore() ReactDOM.render( <Provider store={store}> <App /> </Provider>, document.getElementById('root') )
connect
connect
函数用于把redux 的store 和react 的组件连接到一起,他返回的是一个包装函数,这个函数的参数是一个react的组件,这个函数将会返回一个 包装组件。
function connect(mapStateToProps?, mapDispatchToProps?, mergeProps?, options?)
例子
import { addTodo } from './actionCreators' const mapDispatchToProps = { addTodo } const mapStateToProps = (state, ownProps) => ({ todo: state.todos[ownProps.id] }) export default connect( mapStateToProps, mapDispatchToProps )(TodoApp)
mapStateToProps?: (state, ownProps?) => Object
state为redux的状态树,ownProps是链接组件的props
如果此方法有一个参数,在redux的state发生变化的时候会调用函数,如果此方法有两个参数,此方法将会在连接组件的props或者redux的state发生变化的时候调用。
此方法返回一个对象,
此对象(通常称为stateProps)将合并为连接组件的 props
。如果定义mergeProps,它将作为mergeProps的第一个参数提供。
mapDispatchToProps?: Object | (dispatch, ownProps?) => Object
dispatch 即 store中的dispatch 通过传入一个action给变store中的state数据
ownProps 即 链接组件的 props
您的mapDispatchToProps函数应返回一个对象。对象的每个字段都应该是一个函数,调用哪个函数可以dispatch 一个action 到store。
mapDispatchToProps函数的返回被视为dispatchProps。它将作为props合并到您连接的组件。如果定义mergeProps,它将作为mergeProps的第二个参数提供。
mergeProps?: (stateProps, dispatchProps, ownProps) => Object
如果指定,则定义如何确定自己的包装组件的最终props。如果您不提供mergeProps,则默认情况下,您的包装组件会收到{... ownProps,... stateProps,... dispatchProps}。
mergeProps的返回值称为mergedProps,字段将用作包装组件的props。
options?: Object
暂未使用
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 一文读懂监督学习、无监督学习、半监督学习、强化学习这四种深度学习方式
- 学习:人工智能-机器学习-深度学习概念的区别
- 统计学习,机器学习与深度学习概念的关联与区别
- 混合学习环境下基于学习行为数据的学习预警系统设计与实现
- 学习如何学习
- 深度学习的学习历程
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Clojure编程
Chas Emerick、Brian Carper、Christophe Grand / 徐明明、杨寿勋 / 电子工业出版社 / 2013-3-26 / 99.00元
Clojure是一种实用的通用语言,它是传奇语言LISP的方言,可与Ruby、Python等动态语言相媲美,更以无缝Java库、服务,以及拥有JVM系统得天独厚的资源优势而胜出。本书既可以用来熟悉Clojure基础知识与常见例子,也可了解其相关的实践领域与话题,更可以看到这一JVM平台上的LISP如何帮助消除不必要的复杂性,为大家在编程实践中解决最具挑战性的问题开辟新的选择——更具灵活性,更适于W......一起来看看 《Clojure编程》 这本书的介绍吧!