vue 组件之间数据传输(vuex)

初始化 store

src/main.js

  1. import Vuex from "vuex";
  2. Vue.use(Vuex);
  3. new Vue({
  4. ...,
  5. store,
  6. ...,
  7. });

src/store/index.js

  1. import mutations from "./mutations";
  2. const initStore = {
  3. state: {
  4. userBasicInfo: {},
  5. siteBaseInfo: {
  6. download: "",
  7. invitation: "",
  8. register_enable: "",
  9. service_qq1: "",
  10. service_qq2: "",
  11. service_wechat: "",
  12. },
  13. },
  14. mutations
  15. };
  16. export default initStore;

src/store/mutations.js

  1. const SET_USER_BASIC_INFO = 'SET_USER_BASIC_INFO';
  2. const SET_SITE_BASE_INFO = 'SET_SITE_BASE_INFO';
  3. export default {
  4. [SET_USER_BASIC_INFO](state, payload) {
  5. state.userBasicInfo = payload.data;
  6. },
  7. [SET_SITE_BASE_INFO](state, payload) {
  8. state.siteBaseInfo = Object.assign({}, state.siteBaseInfo, payload);
  9. },
  10. }

state

正常使用 state

Vuex 的状态存储是响应式的,从 store 实例中读取状态最简单的方法就是在计算属性中返回某个状态。每当 store.state.count 变化的时候, 都会重新求取计算属性,并且触发更新相关联的 DOM。

Vuex 通过 store 选项,提供了一种机制将状态从根组件“注入”到每一个子组件中。

  1. const app = new Vue({
  2. el: '#app',
  3. // 把 store 对象提供给 “store” 选项,这可以把 store 的实例注入所有的子组件
  4. store,
  5. components: { Counter },
  6. template: `
  7. <div class="app">
  8. <counter></counter>
  9. </div>
  10. `
  11. })

在子组件中使用

  1. const Counter = {
  2. template: `<div>{{ count }}</div>`,
  3. computed: {
  4. count () {
  5. return this.$store.state.count
  6. }
  7. }
  8. }

mapState 辅助函数

按官网的案例

  1. import { mapState } from 'vuex'
  2. export default {
  3. // ...
  4. computed: mapState({
  5. // 箭头函数
  6. siteBaseInfo: state => state.siteBaseInfo,
  7. // 传字符串参数
  8. siteBaseInfo: "siteBaseInfo",
  9. // 为了能够使用 `this` 获取局部状态,必须使用常规函数
  10. download_ios (state) {
  11. return state.siteBaseInfo.download + this.prefix
  12. },
  13. download: state => state.siteBaseInfo.download
  14. })
  15. }

当映射的计算属性的名称与 state 的子节点名称相同时,我们也可以给 mapState 传一个字符串数组

  1. computed: mapState([
  2. // 映射 this.count 为 store.state.count
  3. 'count'
  4. ])

mapState 与局部计算属性混合使用

使用对象展开运算符将多个对象合并为一个,以使我们可以将最终对象传给 computed 属性。

  1. computed: {
  2. localComputed () { /* ... */ },
  3. // 使用对象展开运算符将此对象混入到外部对象中
  4. ...mapState({
  5. // ...
  6. })
  7. }

getter 的使用

有时候我们需要从通过 state 得到一些新的状态,因为这一状态可能其他很多组件都要使用这一状态.比如余额这一参数,我们当前只有盈利和亏损额,但是很多页面都要使用余额进行显示,那么每个引入页面都要进行一次计算吗?想想就麻烦,还是只计算一次,然后直接获取这个余额值来的方便

store/getters.js

  1. export default {
  2. balance: (state) => {
  3. return Number(state.userBasicInfo.profit) - Number(state.userBasicInfo.loss);
  4. },
  5. download: (state) => {
  6. return state.siteBaseInfo.download;
  7. }
  8. }

mapGetters 辅助函数

辅助函数仅仅是将 store 中的 getter 映射到局部计算属性

  1. import { mapGetters } from 'vuex'
  2. export default {
  3. // ...
  4. computed: {
  5. // 使用对象展开运算符将 getter 混入 computed 对象中
  6. ...mapGetters([
  7. 'balance',
  8. 'download',
  9. // ...
  10. ])
  11. }
  12. }

