了解vuex

什么是vuex?

官方: Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 + 库。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

工作流程:

        用户通过dispatch去分发actions,再通过commit提交mutation去改变state,伴随state的改变重新渲染组件。

注意:

        用户可以直接通过this.$store.commit提交mutations。       

        为什么需要通过dispatch触发actions,再通过commit提交mutation呢?

        因为mutations支持同步;actions支持异步操作,往往用户在操作数据时,需要调用后端接口是异步的操作,所以一般都是通过actions再mutations。

Vuex环境配置

一、安装        npm i vuex

注意: 安装时不指定版本,会安装最新版本。vuex的4版本,只能在vue3中使用,项目是vue2的要安装4版本以下的vuex版本。

二、配置store文件

//在根目录新建store文件->store.js,进行如下配置

import Vue from 'vue'
import Vuex from 'vuex'
 
Vue.use(Vuex)

//对外暴露store类的一个实例
export default new Vuex.Store({
  state: {},
  actions: {},
  mutations: {},
  getters: {},
})

 三、在main.js中引入配置的store文件下的js文件

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

//引入store文件
import store from './store/store.js'

Vue.config.productionTip = false

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

核心概念

State

提供唯一的公共数据源,所有共享的数据统一放到store的state进行储存,与data相似。

使用state

直接在标签中使用
<div>{{$store.state.lyc}}</div>

从vuex中按需导入mapstate函数,然后映射到computed中
import { mapState } from "vuex"
...mapState({'lyc':'lyc'})

//组件中的新名称和vuex中的原名称一样就可以
//mapState、mapGetters、mapMutations、mapActions都可以这样使用
...mapState(["lyc"])

//映射后
<div>{{lyc}}</div>

Mutation

更改 Vuex 的 store 中的状态的唯一方法是提交 mutation。Vuex 中的 mutation 非常类似于事件:每个 mutation 都有一个字符串的事件类型(type)和一个回调函数(handler)。这个回调函数就是我们实际进行状态更改的地方,并且它会接受 state 作为第一个参数。

使用mutations

注意:在 mutations 里写的必须是同步函数

mutations: {
  abc(state) {
      //对state中数据的操作
  }
}

直接使用commit提交Mutation
this.$store.commit("abc")

从vuex中按需导入mutation函数,然后映射到methods方法中
import { mapMutations } from "vuex"
...mapMutations(['abc'])      

Action

接受一个与 store 实例具有相同方法和属性的 context 对象,因此你可以调用 context.commit 提交一个 mutation,或者通过 context.state 和 context.getters 来获取 state 和 getters。

使用actions

Action 提交的是 mutation,而不是直接变更状态
Action和Mutation相似,Mutation 不能进行异步操作,若要进行异步操作,就得使用Action。

actions: {
  incrementAsync ({ commit }) {
    setTimeout(() => {
      commit('increment')
    }, 1000)
  }
}
直接使用  dispatch分发Action
this.$store.dispatch("incrementAsync")

从vuex中按需导入action函数,然后映射到methods方法中
import { mapActions } from "vuex"
...mapActions(['incrementAsync'])

就可以直接使用这个方法
this.incrementAsync

Getter

对于Store中的数据进行加工处理形成新的数据,接受 state 作为其第一个参数。

注意:vue2时类似于vue中的computed,进行缓存;vue3中getter 的结果不再像计算属性一样会被缓存起来。

使用getters

直接在标签中使用
<div>{{$store.getter.lyc}}</div>

从vuex中按需导入getter函数,然后映射到计算属性computed中
import { mapGetters } from "vuex"
...mapGetters(['lyc'])
//映射后
<div>{{lyc}}</div>

Vuex允许我们将store分割成模块(module)

默认情况下,模块内部的 getter、action 和 mutation 仍然是注册在全局命名空间的——这样使得多个模块能够对同一个 getter、action 或 mutation 作出响应,也就是分割出的模块这三个属性也是公用的,为了不出现模块中同一属性的错误,我们需要在模块中开启命名空间(namespaced: true),开启命名空间的模块,不会被其他模块的同一属性影响。

例子: 

store.js文件                其他两个都是模块文件

//导入 Vue 和 Vuex
import Vue from 'vue'
import Vuex from 'vuex'
//将 Vuex 安装为 Vue 的插件 
Vue.use(Vuex)

//导入购物车的 vuex 模块
import moduleCart from './cart.js'

//导入用户的 vuex 模块
import moduleUser from './user.js'

//对外暴露store类的一个实例 
export default new Vuex.Store({

  // 挂载 store 模块 
  modules: {
    // 挂载到购物车的 vuex 模块,模块内成员的访问路径被调整为 m_cart
    'm_cart': moduleCart, //就是把导入的模块,改个名

    //挂载用户的 vuex 模块,访问路径为 m_user
    'm_user': moduleUser
  },
})

user.js

//对于模块内部的 mutation 和 getter,接收的第一个参数是state

export default {
  //开启命名空间
  namespaced: true,

  state: () => ({
    count: 0
  }),
  mutations: {
    increment (state) {
      // 这里的 `state` 对象是模块的局部状态
      state.count++
    }
  },
  getters: {
    doubleCount (state) {
      return state.count * 2
    }
  }
}

//这个对模块中actions的描述是没有可以,可以去官方看

当使用多个模块时,映射方法就需要改一下

当多个模块,当前组件引入同一个模块中的属性时

mapState、mapGetters、mapMutations、mapActions第一个参数时字符串(模块名称),
第二个参数是数组(组件中的新名称和vuex中的原名称一样),或者对象(就是需要重命名时)

