### Store
在前面的章節中,我們學會了使用 action 來描述“發生了什么”,和使用 reducers 來根據 action 更新 state 的用法。
Store 就是把它們聯系到一起的對象。Store 有以下職責:
維持應用的 state;
* 提供 getState() 方法獲取 state;
* 提供 dispatch(action) 方法更新 state;
* 通過 subscribe(listener) 注冊監聽器;
* 通過 subscribe(listener) 返回的函數注銷監聽器。
再次強調一下 Redux 應用只有一個單一的 store。當需要拆分數據處理邏輯時,你應該使用 reducer 組合 而不是創建多個 store。
根據已有的 reducer 來創建 store 是非常容易的。在前一個章節中,我們使用 combineReducers() 將多個 reducer 合并成為一個。現在我們將其導入,并傳遞 createStore()。
~~~
import { createStore } from 'redux'
import todoApp from './reducers'
let store = createStore(todoApp)
~~~
createStore() 的第二個參數是可選的, 用于設置 state 初始狀態。這對開發同構應用時非常有用,服務器端 redux 應用的 state 結構可以與客戶端保持一致, 那么客戶端可以將從網絡接收到的服務端 state 直接用于本地數據初始化。
`let store = createStore(todoApp, window.STATE_FROM_SERVER)`
### 發起 Actions
現在我們已經創建好了 store ,讓我們來驗證一下!雖然還沒有界面,我們已經可以測試數據處理邏輯了。
~~~
import {
addTodo,
toggleTodo,
setVisibilityFilter,
VisibilityFilters
} from './actions'
// 打印初始狀態
console.log(store.getState())
// 每次 state 更新時,打印日志
// 注意 subscribe() 返回一個函數用來注銷監聽器
const unsubscribe = store.subscribe(() =>
console.log(store.getState())
)
// 發起一系列 action
store.dispatch(addTodo('Learn about actions'))
store.dispatch(addTodo('Learn about reducers'))
store.dispatch(addTodo('Learn about store'))
store.dispatch(toggleTodo(0))
store.dispatch(toggleTodo(1))
store.dispatch(setVisibilityFilter(VisibilityFilters.SHOW_COMPLETED))
// 停止監聽 state 更新
unsubscribe();
~~~
可以看到 store 里的 state 是如何變化的:
可以看到,在還沒有開發界面的時候,我們就可以定義程序的行為。而且這時候已經可以寫 reducer 和 action 創建函數的測試。不需要模擬任何東西,因為它們都是純函數。只需調用一下,對返回值做斷言,寫測試就是這么簡單。

源碼
~~~
index.js
import { createStore } from 'redux'
import todoApp from './reducers'
let store = createStore(todoApp)
~~~
下一步
在創建 todo 應用界面之前,我們先穿插學習一下數據在 Redux 應用中如何流動的。
- js
- js繼承
- keyCode
- 好的網站
- 零散知識點-js
- This
- 對象深拷貝和淺拷貝
- 數組方法
- 數組的深拷貝和淺拷貝
- JS 引擎的執行機制
- js中的new
- 常用正則
- 函數柯里化
- 會修改當前數組的方法
- 不會修改當前數組的方法
- 函數式編程
- 循環遍歷
- 基礎知識
- 異步
- js知識總結
- fileReader
- HTML
- 零散知識點
- html5新特性
- viewport
- CSS
- cursor
- css3新特性
- 水平居中
- 垂直居中
- display解析
- 塊級元素和行內元素
- css技巧和方法
- 清除浮動
- Less
- Sass
- 綜合
- 微信小程序
- 前端面試
- CSS-面試
- JS-面試
- js-web-api
- js知識
- MVC-面試
- jQuery與框架的區別
- 閉包
- promise
- http狀態碼
- cdn
- 離線存儲
- 事件
- web安全
- 性能優化
- 響應式
- 服務器渲染和本地渲染
- 模板是什么?
- VUE流程
- 瀏覽器渲染過程
- this的指向
- new的使用
- HTML-面試
- title和alt區別
- html5元素
- h5新特性
- 圖片格式
- 零散面試總結
- react
- 生命周期-react
- state
- props
- 組件通信
- 虛擬DOM
- 源碼分析
- webstorm-template
- element與component區別
- 組件的理解
- JXS
- vue與react區別
- 16.8版本
- vue
- 生命周期-vue
- 實現流程
- webpack
- 概念
- 入口起點
- 出口
- loader
- 模式
- 插件
- manifest
- redux
- 介紹
- 核心概念
- 三大原則
- 基礎
- action
- reducer
- store
- 數據流
- 高級
- 異步action
- 異步數據流
- middleware
- ES6阮一峰
- ...
- let
- es6箭頭函數
- const
- 塊級作用域
- 頂層對象的屬性
- global 對象
- 變量的解構賦值
- 字符串的擴展
- promise對象
- 正則的擴展
- 數值的擴展
- Math對象的擴展
- 函數的擴展
- 數組的擴展
- 對象的擴展
- symbol
- async函數
- class的基本用法
- Class 的繼承
- Set 和 Map 數據結構
- 開發工具
- 好用的軟件
- chrome插件
- 其他實用工具
- 微信公眾號-前端早讀課
- 【第1352期】map和reduce,處理數據結構的利器
- 微信公眾號-前端大全
- JS 的執行機制
- 一篇文章理解 JS 繼承
- 瀏覽器
- 緩存
- 《Webkit技術內幕》之頁面渲染過程
- 跨域
- 安全
- XSS
- 設計模式
- 發布訂閱模式
- 工廠模式
- MV*模式
- 觀察者模式
- react-router
- 一些小技巧
- js一些小算法
- 1.已知一個數組中的值,在另外一個數組中查找該值
- 累加器
- 數組隨機
- 數組扁平化并去重排序
- Immutable
- 常用命令
- hybrid
- schema封裝
- typescript