1.什么是vuex

用来解决多个组件共享状态
VueJS中学习使用Vuex详解
由于我们使用得是vue-cli3.0所以默认情况下我们是使用vuex得,src文件夹下会有一个store.js文件
store.js文件

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {

  },
  mutations: {

  },
  actions: {

  }
})

在main.js中默认会引用

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import './assets/styles/icon.css'
import './assets/styles/global.scss'

Vue.config.productionTip = false

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

2.vuex基础用法

在actions的setTest方法中通过commit方法调用mutations的SetTest方法来修改state中的test属性;
store.js

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    test: 1
  },
  mutations: {
    'SetTest': (state,newTest)=>{
      state.test = newTest
    }
  },
  actions: {
    //commit参数用来调用mutations方法,state用来获取原先得值
    setTest: ({commit,state},newTest)=>{
      // console.log(state.test,newTest)
      // 修改test得值
      return commit('SetTest',newTest)
    }
  }
})

App.vue
通过this.$store.dispatch来调用store.js中的actions中的setTest方法并传递值,调用后打印出修改后的test属性的值

mounted () {
   //this.$store.dispatch调用vuex
   this.$store.dispatch('setTest',10).then(()=>{
      console.log(this.$store.state.test)
   })
}
3.vuex模块化用法

在src目录下创建store目录,并且将store.js文件放入其中,将其更名为index.js,并且修改main.js文件的引用
main.js

import store from './store/index'

index.js中引用创建的模块

import Vue from 'vue'
import Vuex from 'vuex'
import book from './modules/book'

Vue.use(Vuex)

export default new Vuex.Store({
  modules: {
    book
  }
})

然后再store目录下创建modules目录,并且在下面创建一个book.js文件,创建一个book模块

const book = {
    state: {
      test: 1
    },
    mutations: {
      'SetTest': (state,newTest)=>{
        state.test = newTest
      }
    },
    actions: {
      //commit参数用来调用mutations方法,state用来获取原先得值
      setTest: ({commit,state},newTest)=>{
        // console.log(state.test,newTest)
        // 修改test得值
        return commit('SetTest',newTest)
      }
    }
}
export default book

我们修改完这些的时候会发现在App.vue中打印的test属性为underfined,所以我们可以通过vue调试工具查看vuex
在这里插入图片描述
从上边我们可以看出test属性在book这个对象内,所以我们需要对App.vue中的调用方法进行修改

export default {
    mounted () {
      //this.$store.dispatch调用vuex
      this.$store.dispatch('setTest',10).then(()=>{
        console.log(this.$store.state.book.test)
      })
    }
  }
4.通过getter特性简化我们获取vuex中变量的方式

原先获取方式

this.$store.state.book.test

如何简化为

this.test
具体方法如下

1.首先我们在store目录下创建getters.js文件

const book = {
    book: state => state.book.test
}
export default book

2.store目录下的index.js中引入getters.js文件

import Vue from 'vue'
import Vuex from 'vuex'
import book from './modules/book'
import getters from './getters'

Vue.use(Vuex)

export default new Vuex.Store({
  modules: {
    book
  },
  getters
})

3.App.vue通过mapGetters使用getters方法

  import {mapGetters} from 'vuex'
  export default {
    computed: {
    	...mapGetters(['test'])
    },
    mounted () {
      //this.$store.dispatch调用vuex
      this.$store.dispatch('setTest',10).then(()=>{
        console.log(this.test)
      })
    }
  }

4.在浏览器中不能打印出修改后的test的值,会出现如下错误
在这里插入图片描述
解决以上问题,需要修改getters.js文件

const book = {
    test: state => state.book.test
}
export default book
5.vue的调试工具,当我们无法给谷歌浏览器安装vue的调试插件的时候,我们可以考虑使用离线调试工具vue-remote-devtools

在命令行中输入

npm install -g @vue/devtools

安装完成后我们在命令行中输入如下指令进行运行

vue-devtools

会出现如下弹窗
在这里插入图片描述
然后我们将Add框中的一段代码粘贴放到index.html文件中,放好之后会出现如下界面
在这里插入图片描述

注意:我们在项目上线时要把index.html粘贴的那个代码段注释掉
GitHub 加速计划 / de / devtools
24.6 K
4.14 K
下载
vuejs/devtools: Vue.js 开发者工具,这是一个浏览器插件,可以安装在 Chrome 和 Firefox 等现代浏览器中,用于调试 Vue 应用程序,提供了组件树查看、状态快照、时间旅行等高级调试功能。
最近提交(Master分支:3 个月前 )
79116147 - 4 个月前
f0359002 - 5 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