mapXXXs('模块名',['属性名1','属性名2'])

mapXXXs('模块名',{
    '组件中新名称1':'Vuex中原名称1',
    '组件中新名称2':'Vuex中原名称2'
})

当多个模块,当前组件引入不同模块中同属性时

computed:{
    ...mapState({
        '组件新名称': state => state.模块名1.'Vuex中原名称',
        '组件新名称': state => state.模块名2.'Vuex中原名称',
    })
}

methods:{
    ...mapMutations({
        '组件新名称':"模块名1/Vuex中原名称",
        '组件新名称':"模块名2/Vuex中原名称",
    }),
    ...mapActions({
        '组件新名称':"模块名1/Vuex中原名称",
        '组件新名称':"模块名2/Vuex中原名称",
    })
}

Vuex面试题

1、vuex如何实现数据持久化

        答:因为vuex中的state是存储在内存中的,一刷新就没了,例如登录状态,解决方案有:

   第一种:利用本地存储(localStorage,sessionStorage)

state:{
    //本地缓存有就拿本地缓存的
    num:localStorage.getItem('num') || 1
},
mutations:{
    add(state){
        state.num++;
        //把数据存到本地缓存
        localStorage.setItem('num',state.num)
    }
}

                第二种:利用第三方封装好的插件,例如:vuex-persistedstate

 2、在某个组件中可以直接修改Vuex的状态(数据)吗?

可以的:

        1、通过mutataions方法来修改

        2、this.$store.state.xxx可以直接修改源头数据;使用辅助函数(...mapxxx)this.xxx是不可以修改的。因为mapState会把state的某一值复制一份给当前组件对象,这个跟data中return的数据处理一样。

3、Vuex中getters属性在组件中被v-model绑定会发生什么?

        Vuex是单向数据流,所以v-model绑定getters会报错,而且没有get和set写法(组件的计算属性有)

4、mutations和actions的区别

1、Actions提交的是mutations,而不是直接变更状态。

    actions可以直接修改state属性值? 可以,但是不建议这样写

2、mutations是同步函数,actions可以包含异步

面试中回答:actions可以包含异步操作,mutations必须是同步的,actions直接提交mutations,通过mutations去修改state的状态。

vuex官方文档       Vuex 是什么? | Vuex

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vuex 是一个专门为 Vue.js 应用程序开发的状态管理库。它允许您在应用程序中集中管理状态,并且使得状态的变化可追踪、可调试和可维护。以下是一个简单的 Vuex 教程,帮助您开始使用 Vuex。 1. 安装 Vuex 您可以使用 npm 或 yarn 安装 Vuex,命令如下: ```bash npm install vuex ``` 或者 ```bash yarn add vuex ``` 2. 创建 Vuex Store 在您的 Vue.js 应用程序中,您需要先创建一个 Vuex Store。Store 是一个容器,它保存了应用程序中所有的状态(也称为 store)。在该容器中,您可以定义状态、修改状态以及监听状态的变化。 ```javascript import Vuex from 'vuex' import Vue from 'vue' Vue.use(Vuex) const store = new Vuex.Store({ state: { count: 0 }, mutations: { increment(state) { state.count++ } }, actions: { increment(context) { context.commit('increment') } } }) export default store ``` 上面的代码中,我们定义了一个名为 `store` 的 Vuex Store。在 `state` 对象中,我们定义了一个名为 `count` 的状态。在 `mutations` 对象中,我们定义了一个名为 `increment` 的 mutation,该 mutation 用于修改 `count` 状态。在 `actions` 对象中,我们定义了一个名为 `increment` 的 action,该 action 用于调用 `increment` mutation。 3. 在 Vue.js 应用程序中使用 Vuex Store 您可以将 Vuex Store 注入到 Vue.js 应用程序中,以便在组件中使用。 ```javascript import Vue from 'vue' import App from './App.vue' import store from './store' new Vue({ el: '#app', store, render: h => h(App) }) ``` 在组件中,您可以使用 `mapState` 辅助函数来获取状态,并使用 `mapMutations` 辅助函数来提交 mutation。 ```javascript import { mapState, mapMutations } from 'vuex' export default { computed: { ...mapState(['count']) }, methods: { ...mapMutations(['increment']) } } ``` 4. 修改状态 在组件中,您可以使用 `this.$store.commit` 方法来提交 mutation,从而修改状态。 ```javascript methods: { increment() { this.$store.commit('increment') } } ``` 在 action 中,您可以使用 `context.commit` 方法来提交 mutation,从而修改状态。 ```javascript actions: { increment(context) { context.commit('increment') } } ``` 5. 使用 getter getter 可以对状态进行计算,从而派生出一个新的状态。在 Vuex Store 中,您可以使用 `getters` 对象定义 getter。 ```javascript const store = new Vuex.Store({ state: { count: 0, doubleCount: 0 }, mutations: { increment(state) { state.count++ } }, actions: { increment(context) { context.commit('increment') } }, getters: { doubleCount(state) { return state.count * 2 } } }) ``` 在组件中,您可以使用 `mapGetters` 辅助函数来获取 getter。 ```javascript import { mapGetters } from 'vuex' export default { computed: { ...mapGetters(['doubleCount']) } } ``` 这就是一个简单的 Vuex 教程。它可以帮助您开始使用 Vuex,但 Vuex 的功能远不止于此。如果您想深入了解 Vuex,请参阅 Vuex 官方文档。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值