当前位置: 首页 > news >正文

快速入门vuex带案例说明(超详细易理解)

理论

关于VueX

VueX是适用于在Vue项目开发时使用的状态管理工具。试想一下,如果在一个项目开发中频繁的使用组件传参的方式来同步data中的值,一旦项目变得很庞大,管理和维护这些值将是相当棘手的工作。为此,Vue为这些被多个组件频繁使用的值提供了一个统一管理的工具——VueX。在具有VueX的Vue项目中,我们只需要把这些值定义在VueX中,即可在整个Vue项目的组件中使用。

VueX中的核心内容

在VueX对象中,其实不止有state,还有用来操作state中数据的方法集,以及当我们需要对state中的数据需要加工的方法集等等成员。

成员列表:

  • state 存放状态
  • mutations state成员操作
  • getters 加工state成员给外界
  • actions 异步操作
  • modules 模块化状态管理

VueX的工作流程

在这里插入图片描述
首先,Vue组件如果调用某个VueX的方法过程中需要向后端请求时或者说出现异步操作时,需要dispatch VueX中actions的方法,以保证数据的同步。可以说,action的存在就是为了让mutations中的方法能在异步操作中起作用。

如果没有异步操作,那么我们就可以直接在组件内提交状态中的Mutations中自己编写的方法来达成对state成员的操作。注意,1.3.3节中有提到,不建议在组件中直接对state中的成员进行操作,这是因为直接修改(例如:this.$store.state.name = ‘hello’)的话不能被VueDevtools所监控到。

最后被修改后的state成员会被渲染到组件的原位置当中去。

使用

安装vuex

  1. 使用npm下载:
    npm install vuex --save
  2. 使用vue-cli构建项目时选择使用vuex

创建文件及基本结构

  1. 创建store文件夹,目录结构如下:
    在这里插入图片描述
  2. 创建index.js,代码结构如下:

// 导入vue及vuex
import Vue from 'vue'
import Vuex from 'vuex'
// 挂载vuex
Vue.use(Vuex)

// 创建vuex对象并向外暴露
export default new Vuex.Store({
  // 全局属性变量
  state: {
  },
  // 全局同步方法, 调用方法,this.$store.commit("xxx")
  mutations: {
  },
  // 异步方法 调用方法,this.$store.dispatch("xxx") 
  actions: {
  },
  // Vuex属性计算,在视图里面当变量使用
  getters: {
  },
  // 模块化注册
  modules: {
  }
})

挂载到vue实例中并设置全局调用

在入口文件main.js中添加

// 导入
import store from './store/index.js'
// 挂载到Vue实力上,全局可通过this.$store进行调用
Vue.prototype.$store = store

理解

State:

vuex中的数据源,我们需要保存的数据就保存在这里,可以在页面通过 this.$store.state来获取我们定义的数据;

  state: {
    name: 'Trist',
    age: 21
  }
  <div> {{ this.$store.state.name }} </div>
  <div> {{ this.$store.state.age }} </div>

实现效果如图:
在这里插入图片描述

Mutations:

在我们获取到数据后,我们想修改定义在state中的数据,这时我们就需要在mutations中定义方法,实现state中数据的修改,增加,删除等

  1. 我们现在test.vue文件中添加两个按钮,一个加1,一个减1;这里我们点击按钮调用 addFun(执行加的方法)和 minusFun(执行减法的方法),然后在里面直接提交mutations中的方法修改值
<template>
  <div>
  <h1>使用vuex状态管理模式</h1>
  <div> {{ this.$store.state.name }} </div>
  <div> {{ this.$store.state.age }} </div>
  <button @click="addFun"> + </button>
  <button @click="minusFun"> - </button>
  </div>
</template>

<script>
export default {
  name: 'vuex',
  methods: {
    addFun () {
      this.$store.commit('add')
    },
    minusFun () {
      this.$store.commit('minus')
    }
  }
}
</script>
  1. 我们进去到store中的index.js文件,添加mutations,在mutations中定义两个函数,用来对age进行加1和减1的操作,这里定义的两个方法就是上面commit提交的两个方法
  mutations: {
    add (state) {
      state.age = state.age + 1
    },
    minus (state) {
      state.age = state.age - 1
    }
  }

实现效果如图:
在这里插入图片描述

Getters:

Getters相当于vue中的computed计算属性,getters 的返回值会根据它的依赖被缓存起来,且只有当它的依赖值发生了改变才会被重新计算,Getters 可以用于监听、state中的值的变化,返回计算后的结果

