Vue —— 进阶 Vuex(零)(概念、工作原理、环境搭建、基本使用、getters)

简介: Vue —— 进阶 Vuex(零)(概念、工作原理、环境搭建、基本使用、getters)

一、理解 vuex

1. 什么是 vuex?

概念:专门在 Vue 中实现集中式状态(数据)管理的一个 Vue 插件,对 vue 应用中多个组件的共享状态进行集中式管理(读 / 写),也是一种组件间的通信方式,且适用于任意组件间通信。

2. 什么时候使用 vuex?
  1. 多个组件依赖于同一个状态
  2. 来自不同组件的行为需要变更同一状态

二、求和案例(纯vue版)

  1. 第一个下拉栏控制每次加或减的数值。
  2. 加一
  3. 减一
  4. 当和为奇数时再加
  5. 等一等再加

Count.vue

  <template>
    <div>
      <h2>当前求和为:{{sum}}</h2>
      <select v-model.number="n">
        <option :value="1">1</option>
        <option :value="2">2</option>
        <option :value="3">3</option>
      </select>
      <button @click="increment">+</button>
      <button @click="decrement">-</button>
      <button @click="incrementOdd">当前求和为奇数再加</button>
      <button @click="incrementWait">等一等再加</button>
    </div>
  </template>
  <script>
  export default {
    name: "myCount",
    data(){
      return{
        n:1, //用户选择的数字
        sum: 0 //当前的和
      }
    },
    methods:{
      increment(){
        this.sum += this.n
      },
      decrement(){
        this.sum -= this.n
      },
      incrementOdd(){
        if(this.sum % 2){
          this.sum += this.n
        }
      },
      incrementWait(){
        setTimeout(()=>{
          this.sum += this.n
        },500)
      }
    }
  };
  </script>
  <style scoped>
    button{
      margin-left: 5px;
    }
  </style>

App.vue

  <template>
    <div>
      <Count/>
    </div>
  </template>
  <script>
  // 引入组件
  import Count from "./components/Count.vue";
  export default {
    name: "App",
    components: { Count },
  };
  </script>

0726f7274faa4dbc9c98eb25164417af.png

三、vuex 工作原理图

7582e1c6d45a484eb1d62741267c0533.png

1. 理解
  1. Vue Components:看作顾客
  2. Actions:看作点餐服务员
  3. Mutations:看作后厨厨师
  4. State:看作上来的菜

Actions:可以不经过它,它可以连接后端的一些接口。

四、搭建 vuex 环境

1. 安装 vuex

终端键入命令:npm i vuex@3

对应的是 vue2.x 版本

2. 创建文件

在 src 文件下创建文件:src/store/index.js

  // 该文件用于创建Vuex中最为核心的store
  // 引入vue核心库
  import Vue from 'vue'
  // 引入Vuex
  import Vuex from 'vuex'
  // 应用Vuex插件
  Vue.use(Vuex)
  // 准备actions——用于响应组件中的动作
  const actions = {}
  // 准备mutations——用于修改state中的数据(state)
  const mutations = {}
  // 准备state——用于存储具体的数据
  const state = {}
  // 创建并暴露store
  export default new Vuex.Store({
      actions,
      mutations,
      state
  })

在 main.js 中创建 vm 时传入 store 配置项。

  // 引入 Vue
  import Vue from 'vue'
  // 引入 App
  import App from './App.vue'
  // 引入 store
  import store from './store'
  // 关闭 vue 的生产提示
  Vue.config.production = false
  // 使用插件
  //创建 vm
  new Vue({
      el:'#app',
      render: h => h(App),
      store
  })

五、求和案例(vuex版)

Count.vue

在 Count.vue 的 methods 中配置方法。

简单的逻辑,直接在 methods 中 this.$store.commit('方法', 数据)。(此处的方法为 index.js 中 mutations 中配置的方法)

复杂的逻辑,通过在 methods 中 this.$store.dispatch('方法', 数据)。(此处的方法为 index.js 中 actions 中配置的方法)

