冇事来学系--Vue2.0中vuex(上)

简介: 专门在Vue中实现集中式状态 (数据) 管理的一个Vue插件,对vue中多个组件的共享状态进行集中式的管理(读/写) ,适用于任意组件之间的通信

概念


专门在Vue中实现集中式状态 (数据) 管理的一个Vue插件,对vue中多个组件的共享状态进行集中式的管理(读/写) ,适用于任意组件之间的通信

使用场景:

  1. 多个组件依赖于同一个状态(数据)的时候
  2. 来自不同组件的行为(事件),都要变更(操作) 同一状态(数据)
  3. 在多个路由视图中都能访问的一个组件,这个组件就叫全局组件,它所依赖的数据也要放在全局管理

网络异常,图片无法展示
|


vuex的组成

  1. Actions --> 响应组件dispatch派遣的方法,处理业务逻辑和发Ajax请求等,然后commit提交给Mutations
  2. Mutations --> 接收Actions提交的方法和数据,获取存储数据的state,并且操作、处理数据
  3. State --> 保存数据

网络异常,图片无法展示
|


补充:

若组件vc派遣的方法没有业务逻辑也不用发Ajax请求数据,则可以越过Actions,直接与Mutations对话

可以在methods声明方法的时候,直接通过vc上的$store里面的commit( ) ,将方法和数据提交给Mutations对象

export default {
    name: 'Count',
    data(){
      return {
        number: 1     // 用户选择的数  
      }
    },
    methods: {
      // 下面的加法运算和减法运算都不需要额外的逻辑运算,也不用发Ajax请求数据
      // 故跳过dispatch给actions对象的阶段,直接commit提交给mutations对象
      // 而和为奇数再加的方法需要先做奇数判断,所以要dispatch给actions对象
      increment(){
        this.$store.commit('increment',this.number)
      },
      decrement(){
        this.$store.commit('decrement',this.number)
      },
      incrementOdd(){   
        this.$store.dispatch('incrementOdd', this.number)     // 和为奇数再加
      }
    }
}



搭建Vuex的环境

  1. 安装vuex
npm i vuex
  1. 配置store选项

法一:在src文件夹内新建一个vuex文件夹,在里面创建一个store.js

法二:在src文件夹内新建一个store文件夹,在里面创建一个index.js(官方)

// 创建文件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中的数据
const mutations = {}
// 准备state对象--用于保存数据
const state = {}
// 准备getters对象 --对state中的数据进行加工处理(类似于computed,无需求可以不写)
const getters = {
  // 处理函数      处理函数形参传入state,通过处理函数的return返回数据
}
// 创建store,并配置上面准备好的对象
const store = new Vuex.store({
  actions,
  mutations,
  state,
  getters   // 没有准备getters对象,则配置可以不写
})
// 暴露store
export default store

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

// 在main.js中
// 引入store
import store from './store/index.js'
// 创建vm
const vm = new Vue({
  el: '#app',
  render: h => h(App),
  store   // 传入store配置项  store:store的简写
})

补充

为什么别的插件都是在main.js中引入和使用,而Vuex要在创建store的文件中引入和使用?

知识点:在js代码执行时,所有的import代码会被提升,优先解析执行

如果在main.js中引入和使用Vuex,这会导致在引入store 和 创建vm时传入store配置选项 的过程中,引入store的import语句会被提升,优先执行。而此时使用Vuex的语句Vue.use(Vuex)还没执行,也就还没有创建好store,所以被提升的引入store的语句会报错


vuex的使用流程:

  1. 数据放到src/store/index.js文件下的state对象
  2. 在组件中methods节点下声明方法,要通过vc上的$store里面的dispatch派遣方法名和传递的参数
methods: {
  increment(){
    // this.$store.dispatch('fnName', value)
    this.$store.dispatch('increment', this.number)      // 加法,每次加data中number的值
  },
  decrement(){
    // this.$store.dispatch('fnName', value)
    this.$store.dispatch('decrement', this.number)      // 加法,每次减data中number的值
  },
  incrementOdd(){
    // this.$store.dispatch('fnName', value)
    this.$store.dispatch('incrementOdd', this.number)     // 和为奇数再加
  },
  incrementWait(){
    this.$store.dispatch('incrementWait', this.number)      // 等1秒后再加
  }
}
  1. 在src/store/index.js文件下的actions对象中根据上面的dispatch声明相应的方法。这个方法有两个参数,一个是类似mini版store的对象, 官方将其命名为context,里面有commit、dispatch等方法,还有state、getters的数据;另一个参数就是上面传入的值value。 此时,actions要做的是将接收到的方法和数值commit提交到mutations中,真正执行方法和处理数据的是mutations
