vuex3的介绍与state、actions和mutations的使用

news2024/11/25 10:37:55

一、定义

官网:Vuex 是什么? | Vuex (vuejs.org)

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

二、安装

cdn

<script src="/path/to/vuex.js"></script>

npm (@3是为了指定版本,否则装的是最新版)

做过淘宝镜像的使用cnpm命令,如果没有做过,请使用npm命令

cnpm install vuex@3 --save

三、特点

这个状态自管理应用包含以下几个部分(也是特点,从官网获取):

  • state,驱动应用的数据源;(也就是说state的用来放状态数据的)

  • view,以声明方式将 state 映射到视图;(也就是将state的数据展示在浏览器的内容中)

  • actions,响应在 view 上的用户输入导致的状态变化。(用户需要通过actions来触发改变状态数据)

以下是一个表示“单向数据流”理念的简单示意图(从官网获取):因其顺序不可逆,所以是单向数据流

为了解决遇到多组件共享状态时,依旧维持单向数据流的简洁性,以及保持视图和和状态间的独立性,我们将组件的共享状态抽取出来,形成一个全局单例模式管理。这样,我们的代码将会变得更结构化且易维护。(此为阅读官网后的个人理解,如有错误请指正,谢谢♪(・ω・)ノ)

如下图:

Vue Components:组件。最终将数据呈现在视图中。所以数据Render(渲染)出来。

此结构也是不可逆的,再次证明其是是单向数据流的形式。

如果用户需要改变数据的流程:需要通过Dispatch方式去改,把最新值给到Actions。再通过Commit将数据提交给Mutations,其作用是专门修改state状态数据。此时state的值就是最新值,然后再次Render(渲染)给Vue Components

Backend API:接口。在Actions这块,我们可以做一些异步交互请求操作,拿到最新值。

Devtools:调试工具。我们可以通过调试工具看Mutations的最新值和旧值。

四、vuex的应用

每一个 Vuex 应用的核心就是 store(仓库)。——> 使用Vuex的目的就是为了得到store仓库

“store”基本上就是一个容器,它包含着你的应用中大部分的状态 (state)

Vuex 和单纯的全局对象有以下两点不同:

  1. Vuex 的状态存储是响应式的。当 Vue 组件从 store 中读取状态的时候,若 store 中的状态发生变化,那么相应的组件也会相应地得到高效更新。

  1. 改变 store 中的状态的唯一途径就是显式地提交 (commit) mutation

引入vuex和创建store对象不需要自己写,在Vue自主搭建项目的时候就可以自动生成基本结构。链接请点:Vue自主搭建项目

4.1引入。(引入后就可以在任何组件中拿到状态数据了)

以下为自主搭建好的项目demo中,store文件夹里index.js的格式(注释是我自己写的)

1. 引入vuex及创建并导出store对象

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

Vue.use(Vuex)

// 创建store对象
/**
 * 接收参数:Object
 * 该对象包含5个核心:state,actions,mutations,getters,modules
 */
export default new Vuex.Store({
  /**
   * 存放状态数据
   */
  state: {
  },
  getters: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
  }
})

2.在入口文件main.js中引入store并放入vue实例当中(此结构也是自动生成)

import Vue from 'vue'
import App from './App.vue'
import router from './router'
// 1.引入store
import store from './store'

Vue.config.productionTip = false

new Vue({
  router,
  // 2.再将store放入vue实例当中
  store,
  render: h => h(App)
}).$mount('#app')

4.2使用

  1. 基础配置:

在src目录下创建pages文件夹,在pages文件夹中创建Box1.vue文件,建好基本结构。要访问Box1里的组件需要先在router的index.js中引入组件以及配置规则。

(此前要在App.vue文件中设置路由出口<router-view></router-view>)

<template>
  <div>
    <router-view></router-view>
  </div>
</template>

Box1.vue

<template>
  <div>
    <h2>Box1组件</h2>
  </div>
</template>

<script>
export default {

}
</script>

<style>

</style>

index.js

// 引入组件
const Box1=()=>import('@/pages/Box1')

// 规则
const routes = [
  {
    path: '/box1',
    component: Box1
  },
]
  1. 通过State将数据渲染到页面中。(mapState辅助函数)