Getters中的方法有两个默认参数

  • state 当前VueX对象中的状态对象
  • getters 当前getters对象,用于将getters下的其他getter拿来用
  1. 添加getters,定义一个名字显示的方法以及名字加年龄显示的方法,getters可以帮助我们对state的数据进行加工后传递,并且能监听state中age数据的变化,实时传递出去。
  getters: {
    nameInfo (state) {
      return '我是' + state.name
    },
    fullInfo (state, getter) {
      return getter.nameInfo + '我今年' + state.age
    }
  }
  1. 在test.vue中渲染
  <div> {{ this.$store.getters.nameInfo }} </div>
  <div> {{ this.$store.getters.fullInfo }} </div>

实现效果如图:
在这里插入图片描述

Actions:

由于直接在mutation方法中进行异步操作,将会引起数据失效。所以提供了Actions来专门进行异步操作,最终提交mutation方法。

Actions中的方法有两个默认参数

  • context 上下文(相当于箭头函数中的this)对象
  • payload 挂载参数
  1. 我们看到,当点击加减的按钮后,页面上的值是改变了;我们达到了修改store中状态值的目的,但是,官方并不支持我们这样直接去修改store里面的值,而是让我们去提交一个actions,在actions中提交mutation再去修改状态值,接下来我们修改index.js文件,先定义actions提交mutation的函数
  actions: {
    addFun (context) {
      context.commit('add')
    },
    minusFun (context) {
      context.commit('minus')
    }
  }
  1. 这里我们把commit提交mutations修改为使用dispatch来提交actions
  methods: {
    addFun () {
      this.$store.dispatch('addFun')
    },
    minusFun () {
      this.$store.dispatch('minusFun')
    }
  }

可以发现页面实现效果不变,无报错
在这里插入图片描述

Modules:

当项目庞大,状态非常多时,可以采用模块化管理模式。Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块——从上至下进行同样方式的分割。

示例:

  • 主index.js进行导入
  modules: {
	  city
  }
  • 模块 city.js 将信息配置在内,并暴露出去

在这里插入图片描述

  • 目录结构:

在这里插入图片描述

刚开始学习vuex时,只是大致懂一点。在实战项目开发的时候,发现有些方面还是不太熟悉,于是查询网络上的资料,作出了以下文档,希望能帮助到您
参考网址:
https://vuex.vuejs.org/zh/
https://www.jianshu.com/p/2e5973fe1223
https://baijiahao.baidu.com/s?id=1618794879569468435&wfr=spider&for=pc

相关文章:

  • wifi信道1,6,11科普
  • uni-app中微信小程序端使用腾讯地图API实现定位服务(超详细教程)
  • CSS 3学习——transition 过渡
  • 关于React中DOM,虚拟DOM及diff算法的理解
  • 类型签名在Javascript中的探索
  • 快速入门,理解,使用 axios请求
  • 第二章 存储,2.1 永不停止的脚步——数据库优化之路(作者:佳毅)
  • CSS实现元素水平垂直居中的几种方式
  • 年末购机推荐,首选OPPO这两款中端旗舰王者
  • js中深浅拷贝的实现方式(含图解原理)
  • Java刷题知识点之File对象常用功能:获取文件名称、获取文件路径、获取文件大小、获取文件修改时间、创建与删除、判断、重命名、查看系统根目录、容量获取、获取某个目录下内容、过滤器...
  • 查看httpd状态
  • js中如何判断引用值为数组(几种不同方式的详解)
  • 项目代码重用
  • js中数组去重的几种实现方式(区别)
  • Angular6错误 Service: No provider for Renderer2
  • css选择器
  • Date型的使用
  • isset在php5.6-和php7.0+的一些差异
  • jdbc就是这么简单
  • Map集合、散列表、红黑树介绍
  • php面试题 汇集2
  • Redis字符串类型内部编码剖析
  • session共享问题解决方案
  • 工作中总结前端开发流程--vue项目
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 基于webpack 的 vue 多页架构
  • 记录一下第一次使用npm
  • 如何使用 JavaScript 解析 URL
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 译有关态射的一切
  • Nginx实现动静分离
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (floyd+补集) poj 3275
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (四)库存超卖案例实战——优化redis分布式锁
  • (五)网络优化与超参数选择--九五小庞
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (转)平衡树
  • .NET/C# 使用反射注册事件
  • .Net中wcf服务生成及调用
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • @PreAuthorize注解
  • []T 还是 []*T, 这是一个问题
  • [AIGC 大数据基础]hive浅谈
  • [Android]竖直滑动选择器WheelView的实现
  • [C#]无法获取源 https://api.nuge t.org/v3-index存储签名信息解决方法
  • [C++]——带你学习类和对象
  • [cb]UIGrid+UIStretch的自适应
  • [git] windows系统安装git教程和配置
  • [Google Guava] 1.1-使用和避免null