资讯专栏INFORMATION COLUMN

vue 状态管理(一)

MiracleWong / 2627人阅读

摘要:在中添加原型属性通过实现任意组件传递参数在挂载声明周期函数中监听自定义事件给传递数据由触发一个事件,在接收数据的组件中监听该事件状态管理随着组件的增加,通过以上方式共享数据,会越来越复杂,提供了状态管理插件。

vue 状态管理(一)

父子组件之间往往使用props$emit 实现数据共享,任意组件可通过bus(一个vue实例)作为桥梁,实现数据共享。当项目中组件越来越多时,组件之间的数据共享变得复杂,难以维护。使用 Vuex 可集中管理组件之间的数据(状态),使组件之间的数据共享变得简单。

父子组件间通信

父→(props)子组件;子→($meit)父组件,即子组件自定义一个事件,在父组件中监听该事件。

自定义输入组件:


使用组件:


因为 v-model 指令是双向绑定的,我们也可以用其来实现值的传递:


bus 任意组件通信

创建一个空的 vue 实例,然后将该实例添加到 vue 的原型上,通过该实例触发事件监听事件来在不同组件之间共享数据。

//bus.js
import Vue from "vue";
let Bus = new Vue();
export default Bus;

在 main.js 中添加原型属性:

import Bus from "./lib/bus"
// 通过 bus 实现任意组件传递参数
Vue.prototype.$bus=bus
//ChildPage.vue



Vuex 状态管理

随着组件的增加,通过以上方式共享数据,会越来越复杂,vue 提供了状态管理插件 Vuex

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式;集中存储和管理应用的所有组件状态。

理解:

状态:数据,相当于组件内部的data 的返回值,Vue 是数据驱动的,数据变化往往会表现在视图层;

集中存储:Vue 只关注视图层,Vuex 提供了一个仓库(store)来保存数据,使得数据和视图分离;

管理:处理保存数据,还可计算、处理数据;

所有组件状态:所有组件都可获取仓库中的数据,即一个项目只有一个数据源。

Vuex 文档中说:

通过定义和隔离状态管理中的各种概念并通过强制规则维持视图和状态间的独立性,我们的代码将会变得更结构化且易维护。

Vuex 就是通过隔离数据、拆分改变数据的方式使得数据和视图独立,数据被组件数共享。

虚线内部的三个部分组成了一个Store,组件的数据保存在 State 中,用户和组件交互时,通过组件内的方法分发(dispatch)一个动作(action,有点像事件),动作会提交(Commit)一个更改(Mutation,也类似事件),改变 State 中的数据,然后获取数据渲染到视图上。

actions 可以是 异步操作,故可在action中调用后台接口获取新的数据;

mutations 只能是 同步操作;

mutations 和 actions 都可直接更改 state,但是当 action 含有异步操作时,会使得数据变化混乱,难以跟踪,使得调试困难;

基于以上原因,Vuex 规定只能是 mutations 来改变 state。

在开发工具中也可提交 mutations。

使用 vuex
//main.js
import Vue from "vue";
import Vuex from "vuex";

Vue.use(Vuex);// Vuex 是 Vue 的插件

let store = new Vuex.Store({
    state: {     //放置state的值
        count: 0,
        str:"abcd234"
    },
      getters: {   //放置getters方法
          strLen: state => state.str.length
      },
      // mutations只能是同步操作
      mutations: {   //放置mutations方法
       increment(state, payload) {
          //在这里改变state中的数据
          state.count = payload.number;
       }
      },
      // actions可以是异步操作
      actions: {      //放置actions方法
           actionName({ commit }) {
              //dosomething
             commit("mutationName")
           },
           getSong ({commit}, id) {
                      //请求后台数据
              api.getMusicUrlResource(id).then(res => {
                let url = res.data.data[0].url;
              })
              .catch((error) => {  // 错误处理
                  console.log(error);
             });
          }
    }
});

new Vue({
  el: "#app",
  store  //  通过 this.store 访问 store
});

我们看看 Vuex 和 store 是什么?

Vuex:

Vuex 它实际上是一个对象,里面包含了Store这一构造函数,还有几个mapActions、mapGetters、mapMutations、mapState、install 方法。

store:

store 是 Vuex 的实例(废话)。

实际项目中往往将 store 多带带放置的一个文件夹在,mutations 、getters、actions 等属性各自用一个文件保存。

state

state 对象的属性时 Vuex 管理的状态,类似单个组建的 data。

访问 getters:

this.$store.state

使用 mapState 映射成计算属性,推荐

//state.js
export default {
    count: 100,
    name: "Jack*Zhou",
    firstName: "Jack",
    lastName: "Zhou",
    age: 24,
    profession: "web deveploper",
    company: "Baidu"
}