当一个组件需要获取多个状态的时候,将这些状态都声明为计算属性会有些重复和冗余。为了解决这个问题,我们可以使用 mapState 辅助函数帮助我们生成计算属性,让你少按几次键。

1)在Box1.vue中导出辅助函数mapState。接收参数:[ ]/{ },返回值:对象

import { mapState } from 'vuex'

2)在计算属性computed中使用辅助函数

 computed:{
    ...mapState({
    //:左侧为自定义属性名  :右侧为映射到state中的属性名
    newName:'name',
    age:'age'
  })
  }

3)Box1.vue全部代码

<template>
  <div>
    <h2>Box1组件</h2>
    <div>name值:{{ newName }}</div>
    <div>age值:{{ age }}</div>
  </div>
</template>

<script>
// 导出辅助函数mapState
import { mapState } from 'vuex'
export default {
  computed:{
    ...mapState({
    //:左侧为自定义属性名  :右侧为映射到state中的属性名
    newName:'name',
    age:'age'
  })
  }
}
</script>

<style>

</style>

此时页面中为:

  1. 提交修改数据Actions

1)actions作用:(1)commit mutations (2)异步请求 (3)自调

2)actions使用:(1)方法名自定义 (2)系统自动注入参数:context。context中有commit方法、 dispatch方法、state属性

声明两个自定义方法并提交修改数据:

    nameActions(context,name){
      //console.log(context);
      //console.log(name);
      //提交mutations中的事件  参数:值(字符串形式)
        context.commit('changeName',name)
    },
    ageActions(context,age){
       context.commit('changeage',age)
    },

3)在Box1.vue中加入button按钮以及使用dispatch方法。

dispatch作用:映射actions中的事件

dispatch参数:事件名(字符串形式)、修改的数据

 <button @click="changeName('wsx')">修改name</button>  

methods:{
    changeName(name){
      this.$store.dispatch('nameActions',name)
    },
    changeage(age){
      this.$store.dispatch('ageActions',age)
    }
  }

此时点击修改name按钮就能在控制台拿到要修改的name值。

4.修改state状态数据mutations

方法名自定义,系统自动注入参数state。

actions中的 context.commit('changeName',name)代码将要修改的name值提交给mutations。(age值一样)

需要在mutations中定义的方法里接收name和age值。

  // 作用:专门修改state状态数据
  mutations: {
    /**
     * 1.方法名自定义
     * 2.系统自动注入参数state
     */
    changeName(state,name){
      // state中的name属性=新的name值
      state.name=name
    },
    changeage(state,age){
      state.age=age
    }
  },

点击按钮修改成功如下:

五、代码总结

Box1.vue

<template>
  <div>
    <h2>Box1组件</h2>
    <div>name值:{{ newName }}</div>
    <div>age值:{{ age }}</div>
    <button @click="changeName('wsx')">修改name</button>
    <button @click="changeage(26)">修改age</button>
  </div>
</template>

<script>
// 导出辅助函数mapState
import { mapState } from 'vuex'
export default {
  computed:{
    ...mapState({
    //:左侧为自定义属性名  :右侧为映射到state中的属性名
    newName:'name',
    age:'age'
  })
  },
  methods:{
    changeName(name){
      this.$store.dispatch('nameActions',name)
    },
    changeage(age){
      this.$store.dispatch('ageActions',age)
    }
  }
}
</script>

<style>

</style>

index.js

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

Vue.use(Vuex)

// 创建store对象
/**
 * 接收参数:Object
 * 该对象包含5个核心:state,actions,mutations,getters,modules
 */
export default new Vuex.Store({
  /**
   * 存放状态数据
   */
  state: {
    name:'pjm',
    age:'24'
  },
  getters: {
  },
  // 作用:专门修改state状态数据
  mutations: {
    /**
     * 1.方法名自定义
     * 2.系统自动注入参数state
     */
    changeName(state,name){
      // state中的name属性=新的name值
      state.name=name
    },
    changeage(state,age){
      state.age=age
    }
  },
  /**
   * actions作用:1.commit mutations  2.异步请求  3.自调
   */
  actions: {
    /**
     * 1.方法名自定义
     * 2.系统自动注入参数:context
     * 3.context:{commit,dispatch,state}
     */
    nameActions(context,name){
      /* console.log(context);
      console.log(name); */
      /**
       * 提交mutations中的事件
       * 参数1 mutations中的事件 值->字符串
       */
      context.commit('changeName',name)
    },
    ageActions(context,age){
      context.commit('changeage',age)
      // console.log(context);
    },
  },
  modules: {
  }
})

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[手撕数据结构]栈的深入学习-java实现

