VUE--VUEX

一、什么是Vuex

Vuex就是一个vue的状态(数据)管理工具,是vue项目实现大范围数据共享的技术方案。能够方便、高效的实现组件之间的数据共享。

Vuex的好处

        (1)数据的存储一步到位,不需要层层传递

        (2)数据的流动十分清晰

        (3)存储在Vuex中的数据都是响应式的(数据更新后,使用数据的组件也会自动更新) 

适合存储到Vuex中的数据----需要共享的数据

Vuex的使用场景:

        频繁、大范围的数据共享。

        (1)某个状态在很多个组件中使用

        (2)多个组件共同维护一份数据 

 

二、Vuex的安装及配置

        1、执行以下命令,安装Vuex 

        注:我的项目是vue2的项目,所以安装的是3.6.2版本的vuex

npm i vuex@3.6.2

         2、新建src/store/index.js,专门存放vuex

        在src目录下新建store文件夹,并在store文件夹下新建index.js文件

        3、创建仓库 

        index.js 内容如下:

// 导入 vue
import Vue from 'vue'
// 导入 vuex
import Vuex from 'vuex'
// vuex也是vue的插件, 需要use一下, 进行插件的安装初始化
Vue.use(Vuex)

// 创建仓库实例对象 store
const store = new Vuex.Store()

// 导出仓库对象
export default store

        4、挂载到main.js中

         在main.js中导入,并挂载到Vue示例上

        main.js中的内容如下:

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

Vue.config.productionTip = false

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

        4、测试仓库是否创建成功

        在App.vue中,打印store对象,控制台查看结果

created(){
  console.log(this.$store)
}

        若控制台输出如下内容,则代表创建仓库成功 

三、state的基础使用 

 state作用:state属性的值是一个对象,用于存储全局共享的数据

        1、存储数据

        在store/index.js中添加如下内容: 

const store = new Vuex.Store({
  //这里配置vuex
  // state 用于存储数据(存储状态)(Vuex状态管理)
  state: {
    age: 18,
    name: 'Tom',
    list: [
      { id: 1, name: 'John', isDone: true },
      { id: 2, name: 'Juliy', isDone: true },
      { id: 2, name: 'Lily', isDone: true },
    ],
  },
})

        2、vue页面中使用

  <div>
    组件1
    <p>{{ $store.state.name + '--' + $store.state.age }}</p>
  </div>

       3、js中使用

import store from "@/store"

console.log(store.state.age)

       4、 结果

 

        5、严格模式

开启严格模式,防止在组件中直接修改state数据,开启后,若直接修改state数据,会报错 

        开启方法:

const store = new Vuex.Store({
  //这里配置vuex
  // 开启严格模式,防止在组件中直接修改state数据
  strict: true,
})

四、mutations的基础使用 

mutations作用: 修改state数据,且是修改state数据的唯一途径

        1、定义方法 

        在store/index.js中添加如下内容:

const store = new Vuex.Store({
  mutations: {
    updateAge (state, newAge) {
      state.age = newAge
    },
  },
})

        2、vue页面中使用 

<button @click="$store.commit('updateAge', 20)">更新年龄</button>

        3、结果

        页面点击更新年龄按钮,页面中年龄会发生变化

 

五、actions的基础使用

mutations是同步更新数据 (便于监测数据的变化, 更新视图等, 方便于调试工具查看变化),

actions则负责进行异步操作

        1、定义方法 

        在store/index.js中添加如下内容:

const store = new Vuex.Store({
  // mutations里面放同步方法
  mutations: {
    updateAge (state, newAge) {
      state.age = newAge
    },
  },
  // actions里面放异步方法
  actions: {
    updateAgeAfter3s (store, newAge) {
      setTimeout(() => {
        // 只有mutations可以修改数据,所以这里调用mutations的方法
        store.commit('updateAge', newAge)
      }, 3000)
    },
  },
})

        2、vue页面中的使用 

<button @click="$store.dispatch('updateAgeAfter3s', 30)">3s后更新年龄</button>

         3、结果

        页面点击3s后更新年龄按钮,页面中年龄会在3s后发生变化

六、getters的基础使用

getters作用:getters是Vuex中的计算属性(和组件中的计算属性意义一样,但不支持set修改) 

        1、定义方法

        在store/index.js中添加如下内容:

  // 为了方便获取state中的数据,vuex会给每个计算属性的方法,传递一个state参数
  getters: {
    ageComputed (state) {
      return state.age * 2
    },
  },

        2、vue页面中使用