getter 的使用

  1. //直接使用
  2. store.getters.download
  3. //组件中使用
  4. computed: {
  5. download () {
  6. return this.$store.getters.download
  7. }
  8. }
  9. //使用辅助函数
  10. ...mapGetters([
  11. 'download',
  12. 'balance',
  13. ])
  14. //和mapState一起用
  15. computed: {
  16. ...mapState({
  17. siteBaseInfo: "siteBaseInfo",
  18. }),
  19. ...mapGetters({
  20. download: 'download'
  21. })
  22. },

Getter 也可以接受其他 getter 作为第二个参数

  1. getters: {
  2. // ...
  3. doneTodosCount: (state, getters) => {
  4. return getters.doneTodos.length
  5. }
  6. }

总之,getter 就是一个将一些需要进行再次计算的 state 计算好,然后将其作为 state 进行快捷的引用

mutation 使用

  • 最好提前在你的 store 中初始化好所有所需属性
  • 当需要在对象上添加新属性时,你应该使用 Vue.set(obj, 'newProp', 123)或以新对象替换老对象(对象展开符)
  • mutation 必须是同步函数

每个 mutation 都有一个字符串的 事件类型 (type) 和 一个 回调函数 (handler),会接受 state 作为第一个参数

  1. //设置
  2. mutations: {
  3. SET_USER_BASIC_INFO(state) {
  4. state.userBasicInfo = {a:1,b:2};
  5. },
  6. }
  7. //使用
  8. store.commit('SET_USER_BASIC_INFO')

提交载荷(Payload)

  1. //设置
  2. mutations: {
  3. SET_USER_BASIC_INFO(state, payload) {
  4. state.userBasicInfo = Object.assign({},payload);
  5. },
  6. }
  7. //使用
  8. store.commit('SET_USER_BASIC_INFO', {
  9. a:1,
  10. b:2
  11. })

对象风格的提交方式

提交 mutation 的另一种方式是直接使用包含 type 属性的对象

  1. store.commit({
  2. type: 'SET_USER_BASIC_INFO',
  3. data:{
  4. a:1,
  5. b:2,
  6. }
  7. })
  8. //mutations的效果
  9. mutations: {
  10. increment (state, payload) {
  11. state.userBasicInfo = Object.assign({},payload.data);
  12. }
  13. }

使用常量替代 Mutation 事件类型

  1. // mutation-types.js
  2. export const SET_USER_BASIC_INFO = 'SET_USER_BASIC_INFO';
  3. // mutations.js
  4. import { SET_USER_BASIC_INFO } from './mutation-types';
  5. mutations: {
  6. // 我们可以使用 ES2015 风格的计算属性命名功能来使用一个常量作为函数名
  7. [SET_USER_BASIC_INFO] (state) {
  8. // mutate state
  9. }
  10. }

mapMutations 辅助函数

  1. //正常
  2. this.$store.commit('SET_USER_BASIC_INFO');
  3. //mapMutations
  4. import { mapMutations } from 'vuex';
  5. export default {
  6. ...,
  7. methods:{
  8. ...mapMutations({
  9. setUserBasicInfo: 'SET_USER_BASIC_INFO' // 将 `this.setUserBasicInfo()` 映射为 `this.$store.commit('SET_USER_BASIC_INFO')`
  10. })
  11. }
  12. }

action

用来提交一个 mutation,还可以进行异步操作

  1. //注册
  2. const store = new Vuex.Store({
  3. state,
  4. mutations,
  5. actions: {
  6. //解构context.commmit
  7. GET_HOME_INFO({commit}) {
  8. commit("SET_USER_BASIC_INFO");
  9. },
  10. }
  11. })
  12. //触发
  13. store.dispatch('GET_HOME_INFO')
  14. //载荷形式
  15. store.dispatch('GET_HOME_INFO',{})
  16. //对象形式
  17. store.dispatch({
  18. type:'GET_HOME_INFO',
  19. data:{}
  20. })

mapActions 辅助函数

  1. import { mapActions } from 'vuex'
  2. export default {
  3. ...
  4. methods: {
  5. ...mapActions({
  6. getHomeInfo: 'GET_HOME_INFO' // 将 `this.getHomeInfo()` 映射为 `this.$store.dispatch('GET_HOME_INFO')`
  7. })
  8. }
  9. }

异步的 action

action 中的中支持的异步 ajax,setTimeout,acync/await,promise...

  1. store.dispatch('actionA').then(() => {
  2. // ...
  3. })

其他的传值还有一些方式

