入门vuex(一)

329 阅读3分钟

只适合新手,一方面记录下来加深记忆,一方面希望能帮到和我一样的新手

本篇主要参考文章:juejin.cn/post/684490…

还有一个大佬写的适合新手学习:segmentfault.com/a/119000000…

实际开发应用中经常会遇到这么一个场景:翻页翻到了第三页,点进某一条查看详情,返回后又回到了第一页??!对于这个问题,一开始我并不知道怎么解决(毕竟初入门小白),询问了某大佬之后,他告诉了我可以使用 vuex ,为了达到这个目标,开始学习。

初级入门

一 安装vuex

npm install vuex --save

二 vuex 的 mutations 和 state

这个可以下载main.js文件中,但是为了后期方便,建议新建一个文件夹

位置:src/store/index.js

// 引入
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
// 使用
export default new Vuex.Store({
    state: {
        name: 'oldName'
    },
    mutations: {
        updateName(state){
            state.name = 'newName' // 更改state的值
        }
    }
})

然后前往main.js注册vuex 位置: src/main.js

import store from './store'

new Vue({
    ……
    store, // 使用 store
    ……
})

三 使用vuex

已经可以进行最基本的使用了,自己在src里面新建一个文件,我的代码在位置 src/pages/other/vuexText/Simple.vue 这是最简单的应用了,state就相当于vue里面的date,mutations就是vue里面的methods,不过要通过$store.commit()使用

<template>
  <div>
      {{$store.state.name}}
      <el-button @click="$store.commit('updateName')">更名</el-button>
  </div>
</template>
<script>
export default {
};
</script>
<style lang="less">
</style>

看到效果 初始值oldName

点击更名后,值变为newName

四 vuex 的 getters

vuex中的getters相当于vue的计算方法,用来对state进行自定义改变 在store.js中添加代码,位置:src/store/index.js

// 引入
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
// 使用
export default new Vuex.Store({
    state: {
        name: 'oldName'
    },
    mutations: {
        updateName(state){
            state.name = 'newName' // 更改state的值
        }
    },
    // 新增的代码 ———— 新增getters方法
    getters: {
        getReverseName(state) {
            return state.name.split('').reverse().join('')
        }
    }
})

然后在代码中使用getters,位置:src/pages/other/vuexText/Simple.vue

<template>
  <div>
      {{$store.state.name}}
      
      <!-- 新增 getters 使用 -->
      {{$store.getters.getReverseName}}
      
      <el-button @click="$store.commit('updateName')">更名</el-button>
  </div>
</template>

看到效果

点击前

点击后

五 vuex 的 actions

显而易见,多个state的时候,用mutations来触发比较干净和好维护,那多个mutations的时候,就需要用到actions了 位置:src/store/index.js

// 引入
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
// 使用
export default new Vuex.Store({
    state: {
        name: 'oldName'
    },
    mutations: {
        updateName(state){
            state.name = 'newName' // 更改state的值
        }
    },
    getters: {
        getReverseName(state) {
            return state.name.split('').reverse().join('')
        }
    },
    // 新增的代码 ———— 新增使用actions
    actions: {
        updateNameAction:({commit}){
            commit('updateName')
        }
    }
})

使用actions,actions 用 dispatch

位置:src/pages/other/vuexText/Simple.vue

<template>
  <div>
      {{$store.state.name}}
      {{$store.getters.getReverseName}}
      <el-button @click="$store.commit('updateName')">更名</el-button>
      
      <!-- 新增 actions 使用 -->
      <el-button @click="$store.dispatch('updateNameAction')">更名2</el-button>
      
  </div>
</template>

点击 actions方法前

点击后

可以看到,调用了actions里面的方法

六 modules 模块化

在项目越来越大,使用到store的也越来越多,我们就需要将store进行模块化处理,不同的功能拥有单独的store文件夹,这样对于后期维护才更方便 新建一个module文件夹,下面用来存档不同的store module的文件 位置:src/store/modules/simple.js

export default {
  state: {
    name: 'oldName'
  },
  getters: {
    getReverseName(state) {
      return state.name.split('').reverse().join('')
    }
  },
  mutations: {
    updateName(state) {
      state.name = 'newName'
    }
  },
  actions: {
    updateNameAction({
      commit
    }) {
      commit('updateName')
    }
  }
}

相应的store.js里面进行更改,位置:src/store/index.js

import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
import simpleMudule from './modules/simple'
export default new Vuex.Store({
  modules: {
    simpleMudule //也可以重命名
  }
})

使用store,位置src/pages/other/vuexText/Simple.vue

<template>
  <div class="simple-contain">
      <!-- 注意这里state取的是simpleMudule里面的那么 -->
      {{$store.state.simpleMudule.name}}
        
      {{$store.getters.getReverseName}}
      <el-button @click="$store.commit('updateName')">更名</el-button>
      <el-button @click="$store.dispatch('updateNameAction')">更名2</el-button>
  </div>
</template>

运行代码效果和之前一样

vue官方文档提示:

由于 store 中的状态是响应式的,在组件中调用 store 中的状态简单到仅需要在计算属性中返回即可。触发变化也仅仅是在组件的 methods 中提交 mutation。

所以建以使用的时候用在computed和methods中,以上代码是为了便于入门学习,省去了代码量