页面呈现时的模板语法:{{$store.state.sum}}

  <template>
    <div>
      <h2>当前求和为:{{$store.state.sum}}</h2>
      <select v-model.number="n">
        <option :value="1">1</option>
        <option :value="2">2</option>
        <option :value="3">3</option>
      </select>
      <button @click="add">+</button>
      <button @click="sub">-</button>
      <button @click="addOdd">当前求和为奇数再加</button>
      <button @click="addWait">等一等再加</button>
    </div>
  </template>
  <script>
  export default {
    name: "myCount",
    data(){
      return{
        n:1, //用户选择的数字
        sum: 0 //当前的和
      }
    },
    methods:{
      add(){
        this.$store.commit("ADD", this.n);
      },
      sub(){
        this.$store.commit("SUB", this.n);
      },
      addOdd(){
        this.$store.dispatch("addOdd", this.n);
      },
      addWait(){
        this.$store.dispatch("addWait", this.n);
      }
    }
  };
  </script>
  <style scoped>
    button{
      margin-left: 5px;
    }
  </style>

index.js


在 state 中准备用于存储的数据 sum。

在 mutations 中准备用于修改 state 中数据的函数 ADD 和 SUB。(注意配置在 mutations 中的函数名一般大写)。

在 actions 中准备用于响应组件的函数 addOdd 和 addWait。

  // 该文件用于创建Vuex中最为核心的store
  // 引入vue核心库
  import Vue from 'vue'
  // 引入Vuex
  import Vuex from 'vuex'
  // 应用Vuex插件
  Vue.use(Vuex)
  // 准备actions——用于响应组件中的动作
  const actions = {
      addOdd(context, value){
          console.log('actions中的addOdd被调用了');
          if(context.state.sum % 2){
              context.commit('ADD',value)
          }
      },
      addWait(context, value){
          console.log('actions中的addWait被调用了');
          setTimeout(()=>{
              context.commit('ADD', value)
          },500)
      }
  }
  // 准备mutations——用于修改state中的数据(state)
  const mutations = {
      ADD(state, value){
          console.log('mutations中的ADD被调用了',state, value);
          state.sum += value
      },
      SUB(state, value){
          console.log('mutations中的SUB被调用了',state, value);
          state.sum -= value
      }
  }
  // 准备state——用于存储具体的数据
  const state = {
      sum: 0 //当前的和
  }
  // 创建并暴露store
  export default new Vuex.Store({
      actions,
      mutations,
      state
  })

https://www.bilibili.com/video/BV16U4y117xN?t=1.8

vuex求和展示

六、vuex 的基本使用

1. 步骤

./store/index.js

  1. 初始化数据
  2. 配置 actions
  3. 配置 mutations:里面的函数名一般大写
  4. 操作文件 index.js
  // 引入Vue核心库
  import Vue from 'vue'
  // 引入Vuex
  import Vuex from 'vuex'
  // 引用Vuex
  Vue.use(Vuex)
  const actions = {
      // 响应组件中加的动作
      add(context, value){
          context.commit('ADD', value)
      }
  }
  const mutations = {
      // 执行加
      ADD(state, value){
          state.sum += value
      }
  }
  // 初始化数据
  const state = {
      sum: 0
  }
  // 创建并暴露
  export default new Vuex.Store({
      actions,
      mutations,
      state
  })
2. 组件中读取 vuex 中的数据

在组件的模板里面读取不需要加 this,在组件的 JS 里面写需要加 this。

  $store.state.sum
3. 组件中修改 vuex 中的数据

经过 actions 到 mutations 用 dispatch。

  $store.dispatch('actions中的方法名', 数据)

直接到 mutations 用 commit。

  $store.commit('mutations中的方法名', 数据)

注意:若没有网络请求或其他业务逻辑,组件中也可以越过 actions,即不写 dispatch,直接编写 commit。

七、getters 的使用

1. 概念

当 state 中的数据需要经过加工后再使用时,可以使用 getters 加工。(逻辑较为复杂时使用,可以被多个组件复用)。

2. 在 .store/index.js 中追加 getters 配置
  .....
  const getters = {
    bigSum(state) {
      return state.sum * 10
    }
  }
  .....
  export dafault new Vuex.Store({
    .....
    getters
  })