组件:

import {mapState} from "vuex"
export default {
    data(){
        return {
            localCount:0
        }
    },
    computed: {
            localCount() {
                return this.$store.state.count + 1;
            },
            //计算属性名和 state 属性名相同:传入数组
            // ...mapState(["count","name"]),
            // 计算属性名和 state 属性不同,传入对象
            ...mapState({
                name: state => state.name,
                count: state => state.count,
                countAlias: "count",
                //为了使用 this 不能使用箭头函数
                countPlusLocalCount(state) {
                    return state.count + this.localCount;
                }
            })
        },
}
getters

getters 是对 state 的加工,类似于组件中的 data 和计算属性的关系。getters 的返回值会被缓存起来,只有当它的依赖改变,才会重新计算。

访问 getters:

this.$store.getters

使用 mapGetters 将 getters 映射成计算属性,推荐

方法访问,不会缓存。

// getters.js
export default {
    fullName: state => state.firstName + " " + state.lastName,
    //在getters 中访问 getters
    info: (state, getters) => {
        return state.age + "," + getters.fullName;
    },
    //为了传递参数,返回一个函数,
    personInfo: (state, getters) => (city) => {
        return {
            name: getters.fullName,
            age: state.age,
            company: state.company,
            city
        }
    }
}

使用 getters:

import { mapGetters } from "vuex"
export default {
    name: "Store",
    computed: {
        ...mapGetters(["fullName", "info", "personInfo"]),
        myInfo() { return this.personInfo("杭州") },
        ...mapGetters({
            fullNameAlias1: "fullName",
            //不能写成函数
            // fullNameAlias2(state){
            //     return state.name+",你好"+this.$store.getters.fullName;
            // }
        })
    },
    mounted() {
        console.log(this.personInfo("成都"))
        console.log(this.myInfo)
    }
}
参考

理解Vuex,看这篇就够了

vuex 文档

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/104752.html

相关文章

  • webpack+vue项目实战(五,监听路由,实现同个页面不同状态的切换)

    摘要:好了,闲话不多说今天要说的时利用监听路由的方式,实现同个页面不同状态的切换。只要等于,那么页面就是待确认回款页面进入待确认回款页面中,回款状态的筛选标签要加上。 1.前言 今天发完这一篇,就要这个系列告一段落了!以后如果有什么要补充的会继续补充!因为在后台管理项目上,搭建的话,主要就是这样了!还有的一些是具体到交互的处理,那个是要根据后端的需求,来进来比较细化的工作,我在这里就不说了!...

    guyan0319 评论0 收藏0
  • 杂篇 - Vue豆瓣系列文章

    摘要:起初,项目使用的是,其提供的方法用着比较爽,由于项目的很多数据来自豆瓣的,直接上简单方便,跨域什么的不考虑。跨域问题,上面已经介绍,在不能操控的豆瓣数据上,使用的是。 项目地址 在线演示 不识庐山真面目,只缘身在此山中。 大概一个月前,开源了Vue重构豆瓣移动端的项目,效果还可以,收到了很多小伙伴的反馈,话说是要写一些文章的,但迟迟没有动笔,估计小伙伴们等的花都谢了,拖延症是病,需要治...

    lijinke666 评论0 收藏0
  • Vue学习日记(四)——Vue状态管理vuex

    摘要:说实在话,我在阅读文档的时候,也很难以去理解,甚至觉得没有使用它我也可以。介绍那么到底是什么引用官网的说法就是是一个专为应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。 前言 先说句前话,如果不是接触大型项目,不需要有多个子页面,不使用vuex也是完全可以的。 说实在话,我在阅读vuex文档的时候,也很难以去理解v...

    fai1017 评论0 收藏0
  • Vue学习日记(四)——Vue状态管理vuex

    摘要:说实在话,我在阅读文档的时候,也很难以去理解,甚至觉得没有使用它我也可以。介绍那么到底是什么引用官网的说法就是是一个专为应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。 前言 先说句前话,如果不是接触大型项目,不需要有多个子页面,不使用vuex也是完全可以的。 说实在话,我在阅读vuex文档的时候,也很难以去理解v...

    zilu 评论0 收藏0
  • Vue学习日记(四)——Vue状态管理vuex

    摘要:说实在话,我在阅读文档的时候,也很难以去理解,甚至觉得没有使用它我也可以。介绍那么到底是什么引用官网的说法就是是一个专为应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。 前言 先说句前话,如果不是接触大型项目,不需要有多个子页面,不使用vuex也是完全可以的。 说实在话,我在阅读vuex文档的时候,也很难以去理解v...

    fjcgreat 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<