Vue3学习与实战 · Vuex状态管理

VuexVue 全家桶重要组成之一,专为 Vue.js 应用程序开发的 状态管理模式 + 库 ,它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

Vue3 Vuex

一、目录结构

demo/
    package.json
    vite.config.js
    index.html
    public/
    src/
        api/
        assets/
        common/
        components/
        store/
            index.js
            modules/
                user.js
                common.js
        views/
            index.vue
        App.vue
        main.js            

二、版本依赖

vite: ^2.0.0
vue: ^3.2.8
vuex: ^4.0.0

三、配置Vuex

为了避免所有状态集中到一个对象或一个文件而变得臃肿,所以会按照不同的产品或业务线将状态树切割成多个 模块module),并配置各自的 命名空间namespaced),防止状态重复冲突。

  • 3-1.配置src/store/index.js文件。
// src/store/index.js

import Vuex from 'vuex'

import User from './modules/user'
import Common from './modules/common'

export default new Vuex.Store({
    modules: {
      User,
      Common,
    }
})
  • 3-2.配置src/store/modules/user.js文件。
// src/store/modules/user.js

import axios from 'axios'

const SET_USER_NAME = 'SET_USER_NAME'
const SET_RANDOM_IMG = 'SET_RANDOM_IMG'

export default {
  namespaced: true,

  state: {
    username: 'Tom',
    randomImg: 'https://images.dog.ceo/breeds/bulldog-french/n02108915_8258.jpg',
  },

  getters: {
    getUsername (state) {
      return state.username
    },
    getRandomImg (state) {
      return state.randomImg
    },
  },

  mutations: {
    [SET_USER_NAME]: (state, username)=>{
      state.username = username
    },
    [SET_RANDOM_IMG]: (state, randomImg)=>{
      state.randomImg = randomImg
    },
  },

  actions: {
    async setUsername ({dispatch, commit, getters}, data) {
      let username = getters.getUsername
      return new Promise((resolve, reject) => {
        setTimeout(()=>{
          commit('GET_USER_NAME', data)
          resolve(data)
        }, 2000)
      })
    },
    async setRandomImg ({dispatch, commit, getters}, data) {
      // let randomImg = getters.getRandomImg
      return new Promise((resolve, reject) => {
        axios.get('https://dog.ceo/api/breeds/image/random').then((res) => {
          let img = res.data.message
          commit('SET_RANDOM_IMG', img)
          resolve(img)
        })
      })
    },
  },
}
  • 3-3.在src/main.js入口文件中注册使用Vuex
// src/main.js

import { createApp } from 'vue'
import router from './router'
import store from './store'
import App from './App.vue'

// ...

const app = createApp(App)

app.use(router).use(store);
app.mount('#app')

四、使用Vuex

  • 这里主要介绍一下在Vue3Composition API中的使用。
// src/views/index.vue

<template>
    <div>
        <van-image
                round
                lazy-load
                width="200"
                height="200"
                :src="img">
            <template #loading>
                <van-loading type="spinner" size="30" />
            </template>
        </van-image>

        <br>

        <van-button type="primary"
                    icon="search"
                    zise="mini"
                    text="随机dog"
                    :loading="loading"
                    @click="getImg"
                    color="linear-gradient(to right, #ff6034, #ee0a24)"
                    loading-text="loading..." />
    </div>
</template>

<script>
    import { ref, computed } from 'vue'
    import { useStore } from 'vuex'

    export default {
        setup () {
            const { state, getters, commit, dispatch } = useStore()
            let img = computed(()=>getters['User/getRandomImg'])
            let loading = ref(false)

            const getImg = async () => {
                loading.value = true
                await dispatch('User/setRandomImg')
                loading.value = false
            }

            return {
                img,
                loading,
                getImg,
            }
        },
    }
</script>

提示: 为了访问 stategetter,需要创建 computed 引用以保留响应性,这与在 Options API 中创建计算属性等效。


《Vue3学习与实战》系列


欢迎访问:天问博客

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3是目前最新的Vue.js版本,相比Vue2有很多新特性和更好的性能。而VuexVue.js官方推荐的状态管理工具,用于处理复杂的应用程序中的共享状态。 下面是Vue3和Vuex的基本使用方法: 1. 在项目中安装Vue3和Vuex: ```bash npm install vue@next vuex@next --save ``` 2. 创建一个store.js文件用于配置Vuex: ```javascript import { createStore } from 'vuex' const store = createStore({ state: { count: 0 }, mutations: { increment(state) { state.count++ } }, actions: { increment(context) { context.commit('increment') } }, getters: { getCount(state) { return state.count } } }) export default store ``` 这里我们定义了一个state对象来存储应用程序的状态,一个mutation函数来改变状态,一个action函数来分发mutation,一个getter函数来获取状态。 3. 在main.js中引入store: ```javascript import { createApp } from 'vue' import App from './App.vue' import store from './store' createApp(App).use(store).mount('#app') ``` 4. 在组件中使用Vuex: ```html <template> <div> <p>Count: {{ count }}</p> <button @click="increment">Increment</button> </div> </template> <script> import { mapGetters, mapActions } from 'vuex' export default { computed: { ...mapGetters(['getCount']), count() { return this.getCount } }, methods: { ...mapActions(['increment']) } } </script> ``` 这里我们使用Vuex提供的mapGetters和mapActions函数来映射state中的count属性和increment函数到组件中。 以上就是Vue3和Vuex的基本使用方法,可以根据自己的需求进行扩展和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值