比如 props,seventBus,slocalStorage,sessionStorage,router 传参,cookie(不推荐,虽然就跟之前做购物车差不多的传递形式)

vue 组件之间数据传输(props 传值方式)

这个多用于父子组件之间的传值,是最基本的传值方式

父亲组件进行绑定,将数据绑定,其中 personal,personalData,imgUrl 是绑定的数据,@updata 是绑定的事件

  1. <template>
  2. ...
  3. <slideBar
  4. @updata="updata"
  5. :personal="personal"
  6. :personalData="personalData"
  7. :imgUrl="imgUrl"
  8. ></slideBar>
  9. ...
  10. <template>

子组件进行获取数据通过 props 进行获取,可以设置一些静态类型检查,类似于 react 的 proptypes,同时子组件想要向父组件进行传值,可以通过 emit 进行传值就行了

  1. export default {
  2. props: {
  3. slideMsg: Array,
  4. personal: Object,
  5. personalData: Object,
  6. imgUrl: String
  7. },
  8. ...
  9. methods:{
  10. submitEvent(){
  11. ...
  12. this.emit("updata","我是获取的数据");
  13. ...
  14. }
  15. }
  16. }

vue 组件之间数据传输(eventBus 进行组件传递)

事件 bus 通过一个新的 vue 实例,来进行事件监听和事件分发

commom/bus.js

  1. //极简单的vue实例
  2. import Vue from 'vue';
  3. // 使用 Event Bus
  4. const bus = new Vue();
  5. export default bus;

在 game 组件中引入

  1. import bus from "@/common/bus";
  2. ...
  3. bus.$emit("moneyChange", {....});
  4. ...

在用 money 组件中引入

  1. import bus from "@/common/bus";
  2. ...
  3. bus.$on("moneyChange", msg => {
  4. msg && this.initHomeData();
  5. });
  6. ...

在最初的项目阶段这是一个不错的选择,但是随着项目体积的增大,事件触发和数据流向变得越来越不可见,后续开发和维护变得越来越困难.

sessionstorage

项目中使用的 sessionStorage

  1. sessionStorage.setItem("msg", JSON.stringify(res.data)); //为了兼容之前的代码,有用到msg这个本地缓存的数据
  2. sessionStorage.setItem("isMobile", res.data.mobile);
  3. sessionStorage.setItem("invi", res.data.invitation);
  4. sessionStorage.setItem("isLogin", res.data.trier);
  5. sessionStorage.setItem("setPwd", res.data.fundpwd);
  6. sessionStorage.setItem("isShow", res.data.bankcard);

localStorage

项目中关于声音的开关,样式选择,背景切换等,用来将用户的一些操作一直保存

  1. //组件userSetting
  2. localStorage.setItem("audio", this.switchValue);
  3. //组件audioPlay
  4. let audio = localStorage.getItem("audio");

sessionstorage 和 localStorage 看情况使用就好,sessionstorage 是浏览器关闭没了,localStorage 是一直存储不删除就在存在

params

依赖于 vue-router

  1. this.$router.push({
  2. name: "Main",
  3. params: {
  4. id: this.setting_id,
  5. type: "3"
  6. }
  7. });

Vuex

Vuex - 标签 - 掘金

浪里行舟 从头开始学习 Vuex

VueJS 中学习使用 Vuex 详解

到底 vuex 是什么?

基于 vue2 + vuex 构建一个具有 45 个页面的大型单页面应用

