Vue3中vuex的基本使用方法实例

 更新时间:2022年04月08日 10:17:34   作者:欢玺Yee  
Vuex是一个专为Vue.js应用程序开发的状态管理模式,它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化,下面这篇文章主要给大家介绍了关于Vue3中vuex的基本使用方法,需要的朋友可以参考下

一、基本结构

src/store/index.js中,代码如下

// vue3中创建store实例对象的方法createStore()按需引入
import { createStore } from 'vuex'
export default createStore({
  state: {
  },
  mutations: {
  },
  actions: {
  },
  getters: {
  },
  modules: {
  }
})

二、基本使用

src/store/index.js

import { createStore } from 'vuex'
export default createStore({
  state: {
    info: 'hello'
  },
  mutations: {
    // 定义mutations,用于修改状态(同步)
    updateInfo (state, payload) {
      state.info = payload
    }
  },
  actions: {
    // 定义actions,用于修改状态(异步)
    // 2秒后更新状态
    updateInfo (context, payload) {
      setTimeout(() => {
        context.commit('updateInfo', payload)
      }, 2000)
    }
  },
  getters: {
    // 定义一个getters
    formatInfo (state) {
      return state.info + ' Tom'
    }
  },
  modules: {
  }
})

src/views/Test.vue测试组件中对store中数据的操作与使用

<template>
  <div>测试组件</div>
  <hr>
  <!-- 页面中直接使用渲染时与vue2中的使用方法相同 -->
  <div>获取Store中的state、getters: {{$store.getters.formatInfo}}</div>
  <button @click='handleClick'>点击</button>
</template>

<script>
// 按需引入useStore()方法
import { useStore } from 'vuex'

export default {
  name: 'Test',
  setup () {
    // this.$store.state.info
    // Vue3中store类似于Vue2中this.$store
    // useStore()方法创建store对象,相当于src/store/index.js中的store实例对象
    const store = useStore()
    console.log(store.state.info) // hello
    // 修改info的值
    const handleClick = () => {
      // 触发mutations,用于同步修改state的信息
      // store.commit('updateInfo', 'nihao')
      // 触发actions,用于异步修改state的信息
      store.dispatch('updateInfo', 'hi')
    }
    return { handleClick }
  }
}
</script>

点击按钮前

示例图

点击按钮后

示例图

三、将store中的数据模块化后的使用

1.模块化

基于原index.js代码进行改造拆分,假设有两个模块global和user,新建src/store/modules/global.js 、src/store/modules/user.js文件

拆分后代码如下(src/store/modules/global.js)

// 全局store,存放全局使用共享的数据
export default { // 注意:全局模块中不需要开启命名空间
  state: {
  },
  mutations: {
  },
  actions: {
  },
  getters: {
  }
}

拆分后代码如下(src/store/modules/user.js)

// 用户信息模块(局部模块)
export default {
  namespaced: true, // 开启命名空间
  state () {
    return {
      // 用户信息对象 
      profile: {
        id: '',
        avatar: '',
        nickname: 'yee',
        account: '',
        mobile: '',
        token: ''
      }
    }
  },
  mutations: {
    // 定义mutations,用于同步修改状态
    updateNickname (state, payload) {
      state.profile.nickname = payload
    }
  },
  actions: {
    // 定义actions,用于异步修改状态
    // 2秒后更新状态
    updateNickname (context, payload) {
      setTimeout(() => {
        context.commit('updateNickname', payload)
      }, 2000)
    }
  },
  getters: {
    // 定义一个getters
    formatNickname (state) {
      return 'Hi ' + state.profile.nickname
    }
  }
}

拆分后代码如下(src/store/index.js)

import { createStore } from 'vuex'
// 全局模块
import global from './modules/global'
// 局部模块
import user from './modules/user'

export default createStore({
  // 全局模块
  ...global,
  // 局部模块
  modules: {
    user
  }
})

2.使用

src/views/Test.vue测试组件中对模块化后的store中数据的操作与使用

<template>
  <div>测试组件</div>
  <hr>
  <div>获取Store中user模块的getters: {{$store.getters['user/formatNickname']}}</div>
  <button @click='handleClick'>点击</button>
</template>

