vuex

  • vue 插件 npm install vuex --save
  • 将多个组件的共享状态进行 集中式管理 - 极易破坏单向数据流
  • 多个视图依赖于同一状态 ----- 就 props 而言:嵌套组件传参繁琐,兄弟组件传参无能为力
  • 来自不同视图的行为需要变更同一状态

将组件的共享状态抽取出来: 组件共享的数据、后台请求数据

  • 核心对象 store

向外暴露 store 对象

状态自管理应用 分为

state -------- 驱动应用的 数据源

view -------- 以声明方式将 state 映射到视图 - template

actions -------- 响应有用户在 view 上的用户输入导致的状态变化 - methods: {}

action 中的 commit() 来触发 mutation 的调用,间接更新 state

一个 action 中可能有多个 commit("mutation的名字", 传参给mutation)

开发工具 会监视 mutations

---------------------------------------------------------------------------------------

src/store.js -------- vuex 最核心的管理模块

import Vue from "vue";

import Vuex from "vuex";

Vue.use(Vuex);

const state = {        // 包含所有状态数据的对象,相当于 data

count: 1        // 指定初始状态数据

};

const actions = {        // 包含 n 个用于间接更改共享状态数据方法的对象 - 分析对状态数据的几个间接操作

increment ({commit}) {commit("INCREMENT")}

decrement ({commit}) {commit("DECREMENT")}

incrementIfOdd ({commit, state}) {if(state.count%2===1)commit("INCREMENT")}

// 不像 react-thunk 才能实现 redux 的异步,vuex 本身就可以异步

incrementAsync ({commit}) {setTimeout(()=>commit("INCREMENT"), 1000)}    

};

const mutations = {        // 包含 n 个用于直接更改共享状态数据方法的对象 - 分析对状态数据的几个直接操作

INCREMENT (state) {state.count++}

DECREMENT (state) {state.count--}

};

const getters = {        // 包含了 计算属性 的定义

evenOrOdd(state){return state.count % 2 === 0 ? '偶数' : '奇数'}

};

export default new Vuex.Store({

state,

actions,

mutations,

getters

});

---------------------------------------------------------------------------------------

src/main.js

  • import Vue from 'vue'
    import App from './App.vue'
    import store from './store/index' /* eslint-disable no-new */
    new Vue({
    el: '#app',
    components: {
    App
    },
    template: '<App/>',
    store
    })


src/App.vue -------- 组件中使用 vuex 管理的状态数据 - ViexModel 即 组件对象的 this 会多一个 $store 对象

...

methods: {

increment () {this.$store.dispatch("increment")}

decrement () {this.$store.dispatch("decrement")}

incrementIfOdd () {this.$store.dispatch("incrementIfOdd")}

incrementAsync () {this.$store.dispatch("incrementAsync")}

}

...

------------------------------------ 简化写法 ------------------------------------

import {mapState, mapGetters, mapActions} from "vuex"

...

computed: {

...mapState(["count"]),        // 函数返回有一个对象,拆包解构以后再放入另一个对象

....mapGetters(["evenOrOdd"])

}        // 相当于:

methods: {...mapActions(["increment", "decrement", "incrementIfOdd", "incrementAsync"])}    // 用的少?因为只适合只有 this.$store 的函数

...


Vuex.Store({ modules: {...} }) --------- 大型项目,按 功能模块 合理拆分 store

Vuex 允许我们将 store 分割成模块(module)。

每个模块拥有自己的 state、mutation、action、getter、

甚至是嵌套子模块——从上至下进行同样方式的分割

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

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

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

5

5

vue_vuex的更多相关文章

随机推荐

  1. 阿里巴巴图标库iconfont上传svg后,显示不了图片

    AI里面选中图形,点对象-路径-轮廓化描边

  2. 在JS中如何判断所输入的是一个数、整数、正数、非数值?

    1.判断是否为一个数字: Number(num)不为 NaN,说明为数字 2. 判断一个数为正数: var num=prompt("请输入:"); if(Number(num)&g ...

  3. mybatis LIKE动态参数 sql语句

    @Select({ "select id, vedio_name, vedio_path,vedio_duration, vedio_classify_id, crt_user_id, cr ...

  4. ES--07

    61.索引管理_快速上机动手实战创建.修改以及删除索引 课程大纲 1.为什么我们要手动创建索引? 2.创建索引 创建索引的语法 PUT /my_index{ "settings": ...

  5. js检测数据类型四种办法

    面试题中经常会考js数据类型检测,今天我来分享一下js中常用的四种方法判断数据类型,欢迎指点更正. 废话不多说,直入正题. 1.typeof console.log(typeof "&quo ...

  6. javascript事件委托的原理与实现

    事件委托 事件流 捕获:查找目标元素: 目标:执行目标的事件: 冒泡:依次执行祖先元素的事件. onmouseenter和onmouseleave不支持冒泡: onmouseover和onmouseo ...

  7. Javascript—DOM

    1.什么是DOM? DOM 是 W3C(万维网联盟)的标准.DOM 定义了访问 HTML 和 XML 文档的标准: "W3C 文档对象模型(DOM)是中立于平台和语言的接口,它允许程序和脚本 ...

  8. VC调用静态库、动态库

    静态库 // 相对路径 或者 绝对路径 #include "yourlib.h" //相对路径 或者 绝对路径 #pragma comment(lib, "yourlib ...

  9. BAT批处理中的字符串处理详解(字符串截取)

    BAT批处理中的字符串处理详解(字符串截取)   BAT批处理中的字符串处理详解(字符串截取 批处理有着具有非常强大的字符串处理能力,其功能绝不低于C语言里面的字符串函数集.批处理中可实现的字符串处理 ...

  10. 关于在windows上远行的虚拟机为ubuntu16.04中不能复制和粘贴的问题解决方案

    Linux安装 VMware tools 工具解决复制和粘贴的方法 VMware虚拟机中如何安装VMWare-Tools详解好处:可以支持图形界面,可以支持共享文件功能等 1 工具/原料 1)安装过虚 ...