CSDN的各位uu们你们好,今天千泽带来了栈的深入学习,我们会简单的用代码实现一下栈, 接下来让我们一起进入栈的神奇小世界吧!0.速览文章一、栈的定义1. 栈的概念2. 栈的图解二、栈的模拟实现三.栈的经典使用场景-逆波兰表达式总结一、栈的定义 1. 栈的概念 栈&#xff1a;一种…

Optimizers for Deep Learning

文章目录一、Some NotationsWhat is Optimization about?二、SGDSGD with Momentum(SGDM)Why momentum?三、AdagradRMSProp四、AdamSWATS [Keskar, et al., arXiv’17]Towards Improving AdamTowards Improving SGDMRAdam vs SWATSLookahead [Zhang, et al., arXiv’19]Momen…

[洛谷-P3047] [USACO12FEB]Nearby Cows G(树形DP+换根DP)

[洛谷-P3047] [USACO12FEB]Nearby Cows G一、问题题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示二、分析1、状态表示2、状态转移3、换根DP三、代码一、问题 题目描述 Farmer John has noticed that his cows often move between nearby fields. Taking this in…

【数据结构初阶】单链表面试题|内含链表带环问题

目录 前言 链表面试题 1. 删除链表中等于给定值 val 的所有节点。oj链接 2.反转一个单链表。oj链接 3. 给定一个带有头结点 head 的非空单链表&#xff0c;返回链表的中间结点。如果有两个中间结点&#xff0c;则返回第二个中间结点。oj链接 4. 输入一个链表&#xff0c;…

每天五分钟机器学习算法:贝叶斯算法中处理重复词语的三种方式

什么是重复词语? 我们预测一封邮件是否是垃圾邮件,前面已经介绍,我们需要对其进行分词处理,问题是分词处理之后很有可能有重复的词,那么这重复的词如何处理,这里我们介绍三种方式: 1.多项式模型 2.伯努利模型 3.混合模型 重复的情况举例 现在有一个垃圾邮件,它的内…

安装Linux虚拟机和Hadoop平台教程汇总及踩坑总结

&#x1f4cd;主要内容介绍安装Linux虚拟机、ubuntu系统、安装hadoop三个环节的教程链接介绍及本机与虚拟机的FTP传输教程总结&#xff08;直接找hadoop安装环节的5.filezilla传输文件&#xff09;新鲜出炉的踩坑总结和填坑指南安装Linux虚拟机和ubuntu系统一、材料和工具1、下…

站内SEO内容优化包括那些?

站内SEO优化是指优化网站内部结构&#xff0c;以提高搜索引擎对网站的识别和评价&#xff0c;从而提高网站在搜索引擎自然排名中的权重和位置。 站内SEO内容优化的目标是提高网站内容的质量和相关性&#xff0c;从而吸引更多的用户访问和留存。 以下是一些站内SEO优化的要点&…

Yolov5-交通标志检测与识别

项目介绍 上一篇文章介绍了基于卷积神经网络的交通标志分类识别Python交通标志识别基于卷积神经网络的保姆级教程&#xff08;Tensorflow&#xff09;&#xff0c;并且最后实现了一个pyqt5的GUI界面&#xff0c;并且还制作了一个简单的Falsk前端网页实现了前后端的一个简单交互…

C/C++内存管理讲解

c/C内存管理讲解 C/C内存分布 首先通过一些题目的引入讲解带大家走进C/C的内存分布。 eg1&#xff1a; 根据上述变量的定义&#xff0c;来判断它们所在的内存位置。 从接下来的4个选项中选出最佳答案填入&#xff08;注&#xff1a;可重复选&#xff09;。 A、栈 B、堆 C、数…

已知如下数据库表,写出查询各门课的分数最高者的SQL语句,要求格式为“科目,学生名,分数”,并按科目Id排序

