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知识库 -> vuex详解 -> 正文阅读

[JavaScript知识库]vuex详解

1.vuex定义和使用步骤:

1.vuex是什么?

Vuex是一个专为 Vue.js 应用程序开发的**状态管理模式**(跟路由一样是一个构造函数), 采用**集中式存储**管理应用的所有组件的状态(数据),解决多组件数据通信。
相比于简单的组件传值更加强大和灵活,所管理的数据也是可检测的(响应式)
复制代码

2. 使用场景:

多用于大型项目(简单项目中使用普通组件传值或者eventBus就满足了)

3.vuex使用步骤(跟vue-router使用类似):

   3.1 安装包:npm i vuex   (-S项目依赖包 默认可以省略)
   3.2 在目标文件(一般在src文件下新建store文件夹并创建index.js文件)中导入vuex==>   import Vuex from 'vuex' (在此之前确保目标文件中已导入了Vue)
   3.3 使用vuex  ==>  Vue.use(Vuex)
   3.4 实例化一个vuex对象(一般命名为store)
   3.5 将vuex对象默认导出(向外共享)  
 
复制代码
import Vue from 'vue'  // 1.导入Vue
import Vuex from 'vuex'  // 2.导入vuex

Vue.use(Vuex)  // 3.使用vuex

// 4.实例化vuex对象
const store = new Vuex.Store({
// state中就是vuex所管理的数据
  state: {
    count: 0
  }
})
// 5.最后默认导出
export default store
// 6.在main.js文件中的导入vuex实例对象并挂载到Vue实例身上
复制代码
3.6 在main.js入口文件中导入vuex实例并向Vue实例身上挂载vuex实例: 代码如下
复制代码
// ....省略其他代码
// 1. 导入store实例
import store from './store' 

new Vue({
  // 省略其他...
  store   // 2. 注入Vue实例(es6简写形式)
})

2.vuex核心

先看看vuex实例完整写法:

// new实例的时候传入一个配置对象 该配置对象的5个属性也是对象
const store = new Store({
    state: {   // state对象存储的是vuex所管理的公共数据
        a:1
    },
    mutations: {   // mutations对象中的属性都是函数 用来修改state中的数据,第一个参数接收的是state对象,第二个参数是传入的新值(调用方法下面讲到)
        changeNum(state,newNum) {
            state.num*=2 // 修改state中的数据
        }
    },
     // getters对象中的属性也是函数 对state中的数据处理然后被引用(作用相当于组件中的计算属性)
    getters: {
        total(state) {
            return state.num*2 
        }
    },
    // actions对象的属性都是函数 作用:
    //   1. action中可以通过调用 mutation来修改state,而不是直接变更状态。
-   //   2.action 可以包含**任意异步**(例如ajax请求)操作
    actions: {
    // context 参数下面详解
        getNums(context) {
             // 一般为Ajax请求
        }
    },
  // 在当前文件中对某些状态(数据)的操作过多时,可以把相关属性的操作单独放入另外的文件中,
  //然后导入到当前文件,并把导入的模块挂载到modules对象上 
    modules: {
        // 从外部文件导入的模块
    }
})
复制代码

注意点: 修改状态(数据)如果是异步的(用异步请求得到的数据替换当前的数据),最好使用在actions中调用mutations中的方法来实现修改(调用格式下面会讲到)

3.vuex核心使用方法

来一张我画的图(有点丑,第一次画):

vuex关系图.jpg

3.1 mutations使用:

3.1.1定义格式如下:

new Vue.store({
  // 省略其他...
  mutations:{
    // 每一项都是一个函数,可以声明两个形参
  	mutation名1:function(state [, 载荷]) {
  
    },
    mutation名2:function(state [, 载荷]) {
  
    },
	}
})
复制代码

3.1.2使用格式如下:

this.$store.commit('mutation名', 新数据(状态),给第二个参数)
复制代码

3.2 getters使用:

3.2.1定义格式如下:

new Vuex.store({
  // 省略其他...
  getters: {
    // state 就是上边定义的公共数据state
    getter的名字1: function(state) {
      return 要返回的值
    }
  }
})
复制代码

3.2.2使用格式:

在组件中通过:`$store.getters.getter的名字` 来访问
复制代码

3.3Vuex用actions发异步请求

