Vuex用法及封装

Vuex的介绍和使用建议看官方文档,本文更多的是我对Vuex的一个总结。

  • Vuex介绍及使用
  • Vuex使用中可能遇到的问题

一.Vuex介绍及使用

1.Vuex是什么

官方的介绍是“Vuex 是状态管理模式

我们在做组件间数据传递的时候,其方式有多种,比如:

  • 组件间通过属性和事件触发的形式进行数据的交互
  • 使用缓存localStorage,sessionStorage等
  • router 路由跳转时传值
  • bus总线机制
  • vuex

而vuex最大的特点就是能实时同步更新数据

2.Vuex能解决什么问题

在很多场景下,我们可能会有下面的问题:

  • 多个视图依赖于同一状态。
  • 来自不同视图的行为需要变更同一状态。

3.什么情况下使用 Vuex

官方建议在开发中大型项目的情况下考虑使用Vuex。就我个人而言,当页面的非父子组件间需要实时同步更新数据时,才使用vuex,其他情况都不使用。

4.Vuex如何使用

首先,必须牢记下面这张图

图中,整个虚线部分就是Vuex,我们可以把它看成一个公共仓库store。store中有Actions(行为)、Mutations(变动)和State(状态)。整个的逻辑是组件通过Dispatch调用Actions中的方法,Actions通过Commit调用Mutations中的方法,Mutatisons改变State中的值。

我们看下如何简单使用。首先,在store目录下的index.js文件中写入如下代码:

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

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    city: '重庆'
  },
  actions: {
    changeCity(ctx, city) {
      ctx.commit('changeCity2', city) // 调用mutations中的方法改变city
    }
  },
  mutations: {
    changeCity2(state, city) {
      state.city = city
    }
  },
  getters: { // 类似计算属性,计算state中的数据提供新的数据
    doubleCity (state) {
      return state.city + ' ' + state.city
    }
  }
})

然后,我们在main.js中引入store

import Vue from 'vue'
import App from './App'
import store from './store/index'

new Vue({
  el: '#app',
  store,
  components: { App },
  template: '<App/>'
})

接着,我们就能在组件中使用

<div>{{this.$store.state.city}}</div>

我们也可以使用Vuex提供的语法糖,将city映射到组件数据中

先引入

import {mapState} from 'vuex'

再映射,这里我们映射到computed中

  computed: {
    // ...为展开运算符 将vuex中的公用属性city映射到计算属性city中
    ...mapState(['city'])
  }

上面,我们只是调用了city数据,那如何改变city呢?

this.$store.dispatch('changeCity', '北京')

我们也可以使用Vuex中的语法糖,将方法映射到组件中

import {mapActions} from 'vuex'
    methods: {
      ...mapActions([
        'changeCity'
      ])
    }

通过上面的操作,我们发现要改变city,需要先调用actions,再调用mutations来改变city,我们能不能直接调用mutations来改变city呢?这是可以的

this.$store.commit('changeCity2', '北京')

当然,我们也可以使用Vuex的语法糖mapMutations来映射,这里不再介绍。

注:本着能少写就少写的原则,我们在一般的开发中,可能会省略actions步骤。

5.Vuex的简单封装

随着项目越来越复杂,若将所有代码写在一起会显得越来越臃肿,所以我们一般都要进行封装分离。这里,我们将state和mutations进行封装,其他的类似。

新建state.js

let state = {
  city: '重庆'
}

export default state

新建mutations.js

let mutations = {
  changeCity (state, city) {
    state.city = city
  }
}

export default mutations 

然后,我们的代码就可以改成如下这般

import Vue from 'vue'
import Vuex from 'vuex'
import state from './state'
import mutations from './mutations'

Vue.use(Vuex)

export default new Vuex.Store({
  state,
  mutations
})

二.Vuex使用中可能遇到的问题

1.刷新页面数据被重置为初始状态

对于这个问题,我们一般通过 Vuex 与缓存结合使用来解决。

读取数据时

let defaultCity = ''
if (localStorage.getItem('city')) {
  defaultCity= localStorage.getItem('city')
}

const state = {
  city: defaultCity
}

export default state

改变数据时

const mutations = {
  changeCity (state, val) {
    localStorage.setItem('city', val)
    state.city= val
  }
}

export default mutations

 

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用中提到,Vuex可以理解为一个大对象,而内部的方法可以通过外部的变量和方法来改变内部的状态,并返回处理后的状态。因此,可以在Vuex中内部封装方法给Vuex使用。在Vuex的实例中,可以使用mutations来定义内部方法。例如,可以在mutations中定义一个方法来改变state中的数据: ```javascript mutations: { updateData(state, payload) { state.data = payload; } } ``` 在上述代码中,`updateData`方法可以通过`commit`来调用,实现对`state`中数据的更新。在组件中可以通过`this.$store.commit('updateData', newData)`来触发该方法,并传递新的数据作为参数。 另外,在引用中还提到了Vuex中的`actions`,可以用于处理异步操作。可以在`actions`中封装异步请求的方法,并在请求完成后调用`commit`来触发对`state`的更新。 总结来说,可以通过在mutations中定义方法,并在组件中通过commit来调用,实现内部封装方法给Vuex使用。而对于异步操作,可以使用actions来封装异步请求的方法,并在请求完成后调用commit来更新state中的数据。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [有关vuex 详细使用方法](https://blog.csdn.net/yhl521112/article/details/119891294)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [Vuex的使用方法及调用(详解)](https://blog.csdn.net/zyq51/article/details/107192281)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值