vue系列——组件数据通讯(二)

VUEX: https://vuex.vuejs.org,官方文档先仔细看一遍,否则基础的东西不知道看下面的内容会吃力

关于vuex的使用场景,先抄官网一段话:

虽然 Vuex 可以帮助我们管理共享状态,但也附带了更多的概念和框架。这需要对短期和长期效益进行权衡。

如果您不打算开发大型单页应用,使用 Vuex 可能是繁琐冗余的。确实是如此——如果您的应用够简单,您最好不要使用 Vuex。一个简单的 global event bus 就足够您所需了。但是,如果您需要构建是一个中大型单页应用,您很可能会考虑如何更好地在组件外部管理状态,Vuex 将会成为自然而然的选择。

所以,简言之

项目简单就不用,利用 组件数据通讯(一)中讲到的知识点足够

如果你觉得有必要做一些全局状态管理,那就增加一个vuex.js文件

如果项目比较复杂,涉及到需要管理的全局状态模块较多,还需要引入vuex模块化,

 (一)基础实现

1. 首先写一份最简单的store单页模块

import Vue from ‘vue‘
import Vuex from ‘vuex‘
Vue.use(Vuex)

const user = {
    state: {
        name: ‘lilei‘
    },
    getters: {
        getName(state) {return state.name;}
    },
    mutations: {
        setName(state, name) {state.name = name;}
    },
    actions: {
        setName({ commit }, name) {commit(‘setName‘, name);}
    }
};

const store = new Vuex.Store(user)
export default store

  state:状态对象,很类似全局变量,但它的状态存储是响应式的(驱动页面自动更新)

  getters:对state处理后返回,相当于加工一层,在本例中其实没有做处理原样返回

  mutations:这个对象的方法负责修改state

   actions:异步操作都通过这个对象方法,它自己是不能修改state的,而是通过调用mutation

2. 在根元素中引入store

import store from ‘./vuex‘

new Vue({
  el: ‘#app‘,  // 把 store 对象提供给 “store” 选项,这可以把 store 的实例注入所有的子组件
  store,
  render: h => h(App)
})

  Vuex 通过 store 选项,提供了一种机制将状态从根组件『注入』到每一个子组件中,简单说,我们在所有子组件都可以访问到store相关对象

3.子组件读取和操作store

  3.1 通过this.$store调用

computed:{
    count () {
      return this.$store.state.count
    },
    countFromGetter () {
      return this.$store.getters.count
    }
},
methods:{
    commit(){
      this.$store.commit(‘increment‘)
    },
    dispatch(){
      this.$store.dispatch(‘increment‘,str)
    }
}

  3.2通过vuex提供的mapState,mapGetters,mapMutations,mapActions调用

import {mapState,mapGetters,mapMutations,mapActions} from ‘vuex‘

export default {
  computed:{
    ...mapState([‘name‘]),
    ...mapGetters([‘getName‘]) 

  },
  methods:{
    ...mapActions([‘setName‘]),
    parentListener(){}
  }
}

  这里直接使用对象扩展符去调用,注意.babelrc文件中要加入"stage-2",不然不支持该特性

1. 读取state两种方式,直接读取和通过getters,getters相当于一个中间处理器

2. 操作state两种方式,mutations和actions,在子组件中两种方式都可以使用,比如如果简单的操作直接用mutations,涉及到异步或者复杂业务可以封装公用代码到actions里面;

另外:

mutations 有一个固有参数 state,接收的是 Vuex 中的 state 对象

action 也有一个固有参数 context,但是 context 是 state 的父级,包含  state、getters

  如果希望取别名调用:

computed:mapState({
    count: state => state.count,

    // 传字符串参数 ‘count‘ 等同于 `state => state.count`
    countAlias: ‘count‘,

    // 为了能够使用 `this` 获取局部状态,必须使用常规函数
    countPlusLocalState (state) {
      return state.count + this.localCount
    }
  })
},

  

(二)模块化store

业务复杂的情况下,我们要做一个store的模块化,否则所有的状态全堆在一个sotre中,可想而知会怎样。。

下面介绍的模块化方法承袭官方推荐:

1. index.js

import Vue from ‘vue‘
import Vuex from ‘vuex‘
import * as actions from ‘./actions‘
import * as getters from ‘./getters‘
import a from ‘./modules/a‘
import b from ‘./modules/b‘

Vue.use(Vuex)

export default new Vuex.Store({
  actions,
  getters,
  modules: {
    a,
    b
  }
})

  这个整个store模块的入口文件,做一个所有模块的整合再export出去;

这里面有个所谓全局的getters和actions,如果没有也可以不加;模块内部的 action、mutation、和 getter 仍然注册在全局命名空间,所以其实任何子组件都是可以调用所有模块的store

2. mutations-types.js

这个js就是定义一些常量

export const CHANGE_A = ‘CHANGE_A‘
export const CHANGE_B = ‘CHANGE_B‘

3. 两个案例模块,a.js/b.js

import * as types from ‘../mutation-types‘