<p>{{ $store.getters.ageComputed }}</p>

        3、结果

七、借助辅助方法使用state和getters

mapState和mapGetters是辅助函数,帮助我们把store中的数据映射到组件的计算属性中, 它属于一种方便的用法。

        store/index.js中的内容不变,还是上方的内容,只有vue页面的使用需要修改。

        1、 导入mapState和mapGetters

import { mapState, mapGetters } from 'vuex'

        2、利用展开运算符映射到computed计算属性中 

  computed: {
    ...mapState(['age', 'name']),
    ...mapGetters(['ageComputed']),
  },

         注:若state中字段名与data中字段名重复,可采用以下方法引入

...mapState({ ages: 'age', uname: 'name' })

        3、vue页面中使用

<p>{{ ages + '---' + uname }}</p>
<p>{{ ageComputed }}</p>

         4、结果

八、借助辅助方法使用mutations和actions

 mapMutations和mapActions,把位于mutations和actions中的方法提取了出来,我们可以将它导入到methods中方便使用。

        1、导入mapMutations和mapActions 

import { mapMutations, mapActions } from 'vuex'

        2、利用展开运算符映射到methods方法中 

  methods: {
    ...mapMutations(['updateAge']),
    ...mapActions(['updateAgeAfter3s']),
  },

         3、vue页面中使用

<button @click="updateAge(22)">更新年龄</button>
<br />
<button @click="updateAgeAfter3s(24)">3s后更新年龄</button>

         4、结果

九、vuex模块化---modules 

由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。

即,如果把所有的状态都放在state中,当项目变得越来越大的时候,Vuex会变得越来越难以维护。

由此,又有了Vuex的模块化。

 

        1、模块定义

        在store文件夹下,新建modules文件夹,在modules文件夹中新建user.js和todo.js文件,文件目录如下:

 

        user.js 的内容如下:

// 存储用户相关数据
export default {
  // 开启命名空间,必须的操作
  namespaced: true,
  // state 用于存储数据(存储状态)(Vuex状态管理)
  state: {
    age: 18,
    name: 'Tom',
  },
  // mutations是修改state数据的唯一途径
  // 所有方法不支持一步更新,只支持同步方法
  mutations: {
    updateAge (state, newAge) {
      state.age = newAge
    },
  },
  // actions里面放异步方法
  actions: {
    updateAgeAfter3s (store, newAge) {
      setTimeout(() => {
        // 只有mutations可以修改数据,所以这里调用mutations的方法
        store.commit('updateAge', newAge)
      }, 3000)
    },
  },
  // getters是Vuex中的计算属性(和组件中的计算属性意义一样,但不支持set修改)
  // 为了方便获取state中的数据,vuex会给每个计算属性的方法,传递一个state参数
  getters: {
    ageComputed (state) {
      return state.age * 2
    },
  },
}

        todo.js的内容如下:

// 存储列表相关数据
export default {
  // 开启命名空间,必须的操作
  namespaced: true,
  // state 用于存储数据(存储状态)(Vuex状态管理)
  state: {
    list: [
      { id: 1, name: 'John', isDone: true },
      { id: 2, name: 'Juliy', isDone: true },
      { id: 3, name: 'Lily', isDone: true },
    ],
  },
}

        2、在index.js中导入并注册modules模块

         store/index.js 内容如下:

// 导入 vue
import Vue from 'vue'
// 导入 vuex
import Vuex from 'vuex'

// 导入小模块
import user from './modules/user'
import todo from './modules/todo'

// vuex也是vue的插件, 需要use一下, 进行插件的安装初始化
// 将vuex注册为插件
Vue.use(Vuex)

// 创建仓库 store
// 创建store实例对象
const store = new Vuex.Store({
  // 这里配置vuex
  // 开启严格模式,防止在组件中直接修改state数据
  strict: true,
  // modules模块注册
  modules: {
    user,
    todo,
  },
})

// 导出仓库/对象
export default store

        3、vue页面中直接使用

<template>
  <div>
    组件1
    <p>{{ $store.state.user.name + '--' + $store.state.user.age }}</p>
    <p>{{ $store.getters['user/ageComputed'] }}</p>
    <button @click="$store.commit('user/updateAge', 20)">更新年龄</button>
    <br />
    <button @click="$store.dispatch('user/updateAgeAfter3s', 30)">3s后更新年龄</button>
  </div>
</template>

<script>
export default {}
</script>

<style lang="less" scoped></style>

        4、利用辅助方法调用 