const actions = {
  increment(context, value){
    // context.commit('fnName', value)  fnName和value就是dispatch传过来的
    context.commit('increament', value)     // commit提交 
  },
  decrement(context, value){
     context.commit('decreament', value)
  },
  incrementOdd(context, value){     // 在actions中处理业务逻辑
    if(context.state.sum % 2){      // 加入业务逻辑,和为奇数 再提交该方法和数值
      context.commit('increament', value)   // 注意这已经是判断内了,提交的是increament
    }
  },
  incrementWait(context, value){
    setTimeout(()=>{
      context.commit('increament', value)
    },1000)
  }
}
  1. 在mutations对象中操作数据,mutations中的方法都有两个参数,一个是state中的数据,一个是传入的要操作的值value
const mutations = {     // mutations中不要写任何业务逻辑和Ajax请求
  increment(state,value){
    state.sum += value
  },
  decrement(state,value){
    state.sum -= value
  }
}


目录
相关文章
|
2月前
|
JavaScript API
再不学vue3就没有人要你了!速来围观vue3
这篇技术文章介绍了作者从最初对学习 Vue3 抵触到最终决定投入学习的心路历程,展示了 Vue3 相较于 Vue2 的诸多改进和新特性,如更优的性能、更小的代码体积及更佳的 TypeScript 支持。文章重点阐述了 Vue3 中 createApp 的使用变化、emits 机制、多事件处理、Fragment 的引入等重要功能升级。此外,还深入探讨了 Composition API 和 Options API 的区别,强调 Composition API 在代码组织和逻辑复用方面的优势,并给出了在不同项目规模中选择合适 API 的建议。
35 0
|
JSON 前端开发 开发工具
Vue3 小兔鲜:项目起步
Vue3 小兔鲜:项目起步
277 0
|
JavaScript 容器
冇事来学系--Vue2.0中VueComponent(组件)
组件的本质 组件的本质就是一个 构造函数 f VueComponent (options) { this._init(options); } ,是Vue.extend( )生成的 当我们使用组件时,写了组件的标签,Vue解析时就会创建该组件的实例对象,即Vue帮我们执行了这一句代码 new VueComponent(options) (options就是我们写的data、methods、computed等数据) 每次调用Vue.extend( )时,返回的都是一个全新的VueComponent
308 0
|
存储 前端开发 JavaScript
冇事来学系--Vue2.0中路由Router
路由的概念与原理 路由(router),就是对应关系。即 Hash地址(锚点链接) 与 组件 之间的对应关系 注意:锚点链接的特点-->不会刷新页面,但是会产生浏览历史
204 0
|
JavaScript 前端开发
冇事来学系--Vue2.0中讲讲生命周期吧
生命周期(Life Cycle) 是指一个组件从创建->运行->销毁的整个阶段,强调的是一个时间段。 生命周期函数:是由vue框架提供的内置函数,会伴随着组件的生命周期,自动按次序执行 。是vue在关键时刻帮我们调用的一些特殊名字的函数。 生命周期函数中的this指向的是vm或组件实例对象
177 0
|
JavaScript 前端开发
冇事来学系--Vue2.0中vue-cli使用
单页面应用程序(Single Page Application) 一个web网站只有一个HTML页面,所有的功能与交互都在这一个页面上完成
127 0
|
JavaScript
冇事来学系--Vue2.0 组件开发详讲(下)
组件的自定义属性props props节点是和data、methods等同级的节点,值是一个数组
130 0
|
前端开发 JavaScript 数据库
冇事来学系--Vue2.0中Promise详讲(上)
回调地狱 多层回调函数的相互嵌套,就形成了回调地狱
306 0
|
前端开发
冇事来学系--Vue2.0中Promise详讲(下)
then-fs的基本使用 可以通过node下载then-fs。 npm install then-fs
164 0
|
JavaScript 前端开发 API
vue3,你还为状态为何物而发愁吗?(一)
为啥需要状态?因为组件划分的非常原子化(细腻),所以造成了很多的组件,那么组件之间就需要一种“通讯方式”,这个就是状态了。不仅仅是传递数据,还可以实现事件总线。
vue3,你还为状态为何物而发愁吗?(一)