3.3.1作用: 我们可以使用Action来修改state,这一点是类似于 mutation的,不同在于:

  • action中可以通过调用 mutation来修改state,而不是直接变更状态。
  • action 可以包含任意异步(例如ajax请求)操作

3.3.2 定义:

new Vuex.store({
  // 省略其他...
  actions: {
    // context对象会自动传入,它与store实例具有相同的方法和属性
    action的名字: function(context, 载荷) {
      // 1. 发异步请求, 请求数据
      
      // 2. commit调用mutation来修改/保存数据
      
      // context.commit('mutation名', 载荷)
    }
  }
})
复制代码

3.3.3使用

在组件中通过`this.$store.dispatch('actions的名字', 参数)`来调用action
复制代码

再来一张图:

vuex核心API使用.jpg

Vuex-辅助函数mapState来使用公共数据

作用: 当访问某个数据项嵌套太深了,能不能优化一下访问的方式?

用mapState把公共数据(vuex.store) 映射 到本组件内部的计算属性

mapState的使用步骤:

// 1. 导入辅助函数mapState,它是在vuex中定义的一个工具函数。
//  es6 按需导入 import { mapState } from 'vuex' 
import { mapState } from 'vuex'

computed: {
   // 说明1: ...对象 是把对象展开,合并到computed
   // 说明2: mapState是一个函数 
   //  ['数据项1', '数据项2']
   ...mapState(['xxx']),
   ...mapState({'新名字': 'xxx'})
}
复制代码

使用

this.xxx
{{xxx}}
复制代码

实例

// 步骤
// 1. 导入辅助函数mapState,它是在vuex中定义的一个工具函数。
//  es6 按需导入 import { mapState } from 'vuex' 
import { mapState } from 'vuex'

// 2. 在computed中使用 ...mapState(['books'])
// const res = mapState(['books'])
// res的结果是一个对象: { books: function() {}}
// console.log('mapState', res)

export default {
  computed: {
    c1 () {
      return 'c1'
    },
    // books: function() {}
    // ..res: 把res这个对象合并到computed对象中
    // ...res
    ...mapState(['books'])
  }
}
</script>

Vuex-map函数用法汇总

如何使用全局state

  • 直接使用: this.$store.state.xxx;

  • map辅助函数:

    computed: { 
     ?...mapState(['xxx']), 
     ?...mapState({'新名字': 'xxx'})
    }
    复制代码

如何使用modules中的state

  • 直接使用: this.$store.state.模块名.xxx;

  • map辅助函数:

    computed: { 
     ?...mapState('模块名', ['xxx']), 
     ?...mapState('模块名', {'新名字': 'xxx'})
    }
    复制代码

如何使用全局getters

  • 直接使用:this.$store.getters.xxx

  • map辅助函数:

    computed: { 
     ?...mapGetters(['xxx']), 
     ?...mapGetters({'新名字': 'xxx'})
    }
    复制代码

如何使用modules中的getters

  • 直接使用: this.$store.getters.模块名.xxx

  • map辅助函数:

    computed: { 
     ?...mapGetters('模块名', ['xxx']), 
     ?...mapGetters('模块名',{'新名字': 'xxx'})
    }
    复制代码

如何使用全局mutations

  • 直接使用:this.$store.commit('mutation名', 参数)

  • map辅助函数:

    methods: { 
     ?...mapMutations(['mutation名']), 
     ?...mapMutations({'新名字': 'mutation名'})
    }
    复制代码

如何使用modules中的mutations(namespaced:true)

  • 直接使用: this.$store.commit('模块名/mutation名', 参数)

  • map辅助函数:

    methods: { 
     ?...mapMutations('模块名', ['xxx']), 
     ?...mapMutations('模块名',{'新名字': 'xxx'})
    }
    复制代码

如何使用全局actions

  • 直接使用:this.$store.dispatch('action名', 参数)

  • map辅助函数:

    methods: { 
     ?...mapActions(['mutation名']), 
     ?...mapActions({'新名字': 'mutation名'})
    }
    复制代码

如何使用modules中的actions(namespaced:true)

  • 直接使用: this.$store.dispatch('模块名/action名', 参数)

  • map辅助函数:

    methods: { 
     ?...mapActions('模块名', ['xxx']), 
     ?...mapActions('模块名',{'新名字': 'xxx'})
    }

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-30 11:50:23  更:2021-09-30 11:51:28 
 
开发: 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年5日历 -2024/5/18 23:55:10-

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