一篇文章学懂Vuex

news2025/2/25 10:03:52

一、基于VueCli自定义创建项目

233

344

二、Vuex 初始准备

建项目的时候把vuex勾选上就不用再yarn add vuex@3了

store/index.js

// 这里面存放的就是vuex相关的核心代码
import Vuex from 'vuex'
import Vue from 'vue'

// 插件安装
Vue.use(Vuex)

// 创建仓库(空仓库)
const store = new Vuex.Store()

// 到处给main.js使用
export default store

App.vue

  created () {
    // console.log(this.$router) // 没配
    console.log(this.$store) // 没配
  },

main.js

import Vue from 'vue'
import App from './App.vue'
import store from '@/store/index'
console.log(store.state.count)

Vue.config.productionTip = false

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

三、通过vuex仓库访问数据

(1)通过store直接访问

 新建仓库数据,这样别的模块、组件都可以访问到仓库中的数据。

// 创建仓库(空仓库)
const store = new Vuex.Store({
  // 通过state可以提供数据,所有组件共享的数据
  state: {
    title: '大标题',
    count: 100
  }
}
)

例如,App.vue中的模块中(指的是template中)

    <h1>根组件
      --{{ $store.state.title }}
      --{{ $store.state.count }}
    </h1>

App.vue中的组件中(指的是script中) 

  created () {
    console.log(this.$store.state.count) // 没配
  },

Son.vue(模块template中) 

    从vuex中获取的值: <label>{{ $store.state.count }}</label>

main.js(js中)

console.log(store.state.count)

总结:只需要在App.vue中写好仓库,后面可以直接通过底层的逻辑去调用,即:

模板中:{{$store.state.xxx }}
组件逻辑中:this.$store.state.xxx
JS模块中:store.state.xxx

Son1.vue

<template>
  <div class="box">
    <h2>Son1 子组件 {{ $store.state.title }}</h2>
    从vuex中获取的值: <label>{{ $store.state.count }}</label>
    <br>
    <button>值 + 1</button>
  </div>
</template>

<script>
export default {
  name: 'Son1Com'
}
</script>

<style lang="css" scoped>
.box{
  border: 3px solid #ccc;
  width: 400px;
  padding: 10px;
  margin: 20px;
}
h2 {
  margin-top: 10px;
}
</style>

(2)通过辅助函数(简化)

mapState是辅助函数,帮助我们把store中的数据自动映射到组件的计算属性中

 App.vue

//展示一下 不用

import { mapState } from 'vuex'
console.log(mapState(['count', 'title']))

在App.vue中这么写,就可以直接调用使用里面的值

<template>
  <div id="app">
    <h1>根组件
      --{{ title }}
      --{{ count }}
    </h1>
    <input type="text">
    <Son1></Son1>
    <hr>
    <Son2></Son2>
  </div>
</template>

  computed: {
    ...mapState(['count', 'title'])
  },

Son2.vue,虽然写起来简单还是需要再写一遍解构函数,即  computed: {
    ...mapState(['count', 'title'])
  }

<template>
  <div class="box">
    <h2>Son2 子组件 {{ title }}</h2>
    从vuex中获取的值:<label>{{ count }}</label>
    <br />
    <button>值 - 1</button>
  </div>
</template>

<script>
import { mapState } from 'vuex'
export default {
  name: 'Son2Com',
  computed: {
    ...mapState(['count', 'title'])
  }
}
</script>

<style lang="css" scoped>
.box {
  border: 3px solid #ccc;
  width: 400px;
  padding: 10px;
  margin: 20px;
}
h2 {
  margin-top: 10px;
}
</style>

四、组件修改仓库中的数据

(1)错误情况

<template>
  <div class="box">
    <h2>Son1 子组件 {{ $store.state.title }}</h2>
    从vuex中获取的值: <label>{{ $store.state.count }}</label>
    <br>
    <button @click="handleAdd">值 + 1</button>
  </div>
</template>

<script>
export default {
  name: 'Son1Com',
  methods: {
    handleAdd () {
      // 错误代码,不会报错,并且可以实现,但其实是错的 (但是vue不会监测 监测需要成本)
      // this.$store.state.count++
      // console.log(this.$store.state.count)

      // 应该通过mutation 核心概念 进行修改
    }
  }
}
</script>

<style lang="css" scoped>
.box{
  border: 3px solid #ccc;
  width: 400px;
  padding: 10px;
  margin: 20px;
}
h2 {
  margin-top: 10px;
}
</style>

(2)严格模式 strict:true

为了避免这种情况,方便初学者检查,我们采用严格模式。store/index.js中操作