[Vue] vuex进行组件间通讯的更多相关文章

  1. vue中兄弟组件间通讯

    vue2.0中兄弟组件间的通讯是通过eventBus(事件发布订阅)实现的. eventBus.js import Vue from 'vue' const eventBus = new Vue() ...

  2. React 组件间通讯

    React 组件间通讯 说 React 组件间通讯之前,我们先来讨论一下 React 组件究竟有多少种层级间的关系.假设我们开发的项目是一个纯 React 的项目,那我们项目应该有如下类似的关系: 父 ...

  3. vue 和 react 组件间通信方法对比

    vue 和 react 组件间通信方法对比: 通信路径 vue的方法 react的方法 父组件 => 子组件 props(推荐).slot(推荐).this.$refs.this.$childr ...

  4. AngularJs学习笔记-组件间通讯

    组件间通讯 (1)输入属性@Input Tips:子组件属性的改变不会影响到父组件 如下,子组件中stockCode属性发生变化不会引起父组件stock属性的变化 (2)输入属性@Output 子组件 ...

  5. vue仓库、组件间通信、前后台数据交互、前端储存数据大汇总

    目录 路由重定向 仓库介绍 vuex插件:可以完成任意组件间信息交互(移动端) 前端存储数据大汇总 前后台交互方式(重点) 前后台数据交互 axios插件:完成前后台ajax交互的 同源策略 - 前后 ...

  6. vue非父子组件间传参问题

    最近在使用vue进行开发,遇到了组件之间传参的问题,此处主要是针对非父子组件之间的传参问题进行总结,方法如下:一.如果两个组件用友共同的父组件,即 FatherComponent.vue代码 < ...

  7. 【原】vue单文件组件互相通讯

    在vue中,我们可以把一个页面各个部分单独封装起来,做成各种小组件,然后加载,这样的好处是代码维护起来比较容易,重复的代码多处调用! 在一个vue项目中,单文件组件以.vue形式文件命名 每个组件之间 ...

  8. vue的父子组件间的相互传参props及props数据的多种验证机制

    感觉自己即将完全步入前端大军,后台老板都不需要我弄了,塞翁失马...时间会告诉我们是好是坏 好了言归正传,最近vue是搞的不亦乐乎啊,下面来总结一下vue组件间的各种使用方法以及一些技巧 ------ ...

  9. Vue的父子组件间通信及借助$emit和$on解除父子级通信的耦合度高的问题

    1.父子级间通信,父类找子类非常容易,直接在子组件上加一个ref,父组件直接通过this.$refs操作子组件的数据和方法    父 这边子组件中 就完成了父 => 子组件通信 2. 子 =&g ...

随机推荐

  1. BZOJ_1334_[Baltic2008]Elect_DP+语文题

    BZOJ_1334_[Baltic2008]Elect_DP Description N个政党要组成一个联合内阁,每个党都有自己的席位数. 现在希望你找出一种方案,你选中的党的席位数要大于 总数的一半 ...

  2. 面试阿里前端P6血和泪换来的收获

      我的一个朋友在前端耕耘一段时间,也在网上进行了高度培训学习,最近一段时间他打算跳槽去阿里面试前端P6开发岗位,结果被痛虐了一回,估计从此以后会给他留下不可磨灭的阴影啊 真是十年生死两茫茫,一鲁代码 ...

  3. Oracle系列-锁表与解锁解决方案(基础版)

    [Oracle锁表查询和解锁解决方案] 一.了解原因(借鉴整理) 数据库操作语句的分类 DDL:数据库模式定义语言,关键字:createDML:数据操纵语言,关键字:Insert.delete.upd ...

  4. ruby整理

    参考博客:https://www.cnblogs.com/felixzh/p/8081622.html 官网地址 https://rvm.io/rvm/install 一.前提  centos6.8下 ...

  5. 回归树(Regression Tree)

    目录 回归树 理论解释 算法流程 ID3 和 C4.5 能不能用来回归? 回归树示例 References 说到决策树(Decision tree),我们很自然会想到用其做分类,每个叶子代表有限类别中 ...

  6. Deepin linux Compass.app安装

    compass.app是集成了sass的工具,安装完Compass就能够使用sass. 首先,上官网 可以看到官网上推荐的两种sass使用方式,application&command line ...

  7. SharePoint布局页创建(实战)

    分享人:广州华软 极简 一. 前言 SharePoint有母版页及布局页,母版页控制页面头部.底部,而布局页则控制页面中间内容区域.通过布局页,可以快速修改页面内容区域. SharePoint的页面布 ...

  8. solr搭建(linux)

    Solr版本:7.4.0 Tomcat版本:8.5 Jdk版本:1.8 最好在root用户下进行操作,为了更方便初学者理解,选用ubuntu操作,当然用命令操作过程是一样的,会命令操作的话看懂图形化操 ...

  9. Microsoft SQL Server 双机热备份,实时同步

    1.两台服务器,主服务器,从服务器,两台服务器都安装SQL Server 2008R2并且安装相同表结构的数据库(需要实时同步的数据库) 2.主服务器数据库安装完毕,打开SQL Server 配置管理 ...

  10. Windows Server 2016-批量设置用户下次登陆须更改密码

    Powershell设置某OU下所有用户下次登陆必须更改密码: Get-ADUser -Filter * -SearchBase "ou=syncall,dc=azureyun,dc=com ...