c
c
class
Search…
⌃K

Redux 基本概念2

使用React連結Redux

到19章先輸入npm install安裝package.json寫的模組
這章的幾個資料夾是延續我們上一張React的結構
之後安裝使用redux所需要的模組
npm install --save redux react-redux react-router-redux redux-logger
之後我們執行,然後看著程式碼進行講解

client.js

1.使用Provider包住router,之後元件使用connect即可獲得Redux store
2.syncHistoryWithStore讓瀏覽器的location同步到store中

元件中

1.使用connect把Redux的store與元件結合
export default connect((state) => state ,{ FilterTodo })(FliterLink)
//第一個參數,等同為把整個store的state訂閱了,如果store發生改變則此元件也會更新
//如果改為(state) => state.apple 則只會訂閱有關store中apple的部分,只有store 的apple更新了才會更新組件
//第二個參數是把action 轉為可以dispatch出去的function,之後即可使用this.props.FilterTodo即個發出action
//或是可寫this.props.dispatch(FilterTodo(this.props.filter));
//如果connect第二個參數沒寫,則dispatch會加入到this.props中即可使用上行所述去發出action

store

1.
let finalCreateStore = compose(
applyMiddleware(thunk,logger())
)(createStore)
//用來加入一些middleware
2.
let initialState = {
visbility:'SHOW_ALL',
todos:[{
id:0,
completed: false,
text:'initial for demo'
}]
}
function configureStore(initialState){
return finalCreateStore(reducer,initialState)
}
//把初始的state與reducer做結合
3.
let store = configureStore(initialState)
export default store
//最後輸出store

操作非同步動作(Async)

例如:
我們今天有一個按鈕,點擊後發出action去跟server要資料,回傳資料後再觸發一個action去更新state

使用Redux-thunk

npm install redux-thunk
將store.js改為
import {applyMiddleware,compose,createStore} from "redux"
import reducer from './reducer'
import logger from 'redux-logger'
import thunk from 'redux-thunk'
let initialState = {
visbility:'SHOW_ALL',
todos:[{
id:0,
completed: false,
text:'initial for demo'
}]
}
let finalCreateStore = compose(
applyMiddleware(thunk,logger())
)(createStore)
function configureStore(initialState){
return finalCreateStore(reducer,initialState)
}
let store = configureStore(initialState)
export default store
之後我們action.js裡面寫的方法不只可以return物件,還可以return function
這個function就是用來寫非同步API,最後拿回資料再寫return,之後即會送到reducer處理
例如:
FilterTodo:(filter) => {
return({
type:'SET_VISBILITY_FILTER',
filter:filter
})
},
///上面是一般的action,下面是thunk的action
con:() => {
return (dispatch, getState)=>{
console.log(getState())
}
}
我們可以把action加上如下
con:() => {
return (dispatch, getState) => {
console.log('現在的Store是');
console.log(getState());
}
}
之後TodoList.js加入
<button onClick={() => this.props.dispatch(action.con())} />

Redux Devtools

1.到chrome extension 下載Redux Devtools
2.在程式的store.js中改為如下
let finalCreateStore = compose(
applyMiddleware(thunk,logger()),window.devToolsExtension ? window.devToolsExtension() : f => f
)(createStore)
function configureStore(initialState){
return finalCreateStore(reducer,initialState)
}
let store = configureStore(initialState)
export default store
3.開啟網頁即可看到chrome extension的redux devtools亮起,即可點選開啟
--試著發出一些action然後點選最下方第七個時鐘圖案,即可看到他可以重播我們做過的action
--也可點選chart去做查看
--可點上方的做過的action的JUMP按鈕,之後可到當時的情況,但JUMP過去後不可再做改變,也就是點選畫面會沒反應,必須再JUMP回最新的action才能繼續對畫面做點選(原因是設計者要讓我們可以觀看過去但不可更改,否則後續的流程都會亂掉)