<template>
  <div>
    组件2
    <p>{{ age + '---' + name }}</p>
    <!-- <p>{{ ages + '---' + uname }}</p> -->
    <p>{{ ageComputed }}</p>
    <ul>
      <li v-for="item in list" :key="item.id">{{ item.name }}</li>
    </ul>
    <br />
    <button @click="updateAge(22)">更新年龄</button>
    <br />
    <button @click="updateAgeAfter3s(24)">3s后更新年龄</button>
  </div>
</template>

<script>
import { mapState, mapGetters, mapMutations, mapActions } from 'vuex'
export default {
  computed: {
    ...mapState('user', ['age', 'name']),
    ...mapState('todo', ['list']),
    // 若state中字段名与data中字段名重复,可采用以下方法引入
    // ...mapState({ ages: 'age', uname: 'name' }),
    ...mapGetters('user', ['ageComputed']),
  },
  methods: {
    ...mapMutations(['user/updateAge']),
    ...mapActions(['user/updateAgeAfter3s']),
  },
}
</script>

<style lang="less" scoped></style>

十、state、getters、mutations、actions的对比

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/348932.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HCIA学习作业二

要求&#xff1a;基于192.168.1.0/24进行合理划分&#xff0c;要求全网通 [AR3]display ip interface brief [AR3]display ip routing-table [AR1]display ip interface brief [AR1]display ip routing-table [AR2]display ip interface brief [AR2]display ip routing-tab…

arco design table遇到的一些问题

问题1&#xff1a;不知情就成了树形table table中不知道为啥就多了个树形加号在前面&#xff0c;查找问题后发现&#xff0c;是后端返回的数据中有children&#xff0c;框架中默认对这个参数做了树形结构。 解决办法&#xff1a; 当时没找到取消或者修改字段的属性或方法&…

使用vscode查bug

具体操作 修改CMakeList.txt # set(CMAKE_BUILD_TYPE "Release")//注释Release模式 set(CMAKE_BUILD_TYPE "Debug")//设置为Debug模式 # set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -g")//注释*这行代码是用来设置 CMake 构建系统中 Release 模式…

nginx限制ip访问

先看一下被禁止的效果 如何配置 禁止访问的话直接在location模块增加类似如下配置 deny all; 完整示例 location / {deny all;root html;index index.html index.htm;} 默认是allow all就是允许所有ip访问,如果只配置指定ip可以访问是无效的,还是所有的ip可以访问 无效示例…

APPium简介及安装

1 APPium简介 1. 什么是APPium&#xff1f; APPium是一个开源测试自动化框架&#xff0c;适用于原生、混合或移动Web应用程序的自动化测试工具。 APPium使用WebDriver协议驱动iOS、Android等应用程序。 2. APPium的特点 支持多平台&#xff08;Android、iOS等&#xff09; …

【RA6M3 HMI Board线下培训笔记】 RT Thread实现物联网应用 ETH+MQTT+LVGL+RTOS 实现温湿度监测

【RA6M3 HMI Board线下培训笔记】 RT Thread实现物联网应用 ETHMQTTLVGLRTOS 实现温湿度监测 1. 序言 随着物联网技术的飞速发展&#xff0c;越来越多的生活场景变得越来越智能&#xff0c;网联化、智能化越来越成为主旋律。 值此之际&#xff0c;RT-Thread 和 瑞萨电子共同…

C语言-算法-线性dp

[USACO1.5] [IOI1994]数字三角形 Number Triangles 题目描述 观察下面的数字金字塔。 写一个程序来查找从最高点到底部任意处结束的路径&#xff0c;使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。 在上面的样例中&#xff0c;从 7 → 3 → 8 →…

k8s中netty服务器容器tcp连接数量优化

netty的http1服务器在运行一段时间后会无法提供服务&#xff0c;返回客户端socket hang up 使用apipost测试抓包显示三次握手后被reset&#xff0c;经查是连接数过多 ps&#xff1a;客户端使用了大量短连接&#xff0c;如果能改成长连接就会消耗更少的连接&#xff0c;但是客户…

第五篇【传奇开心果短博文系列】鸿蒙开发技术点案例示例:ArkUI 组件库常用布局方式

传奇开心果短博文系列 系列短博文目录鸿蒙开发技术点案例示例短博文系列 短博文目录一、前言二、ArkUI 中常用的布局方式介绍三、Flex 布局示例代码四、Grid 布局示例代码五、Stack 布局示例代码六、Panel 布局示例代码七、Tab 布局示例代码八、Drawer 布局示例代码九、Card 布…