3. 实例:数字扩大 10 倍

store.js

  1. 在该文件下追加配置
  .....
  const getters = {
    bigSum(state) {
      return state.sum * 10
    }
  }
  .....
  export dafault new Vuex.Store({
    .....
    getters
  })

Count.vue

  1. 添加模板字符串,在组件中读取数据 $store.getters.bigSum,其余不变
  <h3>当前求和放大10倍:{{$store.getters.bigSum}}</h3>

d3bed2d6853849499a12cb5a38922319.png

八、vuex 与 vue 的类比

vuex 中的 state 相当于 vue 中的 data。

vuex 中的 mutations 相当于 vue 中的 methods。

vuex 中的 getters 相当于 vue 中的 computed。

vuex 中的 actions 相当于 vue 中的 methods

注意:同步方法写在 mutations,异步写在 actions 里。

不积跬步无以至千里 不积小流无以成江海

相关文章
|
6天前
|
移动开发 JavaScript API
Vue Router 核心原理
Vue Router 是 Vue.js 的官方路由管理器,用于实现单页面应用(SPA)的路由功能。其核心原理包括路由配置、监听浏览器事件和组件渲染等。通过定义路径与组件的映射关系,Vue Router 将用户访问的路径与对应的组件关联,支持哈希和历史模式监听 URL 变化,确保页面导航时正确渲染组件。
|
6天前
|
JavaScript 前端开发 开发者
Vue中的class和style绑定
在 Vue 中,class 和 style 绑定是基于数据驱动视图的强大功能。通过 class 绑定,可以动态更新元素的 class 属性,支持对象和数组语法,适用于普通元素和组件。style 绑定则允许以对象或数组形式动态设置内联样式,Vue 会根据数据变化自动更新 DOM。
|
6天前
|
JavaScript 前端开发 数据安全/隐私保护
Vue Router 简介
Vue Router 是 Vue.js 官方的路由管理库,用于构建单页面应用(SPA)。它将不同页面映射到对应组件,支持嵌套路由、路由参数和导航守卫等功能,简化复杂前端应用的开发。主要特性包括路由映射、嵌套路由、路由参数、导航守卫和路由懒加载,提升性能和开发效率。安装命令:`npm install vue-router`。
|
2月前
|
JavaScript
vue使用iconfont图标
vue使用iconfont图标
147 1
|
10天前
|
监控 JavaScript 前端开发
ry-vue-flowable-xg:震撼来袭!这款基于 Vue 和 Flowable 的企业级工程项目管理项目,你绝不能错过
基于 Vue 和 Flowable 的企业级工程项目管理平台,免费开源且高度定制化。它覆盖投标管理、进度控制、财务核算等全流程需求,提供流程设计、部署、监控和任务管理等功能,适用于企业办公、生产制造、金融服务等多个场景,助力企业提升效率与竞争力。
60 12
|
27天前
|
JavaScript 安全 API
iframe嵌入页面实现免登录思路(以vue为例)
通过上述步骤,可以在Vue.js项目中通过 `iframe`实现不同应用间的免登录功能。利用Token传递和消息传递机制,可以确保安全、高效地在主应用和子应用间共享登录状态。这种方法在实际项目中具有广泛的应用前景,能够显著提升用户体验。
54 8
|
28天前
|
存储 设计模式 JavaScript
Vue 组件化开发:构建高质量应用的核心
本文深入探讨了 Vue.js 组件化开发的核心概念与最佳实践。
74 1
|
3月前
|
JavaScript 前端开发 开发者
vue 数据驱动视图
总之,Vue 数据驱动视图是一种先进的理念和技术,它为前端开发带来了巨大的便利和优势。通过理解和应用这一特性,开发者能够构建出更加动态、高效、用户体验良好的前端应用。在不断发展的前端领域中,数据驱动视图将继续发挥重要作用,推动着应用界面的不断创新和进化。
111 58
|
2月前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
3月前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
67 1
vue学习第一章

热门文章

最新文章