天空是连着的,如果我们也能各自发光的话,无论距离有多远,都能看到彼此努力的身影。

vuex技术多组件共享数据-vuex模块化+namespace

  • index.js
  • count.js
  • person.js
  • Person.vue
  • Count.vue
  • App.vue
  • main.js

我们知道每一个组件都有自己的 data,那么多个组件如何共享数据?这就引出了 state 的概念,可以把多个组件共有的属性统一由state进行管理。但是组件并不能直接访问或操作state里的数据源,而是通过 mutations 来对数据源进行操作。而改变数据的行为触发由 Actions 来完成,Vue 为 actions的触发提供了一个 commit 的概念,由action 触发通过 mutations 对数据进行操作,从而改变 state 数据源。

通过:import { nanoid } from 'nanoid'来生成一个ID属性。
核心代码块:

methods:{add(){const personObj = {id:nanoid(),name:this.name};this.$store.commit('ADD_PERSON',personObj)console.log(personObj);this.name = ''}}

当我们开发的项目比较大时,store中的数据就可能比较多,这时我们store中的数据就可能变得臃肿,为了解决这一问题,我们就需要将store模块化(module),

即每个模块拥有自己的state、mutation、action、getter、甚至是嵌套子模块

vuex模块化核心代码示例
开启命名空间,简化代码示例:

const countOptions = {namespaced: true,state: {sum: 0,name: '勇敢牛牛,不怕困难',},actions: {jiaodd(context, value) {context.commit("JIAODD", value)},jiaWait(context, value) {context.commit('JIAWAIT', value)}},mutations: {JIA(state, value) {state.sum += value},JIANJIAN(state, value) {state.sum -= value},JIAODD(state, value) {if (state.sum % 2 != 0) {state.sum += value}},JIAWAIT(state, value) {setTimeout(() => {state.sum += value}, 500)},},getters: {bigSum(tate) {return state.sum * 10}}
}

才可以使用简写,直接获取属性值

  ...mapState('a',['sum','name'])

在person组件中如果直接对commit操作。就在属性值前面加这个模块的名称

this.$store.commit('b/ADD_PERSON',personObj)

例如:

add(){const personObj = {id:nanoid(),name:this.name};this.$store.commit('b/ADD_PERSON',personObj)console.log(personObj);this.name = ''}

在【person中联系muttion修改数据】

this.$store.commit('b/ADD_PERSON',personObj);

最终的数据结构

index.js

//引入Vue
import Vue from 'vue'
// 引入Vuex
import Vuex from 'vuex'
//使用插件
Vue.use(Vuex)//计算相关配置
import countOptions from './count'// 人员相关配置
import personOptions from './person'// 创建store
export default new Vuex.Store({modules: {a: countOptions,b: personOptions}
})// export default store

count.js


const countOptions = {namespaced: true,state: {sum: 0,name: '勇敢牛牛,不怕困难',},actions: {jiaodd(context, value) {context.commit("JIAODD", value)},jiaWait(context, value) {context.commit('JIAWAIT', value)}},mutations: {JIA(state, value) {state.sum += value},JIANJIAN(state, value) {state.sum -= value},JIAODD(state, value) {if (state.sum % 2 != 0) {state.sum += value}},JIAWAIT(state, value) {setTimeout(() => {state.sum += value}, 500)},},getters: {bigSum(state) {return state.sum * 10}}
}
export default countOptions

person.js

import axios from "axios";
import { nanoid } from 'nanoid'
const personOptions = {namespaced: true,state: {personList: [{ id: '001', name: '张安' }]},actions: {addPersonWang(context, value) {if (value.name.indexOf('王') === 0) {context.commit('ADD_PERSON', value)} else {alert('添加的人必须是姓王')}},addPersonServer(context) {axios.get('https://api.uixsj.cn/hitokoto/get?tyoe=social').then(response => {context.commit('ADD_PERSON', { id: nanoid(), name: response.data })},error => {alert(error.message)})}},mutations: {ADD_PERSON(state, value) {console.log('muttion中的ADD_preson被调用了');state.personList.unshift(value)}},getters: {firstPersonName(state) {return state.personList[0].name}}
}
export default personOptions

