iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >深入了解Vue.js中的Vuex状态管理模式
  • 394
分享到

深入了解Vue.js中的Vuex状态管理模式

Vuex状态管理模式Vuex状态管理 2023-05-19 20:05:45 394人浏览 安东尼
摘要

目录Vuex使用安装vuex配置vuex页面刷新数据丢失问题Vuex Vuex 是一个专为 vue.js 开发的状态管理模式。主要是是做数据交互,父子组件传值可以很容易办到,但是兄弟

Vuex

Vuex 是一个专为 vue.js 开发的状态管理模式。主要是是做数据交互,父子组件传值可以很容易办到,但是兄弟组件间传值(兄弟组件下又有父子组件),页面多并且一层嵌套一层的传值,非常麻烦,这个时候我们就用vuex来维护共有的状态或数据。

vuex一共有五大核心概念

1.state: 用来定义数据的(相当于data),在页面中用获取定义的数据用:

this.$store.state.变量名

getters:计算属性(相当于vue中的computed),依赖于缓存,只有缓存中的数据发生变化才会重新计算。getters中的方法接收一个state对象作为参数。

如:
state:{
	count: 1
},
getters:{ 
     getCount(state) {
         return state.count + 1
     }
  },

在页面中获取用:

this.$store.getters.getCount
<h2>{{this.$store.getters.getCount}}</h2>

mutations:是修改 state 值的唯一方法,它只能是同步操作

在页面中获取用:

this.$store.commit("方法名")
//可以向 store.commit 传入额外的参数,即 mutation 的 载荷(payload)
store.commit('increment', 10)
// ...
mutations: {
  increment (state, n) {
    state.count += n
  }
}

actions:提交的是 mutations,而不是直接变更状态,它可以包含任意异步操作

modules: 模块,Vuex允许将store分割成模块,每个模块都拥有自己的state,getters,mutations,actions,甚至嵌套模块。可以避免变量名相同而导致程序出现问题。

const moduleA = {
  state: {},
  mutations: {},
  actions: {},
  getters: {}
}
const moduleB = {
  state: {},
  mutations: {},
  actions: {},
  getters: {}
}
export default new Vuex.Store({
  modules: {
    a: moduleA,
    b: moduleB
  }
})
// 在各自的模块内部使用
state.price // 这种使用方式和单个使用方式一样,直接使用就行
//在组件中使用
store.state.a.price // 先找到模块的名字,再去调用属性
store.state.b.price // 先找到模块的名字,再去调用属性

使用

安装vuex

npm install --save vuex

配置vuex

在src文件夹下新增一个store文件夹,里面添加一个index.js文件

然后在main.js中引入store文件下的index.js

// main.js内部对vuex的配置
import store from '@/store/index.js' 
new Vue({
    el: '#app',
    store, // 将store暴露出来
    template: '<App></App>',
    components: { App }
});

之后我们开始进行store文件下的index.js配置

import Vue from 'vue'; //首先引入vue
import Vuex from 'vuex'; //引入vuex
Vue.use(Vuex) 
export default new Vuex.Store({
    state: { 
        // state 类似 data
        //这里面写入数据
    },
    getters:{ 
        // getters 类似 computed 
        // 在这里面写个方法
    },
    mutations:{ 
        // mutations 类似methods
        // 写方法对数据做出更改(同步操作)
    },
    actions:{
        // actions 类似methods
        // 写方法对数据做出更改(异步操作)
    }
})

举例:

在store中定义商品的原价,计算折扣价,根据用户输入的数量和商品原价计算出总价

【1】我们约定store中的数据是以下形式