// 这里面存放的就是vuex相关的核心代码
import Vuex from 'vuex'
import Vue from 'vue'

// 插件安装
Vue.use(Vuex)

// 创建仓库(空仓库)
const store = new Vuex.Store({
  // 严格模式(有利于初学者,检测不规范的代码 => 上线时需要关闭)
  // 其实还是可以修改,只是会提示报错
  strict: true,
  // 通过state可以提供数据,所有组件共享的数据
  state: {
    title: '大标题',
    count: 100
  }
}
)

// 到处给main.js使用
export default store

(3)修改数据-mutations

 store/index.js

// 这里面存放的就是vuex相关的核心代码
import Vuex from 'vuex'
import Vue from 'vue'

// 插件安装
Vue.use(Vuex)

// 创建仓库(空仓库)
const store = new Vuex.Store({
  // 严格模式(有利于初学者,检测不规范的代码 => 上线时需要关闭)
  // 其实还是可以修改,只是会提示报错
  strict: true,
  // 1.通过state可以提供数据,所有组件共享的数据
  state: {
    title: '大标题',
    count: 100
  },

  // 2.通过mutations可以提供修改数据的方法,mutation是一个对象
  mutations: {
    //   所有的mutation函数,第一个参数,都是state
    addCount (state) {
      //   修改数据
      state.count += 1
    },
    addFive (state) {
      //   修改数据
      state.count += 5
    },
    changeTitle (state) {
      state.title = '小标题'
    }
  }

}
)

// 到处给main.js使用
export default store

Son1.vue

<template>
  <div class="box">
    <h2>Son1 子组件 {{ $store.state.title }}</h2>
    从vuex中获取的值: <label>{{ $store.state.count }}</label>
    <br>
    <button @click="handleAdd">值 + 1</button>
    <button @click="addFive">值 + 5</button>
    <button @click="changeFn">改标题</button>

  </div>
</template>

<script>
export default {
  name: 'Son1Com',
  methods: {
    handleAdd () {
      // 错误代码,不会报错,并且可以实现,但其实是错的 (但是vue不会监测 监测需要成本)
      // this.$store.state.count++
      // console.log(this.$store.state.count)

      // 应该通过mutation 核心概念 进行修改数据
      // 需要提交调用mutation
      this.$store.commit('addCount')
    },
    addFive () {
      this.$store.commit('addFive')
    },
    changeFn () {
      this.$store.commit('changeTitle')
    }
  }
}
</script>

<style lang="css" scoped>
.box{
  border: 3px solid #ccc;
  width: 400px;
  padding: 10px;
  margin: 20px;
}
h2 {
  margin-top: 10px;
}
</style>

(4)mutations传参

index.js

  // 2.通过mutations可以提供修改数据的方法,mutation是一个对象
  mutations: {
    //   所有的mutation函数,第一个参数,都是state
    // addCount (state) {
    //   //   修改数据
    //   state.count += 1
    // },
    addCount (state, n) {
      //   修改数据
      state.count += n
    },

    changeTitle (state, newTitle) {
      state.title = newTitle
    }
  }

Son.vue

<template>
  <div class="box">
    <h2>Son1 子组件 {{ $store.state.title }}</h2>
    从vuex中获取的值: <label>{{ $store.state.count }}</label>
    <br>
    <button @click="handleAdd(1)">值 + 1</button>
    <button @click="handleAdd(5)">值 + 5</button>
    <button @click="handleAdd(10)">值 + 10</button>
    <button @click="changeFn">改标题</button>

  </div>
</template>

<script>
export default {
  name: 'Son1Com',
  methods: {
    handleAdd (n) {
      // 错误代码,不会报错,并且可以实现,但其实是错的 (但是vue不会监测 监测需要成本)
      // this.$store.state.count++
      // console.log(this.$store.state.count)

      // 应该通过mutation 核心概念 进行修改数据
      // 需要提交调用mutation
      // this.$store.commit('addCount')
      this.$store.commit('addCount', n)
      console.log(n)
    },
    changeFn (newTitle) {
      this.$store.commit('changeTitle', '黑马程序员')
    }
  }
}
</script>

<style lang="css" scoped>
.box{
  border: 3px solid #ccc;
  width: 400px;
  padding: 10px;
  margin: 20px;
}
h2 {
  margin-top: 10px;
}
</style>

(5)mutations传多参

只能传递有且仅有一个参数,如果是想传递多个参数,可以写成对象数组的形式。

Son1.vue