Redis客户端之Redisson(二)Redisson分布式锁

一、原理&#xff1a; Redisson并没有通过setNx命令来实现加锁&#xff0c;而是基于 Redis 看⻔狗机制&#xff0c;自己实现了一套分布式锁逻辑。 1、加锁机制&#xff1a; 二、使用方法&#xff1a;

关于mysql默认禁用本地数据加载的情况处理(秒解决)

1.首先报错信息&#xff1a;ERROR 3948 (42000): Loading local data is disabled; this must be enabled on both the client and server sides 2.排查问题&#xff1a; 先检查local_infile的状态&#xff1a;使用sql指令 show global variables like local_infile; 这种情…

【软件测试】学习笔记-构建并执行 JMeter 脚本的正确姿势

有些团队在组建之初往往并没有配置性能测试人员&#xff0c;后来随着公司业务体量的上升&#xff0c;开始有了性能测试的需求&#xff0c;很多公司为了节约成本会在业务测试团队里选一些技术能力不错的同学进行性能测试&#xff0c;但这些同学也是摸着石头过河。他们会去网上寻…

【笔记】顺利通过EMC试验(1-15)-视频笔记

视频链接 【跟杨老师学习电磁兼容-顺利通过EMC&#xff08;1~15&#xff09;_哔哩哔哩_bilibili 【跟杨老师学习电磁兼容-顺利通过EMC试验&#xff08;16~41&#xff09;_哔哩哔哩_bilibili P2:电子设备的电磁兼容性要求 &#xfeff; 跟杨老师学习电磁兼容-顺利通过EM... …

探索HTMLx:强大的HTML工具

1. HTMLX htmx 是一个轻量级的 JavaScript 库&#xff0c;它允许你直接在 HTML 中使用现代浏览器的功能&#xff0c;而不需要编写 JavaScript 代码。通过 htmx&#xff0c;你可以使用 HTML 属性执行 AJAX 请求&#xff0c;使用 CSS 过渡动画&#xff0c;利用 WebSocket 和服务…

数据结构·单链表经典例题

1. 移除链表元素 OJ链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 本题是说给出一个链表的头节点head和一个整数val&#xff0c;如果发现节点中存的数据有val就删掉它&#xff0c;最后返回修改后的链表头节点地址 如果题目中没有明确…

用vue实现微信小程序的点餐首页-纯前端效果

一、效果图 图片来源于网络 二、代码 <template><view class"container"><view class"top"><image src"../../static/img/home.png" class"home"></image></view><view class"content&…

Lucene 源码分析——BKD-Tree

Lucene 源码分析——BKD-Tree - AIQ Bkd-Tree Bkd-Tree作为一种基于K-D-B-tree的索引结构&#xff0c;用来对多维度的点数据(multi-dimensional point data)集进行索引。Bkd-Tree跟K-D-B-tree的理论部分在本篇文章中不详细介绍&#xff0c;对应的两篇论文在附件中&#xff0c…

【lodash.js】非常好用高性能的 JavaScript 实用工具库,防抖,深克隆,排序等

前言&#xff1a;lodash是一款前端必须要知道的js库&#xff0c;它里面提供了许多常用的功能和实用的工具函数 基本上我参与的项目中都有lodash&#xff0c;只能说lodash太强大了&#xff0c;lodash.js 提供了超过 300 个实用的工具函数&#xff0c;涵盖了很多常见的编程任务 l…

3D点云数据的标定,从搭建环境到点云标定方法及过程,只要有一台Windows笔记本,让你学会点云标定

ptscloudpre: 点云标定准备&#xff1a; 说明&#xff1a; 如下介绍适用windows系统的电脑。apple笔记本同理&#xff0c;但是需要安装MAC版本的anaconda。网址&#xff1a;Free Download | Anaconda可下载对应MAC版本的Anaconda的安装包建议下载2022年或2021年的安装包安装。…

华硕ASUS K43SD笔记本安装win7X64(ventoy为入口以支撑一盘多系统);友善之臂mini2440开发板学习

记录 老爷机 白色 华硕 K43SD 笔记本 安装 win7X64 1. MBR样式常规安装win7X64Sp1 (华硕 K43SD 安装 win7X64 ) 老爷机 白色 华硕 K43SD 笔记本 安装 win7X64 (常规安装) 设置: 禁用UEFI 启用AHCI ventoy制作MBR(非UEFI)方式的启动U盘 U盘中放cn_windows_7_ultimate_wit…