是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