<template>
  <div class="box">
    <h2>Son1 子组件 {{ $store.state.title }}</h2>
    从vuex中获取的值: <label>{{ $store.state.count }}</label>
    <br>
    <button @click="handleAdd(1)">值 + 1</button>
    <button @click="handleAdd(5)">值 + 5</button>
    <button @click="handleAdd(10)">值 + 10</button>
    <button @click="changeFn">改标题</button>

  </div>
</template>

<script>
export default {
  name: 'Son1Com',
  methods: {
    handleAdd (n) {
      // 错误代码,不会报错,并且可以实现,但其实是错的 (但是vue不会监测 监测需要成本)
      // this.$store.state.count++
      // console.log(this.$store.state.count)

      // 应该通过mutation 核心概念 进行修改数据
      // 需要提交调用mutation
      // this.$store.commit('addCount')
      // this.$store.commit('addCount', n)
      // 只能传递有且仅有一个参数,如果是想传递多个参数,可以写成对象数组的形式。
      this.$store.commit('addCount', {
        count: n,
        msg: '哈哈'
      })

      console.log(n)
    },
    changeFn (newTitle) {
      this.$store.commit('changeTitle', '黑马程序员')
    }

  }
}
</script>

<style lang="css" scoped>
.box{
  border: 3px solid #ccc;
  width: 400px;
  padding: 10px;
  margin: 20px;
}
h2 {
  margin-top: 10px;
}
</style>

index.js

  // 2.通过mutations可以提供修改数据的方法,mutation是一个对象
  mutations: {
    addCount (state, obj) {
      //   修改数据
      state.count += obj.count
    }
}
)

 (6)实时输入,实时更新

不能用:value 因为不能直接改变仓库的值,但是:value是由:value和@input组成,所以可以分开用

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

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

相关文章

DeepSeek 助力 Vue 开发:打造丝滑的二维码生成(QR Code)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

图像处理篇---图像处理中常见参数

文章目录 前言一、分贝&#xff08;dB&#xff09;的原理1.公式 二、峰值信噪比&#xff08;PSNR, Peak Signal-to-Noise Ratio&#xff09;1.用途2.公式3.示例 三、信噪比&#xff08;SNR, Signal-to-Noise Ratio&#xff09;1.用途2.公式3.示例 四、动态范围&#xff08;Dyna…

【Java】—— 二叉树

一、树型结构 树形结构是一种重要的数据结构&#xff0c;它类似于现实生活中的树的结构&#xff0c;由结点和边构成。树形结构具有以下特点&#xff1a; 树形结构是一种层次化的结构&#xff0c;由根结点、内部结点和叶子结点组成。根结点是树的顶部结点&#xff0c;没有父结点…

机场导航系统有哪些功能?精准定位与高效路径规划技术深度剖析

本文专为关注机场服务优化、乘客体验提升的IT技术员及航空业同仁而写。将深入探讨机场室内导航系统的核心功能&#xff0c;旨在解决乘客在机场内部定位、路径规划、服务寻找等方面的痛点。如需获取机场导航系统解决方案可前往文章最下方获取&#xff0c;如有项目合作及技术交流…

医疗AI领域中GPU集群训练的关键技术与实践经验探究(上)

医疗AI领域中GPU集群训练的关键技术与实践经验探究(上) 一、引言 1.1 研究背景与意义 在科技飞速发展的当下,医疗 AI 作为人工智能技术与医疗领域深度融合的产物,正引领着医疗行业的深刻变革。近年来,医疗 AI 在疾病诊断、药物研发、健康管理等诸多方面取得了显著进展,…

STM32-智能小车项目

项目框图 ST-link接线 实物图&#xff1a; 正面&#xff1a; 反面&#xff1a; 相关内容 使用L9110S电机模块 电机驱动模块L9110S详解 | 良许嵌入式 一、让小车动起来 新建文件夹智能小车项目 在里面复制19-串口打印功能 重命名为01-让小车动起来 新建文件夹motor&…

星环科技推出DeepSeek全场景解决方案:即开即用、企业级部署、端侧智能三位一体

星环科技&#xff08;688031.SH&#xff09;正式发布DeepSeek全场景解决方案&#xff0c;全面覆盖个人用户、企业客户及行业场景需求&#xff0c;为用户提供从个人到企业、从云端到本地的全方位AI应用支持&#xff0c;为不同需求的用户提供了灵活、高效且安全的AI解决方案。 省…

《全星质量管理 QMS 软件系统》:赋能企业高效质量管理

《全星质量管理 QMS 软件系统》&#xff1a;赋能企业高效质量管理 在当今竞争激烈的商业环境中&#xff0c;《全星质量管理 QMS 软件系统》脱颖而出&#xff0c;展现出了显著且无可比拟的应用优势。 首先&#xff0c;《全星质量管理 QMS 软件系统》犹如一张严密的质量管控大网…

