Vuex——项目应用(1)

vuex

Vuex是vue.js专门为了管理组件与组件之间的关系而提供的一种状态管理模式

下面简单介绍一下vuex在项目中的应用场景

首先我们要做的是安装vuex到我们的项目中

yarn add vuex

然后在我们通过vue-cli脚手架生成的src文件夹中建立一个store(仓库)文件夹,里面便可以建立一个index.js文件,来做我们的vuex的一个配置文件了。

我们在index.js中首先引入vue和vuex,在使用过vuex后就可以进行一个vuex的实例化了

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.store({
  
})
export default store

此时,我们vuex的一个实例文件的模板就写好了。

这时,就可以在总入口文件,main.js进行引入和使用了

import store from './store/index.js'
//并且在实例vue的时候进行引入,为了让我们的其他组件都可以拿到$store
new Vue({
  router,
  store,
  render:h=>h(app)
}).$mount("#app")

此时,我们可以在组件找一个合适的地方打印this.$store,如果存在,那么我们就可以在项目中应用我们的Vuex了

下面我举两个在项目中经常遇到的小案例

一、底部导航栏的消失与隐藏

在写项目的时候,我们经常会遇到有一些组件页面需要存在底部导航栏,有些组件页面却不需要,那我们如果要通过组件通信来解决的话,那我们麻烦可大了去了,这时候,我们就该想起vuex来了。

vuex,我们可以把它用做一个仓库,在里面存放一个isTabberShow的属性,通过改变isTabberShow的属性,来改变我们公用底部导航栏Tabber的v-if属性,就可以实现在需要的时候让它显示,不需要的时候,让它隐藏了。

可以在vuex实例的时候通过state属性来进行维护我们所需要的状态值

const store = new Vuex({
  state: {
    isTabberShow: true
  }
})

假设,我们不需要显示的组件页面是Search.vue

我们可以在Search中进行打印this,可以发现可以通过this.$store.state来拿到我们的isTabberShow。

那如果我们不需要在Search中让底部导航栏显示,那该如何修改这个值呢?

vuex还有一个mutations属性,可以通过它来封装一些可以改变state中的值

比如

mutations: {
  show (state) {
    state.isTabberShow = true
  },
    hide (state) {
      state.isTabberShow = false
    }
}

然后我们在Search页面中created钩子函数中通过this.$store.commit('hide')来将vuex的state属性中的isTabberShow改为false

这时,我们Search页面中就不会显示底部导航栏了,不过别的页面组件也不显示了,这显然不是我们的需求,那我们需要在销毁生命周期树的时候将底部导航栏在显示出来

通过beforeDistory钩子函数通过this.$store.commit('show')来将vuex的state属性中的isTabberShow改为true

这样,我们实现底部导航栏按需求显示与消失的需求就解决了。

总结:将值存入vuex(仓库)后,如果想修改值,可以通过在mutations定义修改值的方法,在组件中通过this.$store.commit(方法名)的方法来实现我们的需求

二、异步请求数据

在项目中经常会遇到的一个场景:我们在不同的组件需求请求同一组数据,如果都进行请求的话,无疑增加了一笔很大的性能消耗,那我们也可以将异步请求数据也放在vuex仓库中,这样,在我们请求过数据后,第二个页面组件也需要这个数据的话,就不需要发送请求,可以直接进行调用。

首先我们可以在state中定义一个dataList:[ ] 来存放我们即将请求到的数据,这样组件就可以通过this.$store.state来拿到

可以通过vuex实例中的actions属性来进行解决我们的这个需求。

actions: {
  getData (context) {
    //在这里我进行了封装了axios的操作,在之前的博客中有提到过
    instance.get('/gateway?cityId=310100&ticketFlag=1&k=7954844',{
      headers: {
        'X-Host': 'mall.film-ticket.cinema.list'
      }
    }).then(res => {
      //在这里我们就拿到需要的数据了,那么问题来了,怎么在这里修改state中的值呢
      //在这里也可以使用在mutations中定义一个修改state中dataList值的方法,然后通过我们的参数context.commit来调用就可以完成我们的需求了
      context.commit('setData',res.data)
    })
  }
}
mutations: {
  setData (state,data) {
    state.dataList = data
  } 
}

这时,当我们需要请求数据的时候,只需要通过 this.$store.state.dispatch('getData') 来进行请求数据了

此时我们如果第二个组件也需要请求,只需要加一个判断,如果里面有数据了,直接通过this.$store.state来进行获取,如果没有,再通过上面所描述的进行请求数据。

以上就是我们在项目中经常遇到的通过vuex来解决的两个小案例,若有出入,欢迎指正。

posted on 2020-08-24 21:10  Huskie!  阅读(362)  评论(0编辑  收藏  举报