vuex学习总结

State:全局状态



1:通过在根实例中注册 store 选项,该 store 实例会注入到根组件下的所有子组件中,且子组件能通过 this.$store 访问到 而不是在每个vue模块导入inport store 方式

2:mapState 辅助函数帮助我们生成多个计算属性 写法computed:mapState({})

3:映射的计算属性的名称与 state 的子节点名称相同时,我们也可以给 mapState 传一个字符串数组

  computed: mapState([

  // 映射 this.count 为 store.state.count
  ‘count‘
])

4:对象展开运算符,直接合并computed原来的和现在的mapState

Getter:相当于store的计算属性


const store = new Vuex.Store({
  state: {
    todos: [
      { id: 1, text: ‘...‘, done: true },
      { id: 2, text: ‘...‘, done: false }
    ]
  },
  getters: {
    doneTodos: state => {
      return state.todos.filter(todo => todo.done)
    }
  }
})

1:属性访问,this.$store.getters.doneTodos // -> [{ id: 1, text: ‘...‘, done: true }],属于Vue响应系统组成部分,计算属性特征

2:  Getter 也可以接受其他 getter 作为第二个参数:使用场景不是太清楚

  doneTodosCount: (state, getters) => {
    return getters.doneTodos.length
  }

3:方法访问:你也可以通过让 getter 返回一个函数,来实现给 getter 传参。在你对 store 里的数组进行查询时非常有用。

4:mapGetters 辅助函数,将 store 中的 getter 映射到局部计算属性:使用方法同mapState,数组字符串、别名、扩展运算符

Mutation 更改 Vuex 的 store 中的状态的唯一方法是提交 mutation,必须同步方式


1:提交载荷(Payload):传递多余的参数,

store.commit(‘increment‘, 10) 提交简单字符串

store.commit(‘increment‘, {amount: 10}) 提交对象

store.commit({ type: ‘increment‘, amount: 10}) 类型和参数一起提交

2:Mutation 需遵守 Vue 的响应规则

先初始化,添加新的属性的set方式,重新赋值,对象扩展符使用

3:使用常量替代 Mutation 事件类型,新增一个存放类型的模块,

import Vuex from ‘vuex‘
import { SOME_MUTATION } from ‘./mutation-types‘

const store = new Vuex.Store({
  state: { ... },
  mutations: {
    // 我们可以使用 ES2015 风格的计算属性命名功能来使用一个常量作为函数名
    [SOME_MUTATION] (state) {
      // mutate state
    }
  }
})

4:在组件中提交 Mutation,

a:你可以在组件中使用 this.$store.commit(‘xxx‘) 提交 mutation,

b:或者使用 mapMutations 辅助函数将组件中的 methods 映射为 store.commit 调用(需要在根节点注入 store)。

import { mapMutations } from ‘vuex‘

export default {
  // ...
  methods: {
    ...mapMutations([
      ‘increment‘, // 将 `this.increment()` 映射为 `this.$store.commit(‘increment‘)`

      // `mapMutations` 也支持载荷:
      ‘incrementBy‘ // 将 `this.incrementBy(amount)` 映射为 `this.$store.commit(‘incrementBy‘, amount)`
    ]),
    ...mapMutations({
      add: ‘increment‘ // 将 `this.add()` 映射为 `this.$store.commit(‘increment‘)`
    })
  }
}

 Action异步操作:

Action 类似于 mutation,不同在于:

  • Action 提交的是 mutation,然后mutation去更改状态,而不是直接变更状态。
  • Action 可以包含任意异步操作。

const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    }
  },
  actions: {
    increment (context) {
      context.commit(‘increment‘)
    }
  }
})Action 函数接受一个与 store 实例具有相同方法和属性的 context 对象,因此你可以调用 context.commit 提交一个 mutation,或者通过 context.state 和 context.getters 来获取 state 和 getters

触发:

1:store.dispatch(‘increment‘)

2:负荷形式,类似mutations

3:按照对象方式分发

模拟购物车,多重
actions: {
  checkout ({ commit, state }, products) {
    // 把当前购物车的物品备份起来
    const savedCartItems = [...state.cart.added]
    // 发出结账请求,然后乐观地清空购物车
    commit(types.CHECKOUT_REQUEST)
    // 购物 API 接受一个成功回调和一个失败回调
    shop.buyProducts(
      products,
      // 成功操作
      () => commit(types.CHECKOUT_SUCCESS),
      // 失败操作
      () => commit(types.CHECKOUT_FAILURE, savedCartItems)
    )
  }
}

4:组件中,this.$store.dispatch 可以在方法中进行mapActions 映射

import { mapActions } from ‘vuex‘

export default {
  // ...
  methods: {
    ...mapActions([
      ‘increment‘, // 将 `this.increment()` 映射为 `this.$store.dispatch(‘increment‘)`

      // `mapActions` 也支持载荷:
      ‘incrementBy‘ // 将 `this.incrementBy(amount)` 映射为 `this.$store.dispatch(‘incrementBy‘, amount)`
    ]),
    ...mapActions({
      add: ‘increment‘ // 将 `this.add()` 映射为 `this.$store.dispatch(‘increment‘)`
    })
  }
}

5;组合 Action

Action 通常是异步的,那么如何知道 action 什么时候结束呢?更重要的是,我们如何才能组合多个 action,以处理更加复杂的异步流程?

首先,你需要明白 store.dispatch 可以处理被触发的 action 的处理函数返回的 Promise,并且 store.dispatch 仍旧返回 Promise:

Module