import Vue from 'vue'; //首先引入vue
import Vuex from 'vuex'; //引入vuex
Vue.use(Vuex) 
export default new Vuex.Store({
    state: { 
        price: 100, // 原价
        total: '',  // 总价
    },
    getters:{ 
        // 折扣价
        discount(state, getters) {
            return state.price*0.8
        }
    },
    mutations:{ 
        // 计算总价:第一个参数为默认参数state, 后面的参数为页面操作传过来的参数
        getTotal(state, n) {
            return  state.total = state.price * n;
        }
    },
    actions:{
        // 这里主要是操作异步操作的,使用起来几乎和mutations方法一模一样
        // 除了一个是同步操作,一个是异步操作,一个使用commit调用,一个使用dispatch调用
        // 这里就不多介绍了,有兴趣的可以自己去试一试,
        // 比如你可以用setTimeout去尝试一下
    }
})

【2】在页面中使用store中的数据

```javascript
<template>
  <div>
    <p>原价:{{price}}</p>
    <p>8折:{{discount}}</p>
    <p>数量:<input type="text" v-model="quantity"></p>
    <p>总价:{{total}}</p>
    <button @click="getTotal">计算总价</button>
  </div>
</template>
<script>
  export default {
    data() {
      return {
        quantity: 0,
      }
    },
    computed: {
      price() {
        return this.$store.state.price
      },
      discount() {
        return this.$store.getters.discount
      },
      total() {
        return this.$store.state.total
      }
    },
    mounted() {
    },
    methods: {
      getTotal() {
        this.$store.commit('getTotal', this.quantity)
      }
    },
  }
</script>

【3】页面效果

再举例应用场景:

比如登录页面,既可以用手机号验证码登录,也可以用手机号密码登录,进行切换的时候想保留输入的手机号码,这个时候我们可以用vuex。

页面刷新数据丢失问题

vuex存储的数据作为全局的共享数据,是保存在运行内存中的,当页面刷新时,会重新加载vue实例,vuex里的数据会重新初始化,从而导致数据丢失。

怎么解决?

直接在vuex修改数据方法中将数据存储到浏览器缓存中(sessionStorage、localStorage、cookie)

import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);
export default new Vuex.Store({
    state: {
       orderList: [],
       menuList: []
   },
    mutations: {
        orderList(s, d) {
          s.orderList= d;
          window.localStorage.setItem("list",JSON.stringify(s.orderList))
        },  
        menuList(s, d) {
          s.menuList = d;
          window.localStorage.setItem("list",jsON.stringify(s.menuList))
       },
   }
})

在页面加载时再从本地存储中取出并赋给vuex

if (window.localStorage.getItem("list") ) {
        this.$store.replaceState(Object.assign({}, 
        this.$store.state,JSON.parse(window.localStorage.getItem("list"))))
}

到此这篇关于深入了解Vue.js中的Vuex状态管理模式的文章就介绍到这了,更多相关Vuex状态管理模式内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 深入了解Vue.js中的Vuex状态管理模式

本文链接: https://www.lsjlt.com/news/213742.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 深入了解Vue.js中的Vuex状态管理模式
    目录Vuex使用安装vuex配置vuex页面刷新数据丢失问题Vuex Vuex 是一个专为 Vue.js 开发的状态管理模式。主要是是做数据交互,父子组件传值可以很容易办到,但是兄弟...
    99+
    2023-05-19
    Vuex状态管理模式 Vuex状态管理
  • 深入理解Java设计模式之状态模式
    目录一、什么是状态模式二、状态模式的结构三、状态模式的使用场景四、状态模式和策略模式对比五、状态模式的优缺点六、状态模式的实现七、总结一、什么是状态模式 定义:当一个对象的内在状态改...
    99+
    2022-11-12
  • vuex状态管理模式的示例分析
    小编给大家分享一下vuex状态管理模式的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、前言本次接受一个BI系统,要求...
    99+
    2022-10-19
  • vuejs中vuex状态管理模式的示例分析
    这篇文章给大家分享的是有关vuejs中vuex状态管理模式的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。关于vuex类的新闻最近很多,看到眼热就去查了下资料,然后扯出来...
    99+
    2022-10-19
  • vue中状态管理模式vuex的示例分析
    这篇文章主要介绍了vue中状态管理模式vuex的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。vuex是一个专门为vue.js设计的...
    99+
    2022-10-19
  • Java代理模式的深入了解
    目录一、静态代理模式1.1、 代理模式的定义:1.2、代理模式的优缺点二、动态代理模式总结一、静态代理模式 1.1、 代理模式的定义: 由于某些原因需要给某对象提供一个代理以控制对该...
    99+
    2022-11-12
  • 一文详解Pinia和Vuex与两个Vue状态管理模式
    目录前言安装挂载VuexPinia修改状态vuexPiniaPinia解构(storeToRefs)gettersPiniaVuexmodulesPiniaVuex写在最后前言 Pi...
    99+
    2022-11-13
  • Vuex中状态管理器的使用详解
    目录一、Vuex是什么?二、什么时候使用Vuex三、Vuex的核心概念和API四、应用举例五、vuex中各种辅助函数的用法,可以使我们更加方便的运用vuex一、Vuex是什么? Vu...
    99+
    2022-11-13
  • Python设计模式中的状态模式你了解吗
    目录状态模式应用场景代码示例总结状态模式 状态模式,当对象的内部状态发生了改变的时候,允许对象执行不同的流程。 优点: 封装了状态转换规则。枚举了可能的状态,在枚举状态之前需要确定...
    99+
    2022-11-13
  • 浅析集中式状态管理Vuex的使用方法
    如何使用集中式状态管理的Vuex?下面本篇文章就带大家了解一下vuex,简单聊聊vuex的使用方法,希望对大家有所帮助!1.vuex是什么一个专门在Vue中实现集中式状态管理的一个Vue插件,可以对vue应用中多个组件的共享状态进行集中式的...
    99+
    2023-05-14
    VueX
  • 深入了解C语言的动态内存管理
    目录一、为什么会存在动态内存二、动态内存函数1.malloc和free2.calloc3.realloc三、动态内存函数常见错误2.对NULL指针进行解引用操作3.使用free释放一...
    99+
    2022-11-13
  • C语言的动态内存管理的深入了解
    目录一、动态内存分配二、动态内存分配函数1、malloc()2、realloc()3、calloc()三、用free函数释放内存四、迷途指针总结一、动态内存分配 (1)用malloc...
    99+
    2022-11-13
  • 深入了解GoLang中的工厂设计模式
    目录1. 定义2. 优点3. 代码实现3.1 普通工厂3.2 工厂方法3.3 抽象工厂1. 定义 工厂模式是一种创建型设计模式,有了工厂只需要知道要制造的东西名字,就能让对应工厂进行...
    99+
    2023-05-20
    GoLang工厂模式 Go工厂模式 GoLang设计模式工厂模式
  • 深入理解Android中的建造者模式
    前言 在Android开发过程中,我发现很多安卓源代码里应用了设计模式,比较常用的有适配器模式(各种adapter),建造者模式(Alert Dialog的构建)等等。虽然我们...
    99+
    2022-06-06
    建造者 Android
  • 如何深入理解Java设计模式的中介者模式
    这期内容当中小编将会给大家带来有关如何深入理解Java设计模式的中介者模式,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、什么是中介者模式用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地...
    99+
    2023-06-25
  • 怎么深入理解Java设计模式中的访问者模式
    怎么深入理解Java设计模式中的访问者模式,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一、什么是访问者模式定义:表示一个作用于其对象结构中的各元素的操作,它使你可以在不改变各...
    99+
    2023-06-25
  • 如何深入理解Java多线程与并发框中线程的状态
    本篇文章给大家分享的是有关如何深入理解Java多线程与并发框中线程的状态,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1. 新建状态(New)万事万物都不是凭空出现的,线程也一...
    99+
    2023-06-05
  • 深入理解Java中观察者模式与委托的对比
    目录代码背景观察者模式介绍实现观察者(学生)通知者(老师)Main方法观察者通知者 事件事件处理 委托 介绍 总结代码背景 一个班级,有两类学生,A类:...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作