vuex

202 阅读2分钟

1. vue.cli项目中src目录每个文件夹和文件的用途

assets:静态资源 components:组件 router:路由配置 view:视图 main.js:入口文件 app.vue:应用主组件

2. Vuex

Vuex是什么?

Vuex 可以帮助我们集中式存储管理共享状态。

哪些场景下使用Vuex?

中大型以上的单页面、组件之间的状态、音乐的播放、登录状态、加入购物车等等

为什么要使用Vuex

  • 多个视图依赖于同一状态。
  • 来自不同视图的行为需要变更同一状态。

组件间传参的方式对于多层嵌套的组件来说非常繁琐,耦合性太高,代码维护性差,所以我们要将组件的共享状态提取出来,使每个组件都可以获取状态、触发行为。

Vuex 和单纯的全局对象有以下两点不同:

  • Vuex的状态存储是响应式,store中的状态发生改变时,相应组件中也会发生更新;
  • 不能直接改变store中的状态值,唯一改变state的方法就是提交mutation;
  • 全局对象可以直接修改,但是他不能响应式的更新;

1. state

每一个组件使用state,都需要引入store:

将store实例从根组件注入到子组件中(Vue.use(vuex))

new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')

在子组件中可以通过this.$store.state访问。

如何在组件中获取vuex的状态?

  • 在计算属性中返回状态值,每次状态值发生改变时,都会重新求取计算属性,触发更新相应的DOM。
computed:{
    属性(){
        return this.$store.state.属性
    }
}
  • mapState辅助函数
import {mapState} from "vuex";
computed:{
    ...mapState({
        属性:state=>state.属性
        //字符串传参
        ["state1","state2"]
    })
}

2. mutation

更改store中state的状态值的唯一方法是提交mutation。

事件类型(type)+回调函数

回调函数为更改状态的地方,有两个参数,第一个为state,第二个为载荷payload(多数情况下为对象)

mutations:{
    increment(state,{payload}){
        this.$store.state+=payload
    }
}

调用:

this.$store.commit("increment",{payload:10})
this.$store.commit({
    type:"increment",
    payload:10
})
import {mapMutations} from "vuex";
this.increment({payload:10})

mutation必须是同步函数?

因为我们调试时要知道state状态的上一状态和下一状态,触发mutation时,在异步执行时是无法追踪状态的。(在mutation中有多个回调时,无法确定哪个回调)

3. action

用于提交mutation,不能直接修改store中的状态值;

action可以包含任何异步操作;