const store = new Vuex.Store({
  modules: {
    a: moduleA,
    b: moduleB
  }
})

1:对于模块内部的 mutation 和 getter,接收的第一个参数是模块的局部状态对象

2:对于模块内部的 action,局部状态通过 context.state 暴露出来,根节点状态则为 context.rootState

3:对于模块内部的 getter,根节点状态会作为第三个参数暴露出来:

 项目结构;


├── index.html
├── main.js
├── api
│   └── ... # 抽取出API请求
├── components
│   ├── App.vue
│   └── ...
└── store
    ├── index.js          # 我们组装模块并导出 store 的地方
    ├── actions.js        # 根级别的 action
    ├── mutations.js      # 根级别的 mutation
    └── modules
        ├── cart.js       # 购物车模块
        └── products.js   # 产品模块

严格模式和发布模式



1:严格模式,调试模式使用

2:发布模式,关闭,避免影响性能

const store = new Vuex.Store({
  // ...
  strict: process.env.NODE_ENV !== ‘production‘
})

原文地址:https://www.cnblogs.com/liuguiqian/p/11372274.html

时间: 2024-10-10 12:33:35

vuex学习总结的相关文章

vuex学习---getters

vue是一个面向数据,只有一个层:view,在数据传给客户端之前,计算其相关的属性,应该是什么样子,前面有个mapState([])远程加载数据,加载的是一个静态的数据,如果想获取动态的数据,就要用到 getters .官方建议在getter和computed不推荐使用箭头函数. 这个例子依旧沿用了之前vuex学习---简介的模板 1.首先在store.js中 一开始会在页面上显示 :104 常量值4+ getters中的100   ;点击加 会104+ 100+3 ,变成207 :点击减207

vuex学习---state访问状态对象

在vuex学习---vuex简介中已经介绍过vuex的简单使用,在这个例子中,沿用以上的模板,介绍一下state访问状态对象的几种写法: <template> <div id="app"> <div id="appaaa"> <h1>这是vuex的示例</h1> <p>调用仓库常量 {{$store.state.count}}</p> <!-- <p>组件内部cou

vuex学习--(1)

Vuex 是什么? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式 单个父子组件的数据绑定可能会简单一点,多个组件之间的数据绑定就比较麻烦了,vuex就是解决这个的 Vuex 也集成到 Vue 的官方调试工具 devtools extension 提供了诸如零配置的 time-travel 调试.状态快照导入导出等高级调试功能. 状态管理模式: 1.store数据源-->对应vue   data 2.view模板-->对应 vue temolate 3.actions响应--&

vuex 学习总结及demo

vuex是vue.js应用程序开发的状态管理模式 它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 官方文档:https://vuex.vuejs.org/zh/ 具体的看官方文档,我在学习vuex的时候  变量名总是弄不清楚  后来一个个实践总算弄明白了  下图同个颜色表示变量名必须一致   希望可以帮助大家更好的理解Vuex 下面是demo连接地址,欢迎大家转载学习: https://github.com/Amelia608/vuex-demo-w

vuex学习笔记

参考地址:https://vuex.vuejs.org/zh-cn/intro.html Vuex 是什么? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式管理存储管理应用的所有组件的状态,并以相应规则保证状态以一种可预测的方式发生变化 什么是"状态管理模式"? 1 new Vue({ 2 // state 3 data () { 4 return { 5 count: 0 6 } 7 }, 8 // view 9 template: ` 10 <d

Vuex 学习笔记一

一.定义 Vuex是一个专为Vue.js应用程序开发的状态管理模式. 状态管理模式 简单的demo new Vue({ // state data () { return { count: 0 } }, // view template: ` <div>{{ count }}</div> `, // actions methods: { increment () { this.count++ } } }) state,驱动应用的数据源: view,以声明方式将state映射到视图:

vuex学习---modules

除非是非常大的项目,否则不推荐使用modules. //1定义模块组var moduleA = { state, mutations, actions}; //2声明模块组 modules:{ a:moduleA } //3在App.vue中调用 <p>{{$store.state.a.count}}</p> 1.在retore.js import Vue from 'vue' import Vuex from 'vuex' //使用vuex模块 Vue.use(Vuex); //

vuex学习

A  Vuex就类似一个中间件,在state里面定义了状态的数据,比如state={ count:0 },后期用this.$store.state 获取状态,也可用mapState映射过去 B  在mutations 内部定义了改变这个数据的方法,这是一种同步的事物,可用this.store.commit(mutationName)来触发一个方法,也可用mapMutations C  异步的逻辑封装在actions里面,也可用于改变状态,其实也是通过触发mutations实现的,用this.$s

vuex 学习笔记

1.vuex的简单使用方法 安装: cnpm install vuex --save 使用: (1)新建一个store的文件夹 代码例子: import Vue from 'vue' import Vuex from 'vuex' Vue.use(Vuex) const state = { count: 0 } const mutations = { increment(state) { state.count ++; } } export default new Vuex.Store({ st

vuex学习之路

Vuex理解 vuex是一个专门为vue.js设计的集中式状态管理架构.状态?把它理解为在data中的属性需要共享给其他vue组件使用的部分,就叫做状态.简单的说就是data中需要共用的属性.比如:有几个页面要显示用户名称和用户等级,或者显示用户的地理位置.如果不把这些属性设置为状态,那每个页面遇到后,都会到服务器进行查找计算,返回后再显示.在中大型项目中会有很多共用的数据,所以尤大神给我们提供了vuex. 引入vuex 1.利用npm包管理工具,进行安装 vuex.在控制命令行中输入下边的命令