IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> Vue CLI 入门09 Vuex进阶 -> 正文阅读

[JavaScript知识库]Vue CLI 入门09 Vuex进阶


Vuex核心概念

请添加图片描述

成员列表:

  • state 存放状态
  • getters 加工state成员给外界
  • mutations state成员操作方法
  • actions 异步操作
  • modules 模块化状态管理

State 单一状态树

Single Source of Truth 单一数据源

只创建一个store,永远对应$store来使用

Getters

相当于计算属性,如果需要对state做一定处理后再交给组件,则使用getters

getters的计算属性会默认传入两个参数(state, getters)

  • 仅使用state参数实现对state简单操作
 getters:{
    doublecounter(state){
      return state.counter*2
    }
  },
<h2>getters演示</h2>
<p>doublecounter:{{$store.getters.doublecounter}}</p>

请添加图片描述

  • 还可以通过第二个参数getters,来实现不同计算属性的互相调用
fourfoldcounter(state,getters){
      return getters.doublecounter*2
    }
<h2>getters演示</h2>
    <p>doublecounter:{{$store.getters.doublecounter}}</p>
    <p>fourfoldcounter:{{$store.getters.fourfoldcounter}}</p>

请添加图片描述

  • 如果想要在组件中,对getters的计算属性传入外部参数,需要使用闭包,即return一个函数,把参数传入这个函数并对state进行操作。

    multiplecounter(state){
          return function(multiple){
            return state.counter*multiple
          }
        }
    
    <p>multiple=8, multiplecounter:{{$store.getters.multiplecounter(8)}}</p>
      <!-- 输出应该为8x1000=8000 -->
    <!-- 这个参数8也可替换成App组件中data的变量 -->
    

请添加图片描述

Mutations

store状态的唯一更新方式是:提交mutations,提交后就会执行指定的函数

  • 普通提交:回调函数第一个参数就是state

    add() {
          this.$store.commit('increase')
        },
    
    mutations:{
        increase(state){
          state.counter++
        }
    }
    
  • 传参提交:commit的第二个参数可以传参,或者通过提交对象实现

    举例:增添两个对state加减可变数值的按钮,count为App组件的data,设置为5
    <button @click="addcount">+{{count}}</button>
    <button @click="subcount">-{{count}}</button>
    

    添加method,commit提交,第二个参数传入count

    addcount(){
          this.$store.commit('increasecount',this.count)
        },
    //不同的提交风格,如果提交对象,则此处第二个参数为整个对象
    subcount(){
          this.$store.commit({
            type: 'reducecount',
            count: this.count
          })
        }
    

    在mutations中添加两个方法,根据传入的count对state操作

    increasecount(state,count){
          state.counter +=count
        },
    //不同的提交风格,如果提交对象,则此处第二个参数为整个对象
    reducecount(state,payload){
          state.counter -=payload.count
        }
    

请添加图片描述

  • 补充:

    • 如果state中的是对象或者数组,需要使用Vue.setVue.delete方法,才能实现响应式的添加或者删除属性

    • 官方推荐新建一个文件定义常量,然后再组件文件和vuex文件分别引入,实现提交方法和mutations 方法的命名统一

      INCREASECOUNT(){
            this.$store.commit('INCREASECOUNT',this.count)
          },
      
      [INCREASECOUNT](state,count){
            state.counter +=count
          },
      

Actions

Mutations 应该存放同步操作,如果想用异步操作,需在添加到Mutations前增加一个Actions操作

组件方法使用dispath方法调用Mutations

actions的函数默认传递参数context约等于store对象,类似于Mutations,第二个参数payload用于传参

再在Actions的异步操作中使用context.commit提交到Mutations的操作

举例:实现异步更新,更新完成返回一个提示信息

  • Actions中使用return一个Promise确保异步完成后返回成功提示,在组件方法中使用.then把提示显示(进行异步完成后的操作)

Actions中的方法:

actions:{
    aupdatepreson(context,payload){
      //返回整个Promise,在组件中进行.then操作
      //同步异步分离,只在actions中进行异步操作
      return new Promise((resolve)=>{
        setTimeout(() => {
          context.commit('updateperson');
          console.log('我是payload参数:'+ payload);
          resolve('success commit')
        }, 1000);
      })
    }
  }

组件中的方法:

aupdate(){
      this.$store
      .dispatch('aupdatepreson','异步更新传递的参数')
      .then(res=>{
        console.log(res);
      })
    }

出现报错bug,解决:sockjs.js?9be2:1606 GET http://192.168.1.101:8080/sockjs-node/info?t=1583642185049 net::ERR_CONNE… - 尚码园 (shangmayuan.com)

modules

由于使用单一状态树,应用的所有状态会集中到一个比较大的对象。当应用变得非常复杂时,store 对象就有可能变得相当臃肿。

为了解决以上问题,Vuex 允许我们将 store 分割成模块(module)。每个模块拥有自己的 state、mutation、action、getter、甚至是嵌套子模块

const moduleA = {
  state: { moive: 'Star War'},
  mutations: { ... },
  actions: { ... },
  getters: { ... }
}

const moduleB = {
  state: () => ({ ... }),
  mutations: { ... },
  actions: { ... }
}

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

store.state.moduleA.name // -> moduleA 的状态的moive属性
store.state.moduleB // -> moduleB 的状态

模块的局部状态

  • mutations

mutations和getters使用方法和根的一致,方法名不得和根的重复,否则无法正常提交

此处的参数state为moduleA的state(局部state)

第二个参数payload可正常使用

mutations:{
        addticket(state){
          state.ticket++;
        },
}
  • getters

getters用法和根的一致,getters名不得和根的重复

第一个参数state为moduleA的state(局部state)

第二个参数getter为全局的getters

第三个参数rootState用于获取根state

getters:{
        totalprice (state,getters,rootState){
          return state.ticket*rootState.price;
        }
      },
  • actions
actions:{
        //和普通的没区别,第一个参数同样为context,根节点状态可通过 context.rootState获取
      }
  • 总结

    state为局部;getters,mutations,actions为全局(不得重名);

    getters,mutations可通过第三个参数rootState获取根state的数据;actions则通过context.rootState获取

项目结构

Vuex 并不限制你的代码结构。但是,它规定了一些需要遵守的规则:

  1. 应用层级的状态应该集中到单个 store 对象中。
  2. 提交 mutation 是更改状态的唯一方法,并且这个过程是同步的。
  3. 异步逻辑都应该封装到 action 里面
├── index.html
├── main.js
├── components
│   ├── App.vue
│   └── ...
└── store
    ├── index.js          # 我们组装模块并导出 store 的地方
    ├── actions.js        # 根级别的 action
    ├── mutations.js      # 根级别的 mutation
    ├── getters.js      # 根级别的 getters
    └── modules
        └── moduleA.js   # moduleA模块
  • 踩坑:如果某个操作中使用了vue.set这样的方法,需要在其抽离的js文件中也引入vue
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-21 15:16:46  更:2021-08-21 15:19:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:34:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码