// initial state
const state = {
  aa:‘aa‘
}

// getters
const getters = {
  aa: state => `from getters:${state.aa}`
}

// actions
const actions = {
  addStringA ({ commit, state }, str) {
    commit(types.CHANGE_A, { str })
  }
}

// mutations
const mutations = {
  [types.CHANGE_A] (state, { str }) {
    state.aa += str
  }
}

export default {
  state,
  getters,
  actions,
  mutations
}

  这里就是一个模块的store,可以看到和我们上面的单页面vuex.js很像

4. 子组件调用

<template>
  <div id="app">
    <myHeader></myHeader>
    <div id="container" @click="addStringA(‘nnnn‘)">
    {{aa}}=={{bb}}
    </div>
  </div>
</template>

<script>
import {mapState,mapGetters,mapMutations,mapActions} from ‘vuex‘

export default {
  name:‘app‘,  

  computed:{
    ...mapGetters([
                 ‘aa‘,‘bb‘
    ]),
    promotionInfo(){}
  },
  methods:{
    // ...mapActions([
    //              ‘Gaction‘,‘addStringA‘
    // ]),
    addStringA(str){
      this.$store.dispatch(‘addStringA‘, str)
    }
  }
}
</script>

  在methods里面,分别用mapActions和dispatch的方式触发action,结果都是一样的

时间: 2024-10-16 13:49:31

vue系列——组件数据通讯(二)的相关文章

vue系列——组件数据通讯(一)

看博之前复习一遍关于组件数据通讯的官方文档:https://vuefe.cn/v2/guide/components.html vue的官方文档本身写的算是比较清楚的,此博作为要点总结和深入补充 关键词:父组件通过props传递数据给子组件,子组件通过event传递数据给父组件 (一)props 1. 基本用法 prop 是父组件用来传递数据的一个自定义属性 //父组件<template> <div id="app"> <myHeader :msg=&qu

vue.js 组件数据传递

一 父---> 子 组件通信1,声明一个组件(props 指定组件外来接受的参数,我指定了一个string类型的message参数,默认内容为'I Am AESCR') Vue.component('test-com',{ props:{ message:{ type:String, default:'I Am AESCR' } }, template:'<div>{{message}}</div>' }) <div id="app"> <

vue - 父组件数据变化控制子组件类名切换

先说当时的思路和实现核心是父子组件传值和v-bind指令动态绑定class实现 1. 父组件引用.注册.调用子组件script中引用 import child from '../components/Child' export中注册 export default { name: 'Home', components: { child }, } template中调用(pug写法) child() 2. 父组件准备数据并处理 data() { return { classNames: ''; }

vue子组件数据变化同步到父组件中

方法:通过watch监听子组件数据变化 1.父组件中注册方法 <Child @getChildValue="getChildValue"></Child> 2.子组件中通过watch监听数据变化,数据变化时通过$emit来触发方法传参 <template> <div class="child"> <p>子组件同步数据到父组件</p> <input type="text"

vue.js组件之间通讯--父组件调用子组件的一些方法,子组件暴露一些方法,让父组件调用

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title></head><body><div id="app"></div></body><script src="node_modules/vue/

vue.js组件之j间的通讯二

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.js"></script> </head> <body> <di

vue.js 组件之间如何实现数据传递?

组件是 vue.js  最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用.如何传递数据也成了组件的重要知识点之一.本文和大家分享的就是vue.js  组件之间传递数据相关内容,一起来看看吧,希望对大家 学习vue.js有所帮助. 组件 组件与组件之间,还存在着不同的关系.父子关系与兄弟关系(不是父子的都暂称为兄弟吧). 父子组件 父子关系即是组件 A  在它的模板中使用了组件  B ,那么组件  A  就是父组件,组件  B  就是子组件. //  注册

Vue学习笔记入门篇——组件的通讯

本文为转载,原文:Vue学习笔记入门篇--组件的通讯 组件意味着协同工作,通常父子组件会是这样的关系:组件 A 在它的模版中使用了组件 B.它们之间必然需要相互通信:父组件要给子组件传递数据,子组件需要将它内部发生的事情告知给父组件.然而,在一个良好定义的接口中尽可能将父子组件解耦是很重要的.这保证了每个组件可以在相对隔离的环境中书写和理解,也大幅提高了组件的可维护性和可重用性.在 Vue 中,父子组件的关系可以总结为 props down, events up.父组件通过 props 向下传递

vue系列——数据请求

数据请求有两个问题,一个是工具选择,一个是代码组织问题 (一)工具选择 我看过一些别人写的项目,有直接用jquery提供的ajax接口,有自己封装了一个fetch接口,当然更多的是选择vue的第三方数据请求模块,说的最多的是vue-resource和axios:axios是目前最推荐的,但是我最终还是暂时选择了vue-resource,原因很简单,在国内还是有很多jsonp需求的,而后者不支持,原因很简单作者不喜欢jsonp,它认为这是一种跨域的hack方式,是不好的所以也没准备支持. 为了防止