Vuex学习一:了解Vuex,初始用vuex,vuex状态管理图的讲解

简介: 这篇文章是关于Vuex的基本使用和状态管理的教程,包括项目搭建、Vuex配置、状态共享问题、Vuex介绍以及如何在Vue组件中使用Vuex进行状态管理。

前言

一、项目构建

1. 项目搭建

  1. 使用脚手架2版本创建项目:vue init webpack 02_learn_vuex
  2. 安装冲的各个参数选择
  3. 查看项目结构
  4. 安装vuex:npm install vuex@3.0.1,我这里指定了版本

2. vuex配置

  1. 新建目录 store和js文件 index.js,如下

  2. store/index.js 内容
    其实 创建 store 对象中的属性,是固定的,就以下几个:state、mutations、actions、getters、modules

    import Vue from 'vue'
    import Vuex from 'vuex'
    
    // 1. 安装插件
    Vue.use(Vuex)
    
    // 2. 创建对象
    const store = new Vuex.Store({
      state: {
    
      },
      mutations: {
    
      },
      actions: {
    
      },
      getters: {
    
      },
      modules: {
    
      }
    })
    
    // 3. 导出store
    export default store
    
  3. 配置main.js 。

  4. 到此 vuex配置结束

二、vuex 初始用

1. 不使用vuex的状态共享