题目描述 在某笔试题中遇到了这样的题目&#xff0c;之前学过数据库原理&#xff0c;但是这综合性太强&#xff0c;一下子犯了难。 解决过程 在数据库中建立上述表&#xff0c;以验证写的SQL对不对 平台&#xff1a;Navicate SQL 16 for MySQL 尝试写SQL查询 尝试1 …

CSS 扫盲

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录引入方式内部样式内联样式外部样式CSS 选择器CSS 常用属性值字体属性设置字体大小粗细文字样式文本属性文本颜色文本对齐文本装…

1640_MIT 6.828 fork函数的功能以及相关代码分析

全部学习汇总&#xff1a; GitHub - GreyZhang/g_unix: some basic learning about unix operating system. 继续分析之前看到的一段代码&#xff0c;先梳理一下这里遇到的fork函数的应用。 1. 这个是属于系统调用类的接口&#xff0c;也是这一段时间我看到的第一个这种类型的接…

Python3实现写作

导语T_T没有科研梦想的人半夜过来水篇文章~~~让Python学会写写歌&#xff0c;创创作~~~纯属娱乐~~~改编自PyTorch官网的一个教程&#xff0c;不过我用TF写的&#xff0c;然后生成英文变成了生成中文~~~Lets Go~~~相关文件百度网盘下载链接: https://pan.baidu.com/s/1VUEFR82Cq…

一个 适用 vue3 ts h5移动端 table组件

vue3-h5-table 介绍 适用于 vue3 ts 的 h5 移动端项目 table 组件 支持 左侧固定 滑动 每行点击回调 支持 指定列排序 链接 &#xff1a;https://github.com/duKD/vue3-h5-table 效果 props说明minTableHeight表格最小高度 可选 默认600rowNum表格显示几行 可选 默认 6he…

使用微软新必应(New Bing)AI机器人生成树莓派Pico W开发板MicroPython应用程序

微软新必应是一款由人工智能驱动的AI搜索引擎&#xff08;基于Chat GPT4.0的先进自然语言生成模型&#xff09;&#xff0c;它能与用户进行流畅、自然、有趣的对话&#xff0c;并提供可靠、及时的搜索结果&#xff0c;以及回答用户的各种问题。我们可以使用新必应生成程序代码、…

MySQL workbench基本查询语句

1.查询所有字段所有记录 SELECT * FROM world.city; select 表示查询&#xff1b;“*” 称为通配符&#xff0c;也称为“标配符”。表示将表中所有的字段都查询出来&#xff1b;from 表示从哪里查询&#xff1b;world.city 表示名为world的数据库中的city表&#xff1b; 上面…

13 node 程序后台执行加上 tail 命令, 中断 tail 命令, 同时也中断了 node 程序

前言 呵呵 最近帮朋友解决问题[2022.09.08] 需要启动一个 node 程序, 然后 需要一个 startUp.sh 脚本 然后 反手写了一个过去, 按道理 来说 应该是 后台启动了对应的 node 程序, 然后将 标准输出, 错误输出 输出到 logs/nohup.log 日志文件中, 然后基于 tail 命令 来查看 …

【Kafka】MM2同步Kafka集群时如何自定义复制策略(ReplicationPolicy)

文章目录需求准备工作自定义复制策略编译代码需求 使用MM2同步集群数据&#xff0c;topic名称不能变&#xff0c;默认的复制策略为&#xff1a;DefaultReplicationPolicy&#xff0c;这个策略会把同步至目标集群的topic都加上一个源集群别名的前缀&#xff0c;比如源集群别名为…

设计模式-第13章(状态模式)

状态模式状态模式状态模式的好处和用处工作状态状态模式 状态模式&#xff08;State&#xff09;&#xff0c;当一个对象的内在状态改变时允许改变其行为&#xff0c;这个对象看起来像是改变了其类。 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况…

【大数据】HDFS客户端命令行(hdfs dfs)详细使用说明

DFS命令使用概览使用说明lsdfducountappendToFilecatchecksumchgrpchmodchownconcatcopyFromLocalcopyToLocalcpcreateSnapshotdeleteSnapshotexpungefindgetgetfaclgetfattrgetmergeheadmkdirmoveFromLocalmoveToLocalmvputrenameSnapshotrmrmdirsetfaclsetfattrsetrepstattai…