上週末看Vuex原始碼,突發靈感,為什麼都是Vuex啊。
於是蛋疼一下午寫了一個外掛來幫助Vue可以使用Redux
Vue-with-Redux
這是一個用於幫助Vue使用Redux管理狀態的外掛。Redux是一個非常流行的狀態管理工具。vue-with-redux為大家提供一個可以在Vue環境下使用Redux的途徑。這回帶來不同的開發體驗。
開始
首先你需要通過如下命令安裝vue-with-redux
npm install -save vue-with-redux
複製程式碼
執行Demo
git clone https://github.com/ryouaki/vue-with-redux.git
npm install
npm run serve
複製程式碼
Usage
需要像下面這樣改造你的入口檔案:
// 有可能是你的entry.js檔案
... // 這裡是你引入的其它包
import VuexRedux from `vue-with-redux`;
import { makeReduxStore } from `vue-with-redux`;
import reduces from `YOUR-REDUCERS`;
import middlewares from `REDUX-MIDDLEWARES`;
Vue.use(VuexRedux);
let store = makeReduxStore(reduces, [middlewares]);
new Vue({
store,
render: h => h(App)
}).$mount(`#app`)
複製程式碼
下面是一個actionCreate函式:
export function test() {
return {
type: `TEST`
}
}
export function asyncTest() {
return (dispatch, getState) => {
setTimeout( () => {
console.log(`New:`, getState());
dispatch({type: `TEST`});
console.log(`Old`, getState());
}, 100);
}
}
複製程式碼
Note: 你並不需要使用redux-thunk,因為Vue-with-Redux已經提供了對非同步處理的支援.
這是一個reducer的例子:
function reduce (state = { count: 0 }, action) {
switch(action.type) {
case `TEST`:
state.count++;
return state;
default:
return state;
}
}
export default {
reduce
};
複製程式碼
Vue的元件例子:
<template>
<div>
<button @click="clickHandler1">Action Object</button>
<button @click="clickHandler2">Sync Action</button>
<button @click="clickHandler3">Async Action</button>
<p>{{reduce.count}}</p>
</div>
</template>
<script>
import { test, asyncTest } from `./../actions`;
export default {
name: `HelloWorld`,
props: {
msg: String
},
// 你必須在這裡預先定義你訂閱的Redux中的狀態。否則編譯模版會報錯。
data() {
return {
reduce: {}
}
},
methods: {
clickHandler1() {
this.dispatch({type: `TEST`});
},
clickHandler2() {
this.dispatch(test());
},
clickHandler3() {
this.dispatch(asyncTest());
},
// 你必須實現一個mapReduxState函式,用於告訴Vue-with-Redux你需要訂閱哪些redux中的狀態
// [ state ] 引數就是redux狀態樹的根。
mapReduxState(state) {
return {
reduce: state.reduce
}
},
}
}
</script>
複製程式碼