Person.vue

<template><div><h1>person</h1><h2 class="one">count组件的求和为{{sum}}</h2><h2>列表中第一个信息是:{{ firstPersonName }}</h2><input type="text" name="" id="" placeholder="请输入名字" v-model="name"><button @click="add()">添加</button><button @click="addWang()">添加一个姓王的人</button><button @click="addServer()">添加一随机语句</button><ul><li v-for="p in personList" :key='p.id'>{{p.name}}</li></ul></div>
</template><script>import {mapState } from 'vuex'import { nanoid } from 'nanoid'export default {name:'Person',data(){return {name:'',}},computed:{// personList(){//     return this.$store.state.personList// }...mapState('a', ['sum']),...mapState('b', ['personList']),firstPersonName(){return this.$store.getters['b/firstPersonName']}},methods:{add(){const personObj = {id:nanoid(),name:this.name};this.$store.commit('b/ADD_PERSON',personObj);console.log(personObj);this.name = ''},addWang(){const personObj = { id: nanoid(), name: this.name };this.$store.dispatch('b/addPersonWang', personObj)this.name = ''},addServer(){this.$store.dispatch('b/addPersonServer')}},mounted() {console.log(this.$store);}}
</script>
<style>.one{color: rgb(68, 156, 233);}
</style>

Count.vue

<template><div><h1>当前数值为:{{sum}}</h1><h2>放大10倍后的数值是:{{bigSum}}</h2><h3>{{name}}</h3><h3 class="tow">person组件总人数是:{{ personList.length }}</h3><select v-model.number="n"><option value="1">1</option><option value="2">2</option><option value="3">3</option></select><button @click="increment(n)">+</button><button @click="decrement(n)">-</button><button @click="incrementOdd(n)">当前数和为奇数再加</button><button @click="incrementWait(n)">延时时间后再加</button></div>
</template><script>import {mapGetters, mapState , mapMutations,mapActions} from 'vuex'export default {name:'Count',data() {return{n:1}},methods:{...mapMutations('a', { increment: 'JIA', decrement: 'JIANJIAN' }),...mapActions('a', {incrementOdd : 'jiaodd',incrementWait:'jiaWait'}),},computed:{// ...mapGetters(['bigSum']),// ...mapState(['a','b'])...mapState('a',['sum','name']),...mapState('b', ['personList']),...mapGetters('a',['bigSum']),},mounted(){                                                                          const x = mapState({name:'name'});}}</script>  <style scoped>button{margin-left: 10px;}.tow{color: rgb(68, 156, 233);}
</style>

App.vue

<template><div><Count/><Person/></div>
</template>
<script>import Count from './components/Count.vue';import Person from './components/Person.vue'export default {name: "App",data() {return {data:1};},components: {Count, Person},mounted(){// console.log('app',this);}
}
</script>
<style scoped></style>

main.js

//引入Vue
import Vue from 'vue'
//引入App
import App from './App.vue'// 也就是创建了一个store
// 引入store
import store from './store/index'
//关闭Vue的生产提示
Vue.config.productionTip = false
//创建vm
new Vue({el: '#app',render: h => h(App),store: store,beforeCreate() {Vue.prototype.$bus = this}
})

vuex技术多组件共享数据-vuex模块化+namespace相关推荐

  1. VUE学习(二十一)、Vuex(getters、mapState与mapGetters、mapMutations与mapActions、多组件共享数据、模块化编码)

    VUE学习(二十一).Vuex(getters.mapState与mapGetters.mapMutations与mapActions.多组件共享数据.模块化编码) 一.Vuex普通实现求和案例 演示 ...

  2. Vue教程5【vuex】getters,mapState,mapGetters,mapActions,mapMutations,模块化namespace

    vuex 什么时候需要使用? 状态(数据)共享! vuex工作原理 搭建vuex环境 创建文件 src/store/index.js//全局安装[--save生产环境] npm install -g ...

  3. vue-父组件向子组件共享数据

    父组件向子组件共享数据需要使用自定义属性 1.子组件中 ,通过props来定义属性. 2.子组件中,负责把数据,通过V-bind绑定给子组件. <Son :msg="message&q ...

  4. 【技术总结】大数据开发模块化知识体系、学习路线及对应的资料推荐

    〇.概述 1.常用网站 2.常用资料 一.环境 Linux Shell Git Maven Docker K8S Rancher 二.数据库 MySQL Oracle Sql Server Postg ...

  5. Vuex是什么,为什么用Vuex,怎么用

    1.Vuex是什么? Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储,管理应用中所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 2.为什么要用vu ...

  6. 微信小程序中全局共享数据globalData的使用

    1.全局共享数据 全局共享数据的两种方式 通过Vue原型共享数据 通过globalData共享数据 vuex 本地存储 1)在Vue实例原型属性上添加属性,其他任何页面预想使用,直接使用this获取到 ...

  7. vue 中 provide 和 inject 共享数据

    project 和 inject 是 vue 2.2.0 新增内容.官网说明 >> https://cn.vuejs.org/v2/api/#provide-inject 1. 概述 后代 ...

  8. vue+vuex+axios从后台获取数据存入vuex,组件之间共享数据

    vue+vuex+axios从后台获取数据存入vuex,组件之间共享数据 在vue项目中组件间相互传值或者后台获取的数据需要供多个组件使用的情况很多的话,有必要考虑引入vuex来管理这些凌乱的状态,今 ...

  9. vuex 实现vue中多个组件之间数据同步以及数据共享。

    http://pan.baidu.com/s/1hrJfpli  demo下载地址 前言 在一些项目中有很多数据状态之间要实现数据共享状态共享,例如购物车的数据.用户的登录状态等等.vue父元素是可以 ...

  10. vue组件中数据共享——vuex

    目录 vuex是什么? 使用vuex统一管理状态的好处 什么样的数据适合存储到vuex中 安装vuex 使用vuex vuex核心概念 组件访问state中数据的第一种方式: 组件访问state中数据 ...

最新文章

  1. 从无到有:微信后台系统的演进之路
  2. MySQL 中的三中循环 while loop repeat 的基本用法
  3. php微信段子,年度挤进前十名的微信段子,笑死了
  4. 网络安全公司的源代码遭泄露,售价25万美元
  5. 图像、视频等文件类型(拓展名)
  6. 利用VS2010进行SQL Server服务器和本地的数据融合
  7. xp系统能不能安装mysql_win xp32位系统安装mysql详细步骤
  8. win10应用商店无法安装
  9. DLL load failed while importing _imaging怎么处理
  10. 使用PHP制作 简易员工管理系统之三(管理员登陆界面以及数据库验证)
  11. 叛乱2 linux服务器,叛乱沙漠风暴怎么开服?开服操作指南详解
  12. autocad application 版本
  13. bde oracle 商友的流程_怎么用BDE连接Oracle?(100分)
  14. 电脑的远程控制是什么
  15. 5 种有效的电子邮件营销技巧可增加您的转化率
  16. Armijo-Goldstein法则和Wolfe-power法则图解
  17. 基于词典规则的中文分词(C语言实现)
  18. Mac版safari开启调试模式
  19. Windows制作U盘在Thinkpad T60上安装Debian 7 (Wheezy)
  20. C/C++ 三种方式获得文件的大小

热门文章

  1. 南京大学计算机系2019复试离散题目-逻辑与推理
  2. HeadFirst设计模式-工厂模式(基于汽车工厂和手机工厂)
  3. AMAZEUI之iscroll 下滑刷新/上拉加载更多实例
  4. html中版权怎么写,HTML版权符号是怎么输入的、代表什么-京标知识产权
  5. Debian和Ubuntu版本比较
  6. 两高一部电子数据取证规则_“鼓浪听涛,论道取证”2019中国电子数据取证峰会在厦门召开,行业专家齐聚...
  7. 毛选-实践论-辩证唯物论的认识论-知行统一观
  8. oracle onlinelog 11G,从alert日志看Oracle 11g Datagurad日志传输(下)
  9. intel 显卡驱动的节能设置(新版驱动)
  10. 浅谈贪吃蛇的创新玩法