i、逻辑与代码

  • 逻辑
  1. APP.vue 中 写了一个属性 counter,在App.vue 中使用插值表达式去显示,
  2. 我又写了一个 HelloVuex.vue组件,想显示App.vue 组件中 的`属性 counter,然后我可以用父传子传参进行传过去。
  • 代码如下:
  1. App.vue

    <template>
      <div id="app">
        <h2>{
        {message}}</h2>
        <h2>{
        {counter}}</h2>
        <button @click="counter++">+</button>
        <button @click="counter--">-</button>
    
        <hello-vuex :counter="counter"/>
      </div>
    </template>
    
    <script>
      import HelloVuex from "./components/HelloVuex";
    
      export default {
        name: 'App',
        data() {
          return {
            message: '我是APP组件',
            counter: 0
          }
        },
        components: {
          HelloVuex
        }
      }
    </script>
    
    <style>
    
    </style>
    
  2. HelloVuex.vue代码

    <template>
      <div>
        <h2>{
        {counter}}</h2>
      </div>
    </template>
    
    <script>
      export default {
        name: "HelloVuex",
        props: {
          counter: Number
        }
      }
    </script>
    
    <style scoped>
    
    </style>
    
  3. 界面显示

    点击+和-,两个数字会实时改变。

ii、延伸的问题思考

  1. 上面在HelloVuex.vue组件中显示App.vue组件中的数据。
  2. 其实是在哎App.vue组件中引入了HelloVuex.vue组件,然后进行父对子传参。
  3. 但是如果不在App.vue组件中引入了HelloVuex.vue组件,不进行父对子传参,那应该怎么在HelloVuex.vue组件中显示App.vue组件中的counter数据呢,其实就可以用vuex来进行显示了,
  4. 那vuex是个啥呢,请看下面的介绍。

2. vuex介绍

白话一点:就是一个存放共用数据的一个框架。
vuex官网:https://vuex.vuejs.org/zh/

  • 官方解释:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。
  1. 它采用 集中式存储管理 应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。
  2. Vuex 也集成到 Vue 的官方调试工具 devtools extension,提供了诸如零配置的 time-travel 调试、状态快照导入导出等高级调试功能。
  • 状态管理到底是什么?
  1. 状态管理模式集中式存储管理这些名词听起来就非常高大上,让人捉摸不透。
  2. 其实,你可以简单的将其看成把需要多个组件共享的变量全部存储在一个对象里面。
  3. 然后,将这个对象放在顶层的Vue实例中,让其他组件可以使用。
  4. 那么,多个组件是不是就可以共享这个对象中的所有变量属性了呢?
  • 等等,如果是这样的话,为什么官方还要专门出一个插件Vuex呢?难道我们不能自己封装一个对象来管理吗?
  1. 当然可以,只是我们要先想想VueJS带给我们最大的便利是什么呢?没错,就是响应式。
  2. 如果你自己封装实现一个对象能不能保证它里面所有的属性做到响应式呢?当然也可以,只是自己封装可能稍微麻烦一些。
  3. 不用怀疑,Vuex就是为了提供这样一个在多个组件间共享状态的插件,用它就可以了。
  • 什么状态时需要我们在多个组件间共享的呢?
  1. 如果你做过大型开放,你一定遇到过多个状态,在多个界面间的共享问题。
  2. 比如用户的登录状态、用户名称、头像、地理位置信息等等。
    比如商品的收藏、购物车中的物品等等。
  3. 这些状态信息,我们都可以放在统一的地方,对它进行保存和管理,而且它们还是响应式的(待会儿我们就可以看到代码了,莫着急)。
  • OK,从理论上理解了状态管理之后,让我们从实际的代码再来看看状态管理。
    毕竟,Talk is cheap, Show me the code.(来自Linus)

  • 我们先来看看但界面的状态管理
    我们知道,要在单个组件中进行状态管理是一件非常简单的事情
    什么意思呢?我们来看下面的图片。

  • 这图片中的三种东西,怎么理解呢?

  1. State:不用多说,就是我们的状态。(你姑且可以当做就是data中的属性)
  2. View:视图层,可以针对State的变化,显示不同的信息。(这个好理解吧?)
  3. Actions:这里的Actions主要是用户的各种操作:点击、输入等等,会导致状态的改变。
  • 写点代码,加深理解:看下下边的代码效果,

3. 对2.1.1案例使用vuex操作

i、上代码

  1. store/index.js

    import Vue from 'vue'
    import Vuex from 'vuex'
    
    // 1. 安装插件
    Vue.use(Vuex)
    
    // 2. 创建对象
    const store = new Vuex.Store({
      state: {
        counter: 1000
      },
      mutations: {
    
      },
      actions: {
    
      },
      getters: {
    
      },
      modules: {
    
      }
    })
    
    // 3. 导出store
    export default store
    
  2. App.vue

    <template>
      <div id="app">
        <h2>----------------App 内容-------------</h2>
        <h2>{
        {message}}</h2>
        <h2>{
        {$store.state.counter}}</h2>
        <button @click="$store.state.counter++">+</button>
        <button @click="$store.state.counter--">-</button>
    
        <h2>----------------Hello Vuex 内容-------------</h2>
        <!--子组件能调用父组件的属性,是因为父组件向子组件传值了,是有关系的,但是如果没有关系,就要使用vuex-->
    <!--    <hello-vuex :counter="counter"/>-->
        <hello-vuex/>
      </div>
    </template>
    
    <script>
      import HelloVuex from "./components/HelloVuex";
    
      export default {
        name: 'App',
        data() {
          return {
            message: '我是APP组件',
            counter: 0
          }
        },
        methods: {
    
        },
        components: {
          HelloVuex
        }
      }
    </script>
    
    <style>
    
    </style>
    
  3. components/HelloVuex.vue

    <template>
      <div>
    <!--    <h2>{
        {counter}}</h2>-->
        <h2>{
        {$store.state.counter}}</h2>
      </div>
    </template>
    
    <script>
      export default {
        name: "HelloVuex",
        props: {
          counter: Number
        }
      }
    </script>
    
    <style scoped>
    
    </style>
    
  4. 效果和3.1.1一样,如下

ii、反思问题

上面的这种操作是可以的,直接操作 vuexstate 中的数据。
但是是不推荐的,为什么不推荐呢,就设计到了 vuex 的原理。看下一节vuex的状态管理

三、Vuex状态管理图

先看一副官方给出的图片:

  • 虚线方框 是vuex 的三个状态:state、mutations、actions。
  • 下面开始对图讲解:
  1. 最左边的 Vue component 可以直接使用虚线中下面vuex 中的 state但是官方不推荐这样使用,官方推荐 Vue componentdispatchvuex的 actions中,在commitvuex 的 mutations 中,通过mutations 修改·state·。这也就是 为什么 3.3.2中的问题所在,但是为什么官方推荐要这样操作呢?继续往下看:
  2. 图的最右边有一个 工具 devtools,它是一个vue开发的浏览器插件,它可以记录每一次修改state的状态, 可以对数据操作进行跟踪,但是3.3.1案例跳过了走 actions和mutations ,直接操作 state 数据,这样就导致,devtools无法对state数据进行监控和跟踪,所以 官方建议是有道理的。这也就是对3.3.2的问题完美回答。
  3. devtools工具的安装在另一个博客上有写:vue学习:chrome 中 vuetools 开发插件 的下载、安装
  4. 虚线上面的是vuex 的actions,其实这一步是可以省略的,直接如下图走也行:

    因为 mutations 是同步操作数据的方法,而actions 是异步操作数据的方法。如果要发请求则在actions 中进行操作,在调用mutations进行修改state数据。
  5. vuex 的actions 连接图片最上面 是 Backend API就是后端的接口。所以 actions 是进行异步操作发送网络请求的地方。
  6. 到此 这个图 就解说完啦。

四、对2.3.1案例使用vuex完美使用

1. 直接上代码

直接看代码截图吧,这样方便直接,代码都已上传到GitHub上,最上面前言中有GitHub地址。

  1. 先写 vuex store/index.js

  2. 在写App.vue,调用 mutations 中的方法,这里使用commit 方法。

  3. HelloVuex.vue

  4. 效果显示:

2. 总结

到目前为止,vuex的初始用就到这儿了
下一篇博客就是学习一下 vuex 的五个属性了,也是最为关键的。

相关文章
|
缓存 API 开发者
魔搭社区牵手FastChat&vLLM,打造极致LLM模型部署体验
FastChat是一个开放平台,用于训练、服务和评估基于LLM的ChatBot。
|
JavaScript 数据处理
Vuex 的Mutation 和 Action 有什么区别?
【10月更文挑战第15天】Mutation 和 Action 在 Vuex 中都有着重要的作用,它们相互协作,共同实现了 Vuex 状态管理的功能。理解它们的区别与联系,并在实际应用中正确使用,对于构建高效、可靠的 Vue 应用具有重要意义。
|
JSON JavaScript 前端开发
Javascript基础 86个面试题汇总 (附答案)
该文章汇总了JavaScript的基础面试题及其答案,涵盖了JavaScript的核心概念、特性以及常见的面试问题。
653 3
|
资源调度 JavaScript 定位技术
Vue2使用百度地图展示或搜索地点(vue-baidu-map)
本文介绍了如何在 Vue 项目中使用 `vue-baidu-map` 插件,包括安装、全局注册及具体应用。首先通过 `yarn add vue-baidu-map` 安装插件,并在 `main.js` 中全局注册。然后展示了如何在地图上显示特定位置的标记,以及如何搜索地点并获取其经纬度和详细地址信息。代码示例提供了详细的实现方法和样式调整。如需使用,请确保已获取百度地图 API 的密钥。
3136 1
|
12月前
|
安全 网络协议 网络安全
解析HTTP代理服务器不稳定致使掉线的关键原因
随着数字化发展,网络安全和隐私保护成为核心需求。HTTP代理服务器掉线原因主要包括:1. 网络问题,如本地网络不稳定、路由复杂;2. 服务器质量差、IP资源不稳定;3. 用户配置错误、超时或请求频率异常;4. IP失效或协议不兼容。这些问题会影响连接稳定性。
644 8
|
人工智能 自然语言处理 机器人
如何从0部署一个大模型RAG应用
本文介绍了如何从零开始部署一套RAG应用,并将其集成到移动端,如钉钉群聊中。应用场景包括客服系统、智能助手、教育辅导和医疗咨询等。通过阿里云PAI和AppFlow,您可以轻松部署大模型RAG应用,并实现智能化的问答服务。具体步骤包括准备向量检索库、训练私有模型、部署RAG对话应用、创建钉钉应用及配置机器人等。
2229 2
使用npm,快速构建第一个vue项目
本文介绍了如何使用npm快速构建第一个Vue项目。步骤包括确保安装了Node.js并且配置了正确的环境变量,创建一个空文件夹并使用VSCode打开,通过VSCode的终端执行`npm init vue@latest`命令以初始化项目,选择默认配置即可。接着安装项目依赖并启动开发服务器,最后通过浏览器访问开发服务器提供的本地地址查看项目运行结果。文章还提供了相关代码和操作截图。
|
JSON 人工智能 Java
Java视觉智能识别
JavaVision是一个基于Java开发的全能视觉智能识别项目,不仅实现PaddleOCR-V4、YoloV8物体识别、人脸识别、以图搜图等核心功能,还可以轻松扩展到其他领域,如语音识别、动物识别、安防检查等。这使得JavaVision成为一个全面解决多种场景需求的自适应平台。
667 0
|
数据库 数据中心 虚拟化
云服务器和虚拟主机有什么区别
总的来说,云服务器提供更高级别的灵活性、控制和资源隔离,适用于需要定制化和更大资源的应用程序。虚拟主机是一种经济实惠的共享托管解决方案,适用于小型项目和个人网站。选择哪种服务取决于你的需求、预算和技术要求。
699 2
Component name “header“ should always be multi-word
Component name “header“ should always be multi-word