是vue提供的一款store,用來存儲頁面共享數據vue
通常來講,數據分爲兩種方式ios
組件自己自身持有數據內容,並不須要外部的參與的狀況下,不須要外部數據。可是在通常來講,使用外部數據比較常見。 prop與父級緊密相關vuex
使用inject注入時,沒法有效追蹤層級時,查找內容提供者容易出錯,一般不建議跨多個層級使用typescript
暫時尚未發現,發現了再補充npm
使用vuex的目的就是提升數據的複用性,可是不能夠盲目使用vuex。promise
開打demo的store.ts 文件做爲參照網絡
export default new Vuex.Store({
state: { /* 狀態庫 */ },
mutations: { /* 同步計算庫 使用commit觸發 */ },
actions: { /* 異步計算庫 使用dispatch觸發 */ },
getters: { /* 計算屬性 */ },
modules: { /* 分模塊 */
test: {
namespaced: true, /* 開啓module模式 */
state: {
foo: "this is foo"
},
getters: {
getFoo(state) {
return state.foo;
}
},
mutations: {
setFoo(state, foo) {
state.foo = foo;
}
},
actions: {
setFoo({ commit }, foo) {
setTimeout(() => {
commit('setFoo',foo)
}, 1e3);
}
}
}
}
})
複製代碼
vuex-class
import {
State,
Getter,
Action,
Mutation,
namespace
} from 'vuex-class'
複製代碼
在咱們開啓module模式的時候,從模塊下映射須要使用到namespace異步
除
State
外,其他能夠行內書寫方式直接引用,不須要引入namespace
async
namespace的兩種使用方式ide
@Component
class MyComponent extends Vue{
@namespace('test').State foo!: string;
}
複製代碼
const TestModule = namespace("test")
@Component
class MyComponent extends Vue{
@TestModule.State foo!: string;
}
複製代碼
@State foo
和 @State("foo") foo
相同@Component
class MyComponent extends Vue{
@namespace('test').State foo!: string;
}
複製代碼
state映射到組件時,是放在computed下的,所以自己爲計算屬性。
@Component
class MyComponent extends Vue{
/* 只從 state 獲取*/
@namespace('test').State(state=>state.foo) foo!: string;
/*從state和getters上獲取*/
@namespace('test').State((state,getters)=>state.foo+'getter:'+getters.getFoo) svsgfoo!: string;
}
複製代碼
@Component
class MyComponent extends Vue{
@State("foo",{namespace:"test"}) foo!: string;
}
複製代碼
和State相似,可是不支持再次計算。
@Component
class MyComponent extends Vue{
@Getter("test/getFoo") namefoo!:string;
@Getter("getFoo",{namespace:"test"}) foo!:string;
@namespace("test").Getter getFoo!:string;
}
複製代碼
書寫方式和Getter相似
@Component
class MyComponent extends Vue{
@Action("test/setFoo") setFoo!: Function;
}
複製代碼
actions:{
async queryState({commit},token){
let result = await Axios.get("url",{data:{ token }})
commit('state',result.data)
return result.data
}
}
複製代碼
@Component
class MyComponent extends Vue{
private token:string="best";
@Action queryState!: Function;
async onQueryStateClick(){
let data = await this.queryState(this.token)
// todo ...
}
}
複製代碼
書寫方式和Action相似
@Component
class MyComponent extends Vue{
@Action("test/setFoo") setFoo!: Function;
}
複製代碼
可是mutation會當即返回結果,所以異步請求應該放在action中
更多內容 :vuex能夠參照這裏,vuex裝飾器具體可參照 vuex-class