<script>
import { useStore } from 'vuex'
export default {
  name: 'Test',
  setup () {
    // this.$store.state.info
    // Vue3中store类似于Vue2中this.$store
    const store = useStore()
    console.log(store.state.user.profile.nickname)
    // 修改nickname的值
    const handleClick = () => {
      // 触发mutations,用于同步修改user模块state的信息
      // store.commit('updateNickname', 'Jackson')
      store.dispatch('user/updateNickname', 'Yee')
    }
    return { handleClick }
  }
}
</script>

点击按钮前

点击按钮后

补充:如何改变vuex中的属性

vue3和vue2一样,都是通过提交mutations中的方法,进行对vuex中数据的改变,那具体该如何使用呢?首先看一下mutations中的写法

const mutations = {
  addCount(state, payload) {
    state.count += payload
  },
}
export { mutations }

这里,定义了一个addCount方法,这个方法接受两个参数,第一个参数是要改变的state对象(当然你调用这个放法的传参中也可以写state.count,然后再mutations中直接state += payload就可以了),第二个参数是要改变的数据,比如进行 +1 操作

<template>
  <h1>vuex中的数据{{ store.state.count }}</h1>
  <button @click="changeStoreCount">改变vuex数据</button>
</template>
<script lang="ts">
import { defineComponent } from "vue"
import { useStore } from "vuex"
export default defineComponent({
  name: "index",
  setup() {
    const store = useStore()
    console.log(store)
    const changeStoreCount = () => {
      // 在这里提交了mutations中的addCount方法
      store.commit("addCount", 1)
    }
    return { store, changeStoreCount }
  },
})
</script>
<style scoped></style>

总结 

到此这篇关于Vue3中vuex的基本使用方法的文章就介绍到这了,更多相关Vue3 vuex基本使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue3中关于路由hash与History的设置

    vue3中关于路由hash与History的设置

    这篇文章主要介绍了vue3中关于路由hash与History的设置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 关于antd-vue a-menu菜单绑定路由的相关问题

    关于antd-vue a-menu菜单绑定路由的相关问题

    这篇文章主要介绍了关于antd-vue a-menu菜单绑定路由的相关问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • VueJs组件prop验证简单介绍

    VueJs组件prop验证简单介绍

    今天看了vuejs的组件,看到了prop组件,主要作用是在传入数据的时候对传入的值做判断,今天小编通过一个小例子给大家分享VueJs组件prop验证简单理解,感兴趣的朋友一起看看吧
    2017-09-09
  • vue3.0中使用postcss-pxtorem的具体方法

    vue3.0中使用postcss-pxtorem的具体方法

    这篇文章主要介绍了vue3.0中使用postcss-pxtorem的具体方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • 详解vue3+element-plus实现动态菜单和动态路由动态按钮(前后端分离)

    详解vue3+element-plus实现动态菜单和动态路由动态按钮(前后端分离)

    本文需要使用axios,路由,pinia,安装element-plus,并且本文vue3是基于js而非ts的,这些环境如何搭建不做描述,需要读者自己完成,感兴趣的朋友跟随小编一起看看吧
    2023-11-11
  • vue.js vue-router如何实现无效路由(404)的友好提示

    vue.js vue-router如何实现无效路由(404)的友好提示

    众所周知vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用,下面这篇文章主要给大家介绍了关于vue.js中vue-router如何实现无效路由(404)的友好提示的相关资料,需要的朋友可以参考下。
    2017-12-12
  • 如何解决element-ui动态加载级联选择器默认选中问题

    如何解决element-ui动态加载级联选择器默认选中问题

    这篇文章主要介绍了如何解决element-ui动态加载级联选择器默认选中问题,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-09-09
  • Vue3组件更新中的DOM diff算法示例详解

    Vue3组件更新中的DOM diff算法示例详解

    虚拟dom是当前前端最流行的两个框架(vue和react)都用到的一种技术,都说他能帮助vue和react提升渲染性能,提升用户体验,下面这篇文章主要给大家介绍了关于Vue3组件更新中的DOM diff算法的相关资料,需要的朋友可以参考下
    2022-04-04
  • Vue 3.0双向绑定原理的实现方法

    Vue 3.0双向绑定原理的实现方法

    这篇文章主要为大家详细介绍了Vue 3.0双向绑定原理的实现方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • 浅谈vue中document.getElementById()拿到的是原值的问题

    浅谈vue中document.getElementById()拿到的是原值的问题

    这篇文章主要介绍了浅谈vue中document.getElementById()拿到的是原值的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07

最新评论