【多模态处理篇三】【DeepSeek语音合成:TTS音色克隆技术揭秘】

最近帮某明星工作室做AI语音助手时遇到魔幻需求——要求用5秒的咳嗽声克隆出完整音色!传统TTS系统直接翻车,生成的语音像得了重感冒的电音怪物。直到祭出DeepSeek的TTS音色克隆黑科技,才让AI语音从"机器朗读"进化到"声临其境"。今天我们就来扒开这个声音…

C++Qt学习笔记——实现一个串口通信界面

CQt学习笔记——实现一个串口通信界面 一.界面二、项目结构三、头文件1. 文件头部2. 类定义3. 构造函数和析构函数4. 成员函数5. 成员变量 四、代码解析ReceiveAeraInit 函数解析SerialHelper 构造函数解析1. 为什么有两个 SerialHelper&#xff1f;2. 为什么用 :: 和 :&#x…

Word(2010)排版技巧

设置标题样式 选择需要设置的标题 如下图所示。选择文字后&#xff0c;点击对应的样式即可设置。 设置标题格式 设置字体格式 设置段落格式 显示所有样式 标题样式展示 建议 建议新建一个正文样式&#xff0c;可以命名为正文1&#xff0c;因为所有的样式参考的“样式基准…

一.Vue中的条件渲染

1.在<head>中引用 <script src"https://unpkg.com/vue3/dist/vue.global.js"></script> 2.在<body>中写入 <div id"app"><p><a v-if "user.usernameadmin"href"#">编辑</a><a …

IO进程 day05

IO进程 day05 9. 进程9. 9. 守护进程守护进程的特点守护进程创建步骤 10. 线程10.1. 线程的概念10.2. 进程和线程的区别10.2. 线程资源10.3. 线程的函数接口1. pthread_create-创建线程线程函数和普通函数的区别 2. pthread_exit3.线程资源回收函数join和detach的区别 获取线程…

【HeadFirst系列之HeadFirstJava】第6天之认识Java的API:解锁高效开发的钥匙

认识Java的API&#xff1a;解锁高效开发的钥匙 在《Head First Java》的第六章节中&#xff0c;作者深入探讨了Java的API&#xff08;Application Programming Interface&#xff09;&#xff0c;并强调了它在Java开发中的重要性。Java API 是Java开发工具包&#xff08;JDK&a…

4 - AXI GPIO按键控制LED实验

文章目录 1 实验任务2 系统框图3 软件设计 1 实验任务 本实验任务是通过调用PL端AXI GPIO IP核&#xff0c;使用中断机制&#xff0c;实现PL端按键控制 PS端LED的功能。 2 系统框图 3 软件设计 注意事项&#xff1a; AXI GPIO IP核是双沿触发中断&#xff0c;不可设置&…

题海拾贝:扫雷

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞&#xff0c;关注&#xff01; 1、题…

Deepseek本地部署小实践(c盘)

目录 前言 一、安装ollama 二、打开终端执行run 三、可视化 前言 小鲸鱼出来以后看到很多大佬本地部署AI&#xff0c;自己也想试一试&#xff0c;第一次部署AI&#xff0c;选了一个简单的办法&#xff0c;实践一下&#xff0c;写得比较粗糙。 一、安装ollama 先简单的介绍…

详细解析d3dx9_27.dll丢失怎么办?如何快速修复d3dx9_27.dll

运行程序时提示“d3dx9_27.dll文件缺失”&#xff0c;通常由DirectX组件损坏或文件丢失引起。此问题可通过系统化修复方法解决&#xff0c;无需重装系统或软件。下文将详细说明具体步骤及注意事项。 一.d3dx9_27.dll缺失问题的本质解析 当系统提示“d3dx9_27.dll丢失”时&…

【LeetCode刷题之路】leetcode155.最小栈

LeetCode刷题记录 &#x1f310; 我的博客主页&#xff1a;iiiiiankor&#x1f3af; 如果你觉得我的内容对你有帮助&#xff0c;不妨点个赞&#x1f44d;、留个评论✍&#xff0c;或者收藏⭐&#xff0c;让我们一起进步&#xff01;&#x1f4dd; 专栏系列&#xff1a;LeetCode…

Vue全局变量的定义和使用,创建 Store变量、读取、修改

在VUE中&#xff0c;当需要各js、各页面都能读写的全局变量时&#xff0c;可以用store变量&#xff0c;从定义到使用的方法如下 一&#xff0e;定义变量&#xff0c;例&#xff1a;我们定一个全局变量gxh 找到 vue的/ src/ store路径, 在 modules文件夹下创建文件gvar.js 在…