当前位置: 首页 > 编程日记 > 正文

vue通信、传值

一、通过路由带参数进行传值

①两个组件 A和B,A组件通过query把orderId传递给B组件(触发事件可以是点击事件、钩子函数等)
this.$router.push({ path: '/conponentsB', query: { orderId: 123 } }) // 跳转到B
②在B组件中获取A组件传递过来的参数
this.$route.query.orderId
 
二、通过设置 Session Storage缓存的形式进行传递
①两个组件A和B,在A组件中设置缓存orderData
const orderData = { 'orderId': 123, 'price': 88 }
 
sessionStorage.setItem('缓存名称', JSON.stringify(orderData))
 
②B组件就可以获取在A中设置的缓存了
const dataB = JSON.parse(sessionStorage.getItem('缓存名称'))
此时 dataB 就是数据 orderData
朋友们可以百度下 Session Storage(程序退出销毁) 和 Local Storage(长期保存) 的区别。
三、父子组件之间的传值
(一)父组件往子组件传值props
①定义父组件,父组件传递 number这个数值给子组件,如果传递的参数很多,推荐使用json数组{}的形式
②定义子组件,子组件通过 props方法获取父组件传递过来的值。props中可以定义能接收的数据类型,如果不符合会报错。
③假如接收的参数 是动态的,比如 input输入的内容 v-model的形式
注意:传递的参数名称 支持驼峰命名,下图 描述不正确(1.0是不支持的)
④父子组件传值,数据是异步请求,有可能数据渲染时报错
原因:异步请求时,数据还没有获取到但是此时已经渲染节点了
解决方案:可以在 父组件需要传递数据的节点加上  v-if false,异步请求获取数据后,v-if true
(二)、子组件往父组件传值,通过emit事件
四、不同组件之间传值,通过eventBus(小项目少页面用eventBus,大项目多页面使用 vuex)
①定义一个新的vue实例专门用于传递数据,并导出
②定义传递的方法名和传输内容,点击事件或钩子函数触发eventBus.emit事件
③接收传递过来的数据
注意:enentBus是一个另一个新的Vue实例,区分两个this所代表得vue实例
五、vuex进行传值
为什么使用vuex?
vuex主要是是做数据交互,父子组件传值可以很容易办到,但是兄弟组件间传值(兄弟组件下又有父子组件),或者大型spa单页面框架项目,页面多并且一层嵌套一层的传值,异常麻烦,用vuex来维护共有的状态或数据会显得得心应手。
需求:两个组件A和B,vuex维护的公共数据是 餐馆的名称 resturantName,默认餐馆名称是 飞歌餐馆,那么现在A和B页面显示的就是飞歌餐馆。如果A修改餐馆名称 为 A餐馆,则B页面显示的将会是 A餐馆,反之B修改同理。这就是vuex维护公共状态或数据的魅力,在一个地方修改了数据,在这个项目的其他页面都会变成这个数据。
         
①使用 vue-cli脚手架工具创建一个工程项目,工程目录,创建组件A和组件B路由如下:
路由如下:
import Vue from 'vue'
import Router from 'vue-router'
import componentsA from '@/components/componentsA'
import componentsB from '@/components/componentsB'
 
Vue.use(Router)
 
export default new Router({
   mode: 'history',
    routes: [
        {
        path: '/',
        name: 'componentsA',
        component: componentsA
        },
        {
            path: '/componentsA',
            name: 'componentsA',
            component: componentsA
        },
        {
            path: '/componentsB',
            name: 'componentsB',
            component: componentsB
        }
    ]
})
app.vue
<template>
  <div id="app">
    <router-view/>
  </div>
</template>
 
<script>
export default {
  name: 'App'
}
</script>
 
<style>
#app {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>
②开始使用vuex,新建一个 sotre文件夹,分开维护 actions mutations getters
②在store/index.js文件中新建vuex 的store实例
*as的意思是 导入这个文件里面的所有内容,就不用一个个实例来导入了。
import Vue from 'vue'
import Vuex from 'vuex'
import * as getters from './getters' // 导入响应的模块,*相当于引入了这个组件下所有导出的事例
import * as actions from './actions'
import * as mutations from './mutations'
 
Vue.use(Vuex)
// 首先声明一个需要全局维护的状态 state,比如 我这里举例的resturantName
const state = {
    resturantName: '飞歌餐馆' // 默认值
    // id: xxx  如果还有全局状态也可以在这里添加
    // name:xxx
}
 
// 注册上面引入的各大模块
const store = new Vuex.Store({
    state,    // 共同维护的一个状态,state里面可以是很多个全局状态
    getters,  // 获取数据并渲染
    actions,  // 数据的异步操作
    mutations  // 处理数据的唯一途径,state的改变或赋值只能在这里
})
 
export default store  // 导出store并在 main.js中引用注册。
③actions
// 给action注册事件处理函数。当这个函数被触发时候,将状态提交到mutations中处理
export function modifyAName({commit}, name) { // commit 提交;name即为点击后传递过来的参数,此时是 'A餐馆'
    return commit ('modifyAName', name)
}
export function modifyBName({commit}, name) {
    return commit ('modifyBName', name)
}
 
// ES6精简写法
// export const modifyAName = ({commit},name) => commit('modifyAName', name)
④mutations
// 提交 mutations是更改Vuex状态的唯一合法方法
export const modifyAName = (state, name) => { // A组件点击更改餐馆名称为 A餐馆
    state.resturantName = name // 把方法传递过来的参数,赋值给state中的resturantName
}
export const modifyBName = (state, name) => { // B组件点击更改餐馆名称为 B餐馆
    state.resturantName = name
}
⑤getters
// 获取最终的状态信息
export const resturantName = state => state.resturantName
⑥在main.js中导入 store实例
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'
import store from './store'
 
Vue.config.productionTip = false
 
/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  store,  // 这样就能全局使用vuex了
  components: { App },
  template: '<App/>'
})
 
④在组件A中,定义点击事件,点击 修改 餐馆的名称,并把餐馆的名称在事件中用参数进行传递。
 
...mapactions 和 ...mapgetters都是vuex提供的语法糖,在底层已经封装好了,拿来就能用,简化了很多操作。
其中...mapActions(['clickAFn']) 相当于this.$store.dispatch('clickAFn',{参数}),mapActions中只需要指定方法名即可,参数省略。
...mapGetters(['resturantName'])相当于this.$store.getters.resturantName
<template>
  <div class="componentsA">
      <P class="title">组件A</P>
      <P class="titleName">餐馆名称:{{resturantName}}</P>
      <div>
            <!-- 点击修改 为 A 餐馆 -->
          <button class="btn" @click="modifyAName('A餐馆')">修改为A餐馆</button>
      </div>
      <div class="marTop">
          <button class="btn" @click="trunToB">跳转到B页面</button>
      </div>
  </div>
</template>
 
<script>
import {mapActions, mapGetters} from 'vuex'
export default {
  name: 'A',
  data () {
    return {
    }
  },
  methods:{
      ...mapActions( // 语法糖
          ['modifyAName'// 相当于this.$store.dispatch('modifyName'),提交这个方法
      ),
      trunToB () {
          this.$router.push({path: '/componentsB'}) // 路由跳转到B
      }
  },
  computed: {
      ...mapGetters(['resturantName']) // 动态计算属性,相当于this.$store.getters.resturantName
  }
}
</script>
 
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
    .title,.titleName{
        color: blue;
        font-size: 20px;
    }
    .btn{
        width: 160px;
        height: 40px;
        
        border: none;
        outline: none;
        color: #ffffff;
        border-radius: 4px;
    }
    .marTop{
        margin-top: 20px;
    }
</style>
    B组件同理
<template>
  <div class="componentsB">
      <P class="title">组件B</P>
      <P class="titleName">餐馆名称:{{resturantName}}</P>
      <div>
          <!-- 点击修改 为 B 餐馆 -->
          <button class="btn" @click="modifyBName('B餐馆')">修改为B餐馆</button>
      </div>
      <div class="marTop">
          <button class="btn" @click="trunToA">跳转到A页面</button>
      </div>
  </div>
</template>
 
<script>
import {mapActions, mapGetters} from 'vuex'
export default {
  name: 'B',
  data () {
    return {
    }
  },
  methods:{
      ...mapActions( // 语法糖
          ['modifyBName'// 相当于this.$store.dispatch('modifyName'),提交这个方法
      ),
      trunToA () {
          this.$router.push({path: '/componentsA'}) // 路由跳转到A
      }
  },
  computed: {
      ...mapGetters(['resturantName']) // 动态计算属性,相当于this.$store.getters.resturantName
  }
}
</script>
 
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
    .title,.titleName{
        color: red;
        font-size: 20px;
    }
    .btn{
        width: 160px;
        height: 40px;
        
        border: none;
        outline: none;
        color: #ffffff;
        border-radius: 4px;
    }
    .marTop{
        margin-top: 20px;
    }
</style>

转载于:https://www.cnblogs.com/fanningwen/p/10277199.html

相关文章:

C++ 技能树(持续更新)

相关xmind的原始文件已上传至mind-Mapping github,如有需要可自行下载&#xff0c;欢迎批评指正 关于分布式存储的整体技能的学习历程 可以参考分布式存储技能图谱&#xff0c;仅为个人的技能学习框架

(转)小小的研究了一下linux下的”注册表“ gconf-editor

最近学习linux&#xff0c;刚上手gedit&#xff0c;首先要解决的一定是编码的问题&#xff0c;总结一下方法&#xff0c;思路有下&#xff1a; 一.用图形化界面设置的方法 运行gconf-editor&#xff0c;在弹出的对话框中选择&#xff1a;/apps/gedit-2/preferences/encodings/a…

计算机技术在石油中的应用,计算机技术在石油工程中的应用.doc

1.1计算机技术在石油工程领域中的应用1.计算机模拟技术在钻探上的应用首先&#xff0c;石油钻井工程是一项高投入、高风险的地下隐蔽工程&#xff0c;其地下情况的模糊性和不确定性&#xff0c;给钻井作业带来了极大风险&#xff0c;影响着勘探效益。因此&#xff0c;准确地预测…

概率链接nbu 2416 奇怪的散步

题记&#xff1a;写这篇博客要主是加深自己对概率链接的认识和总结实现算法时的一些验经和训教&#xff0c;如果有错误请指出&#xff0c;万分感谢。 标题链接&#xff1a;http://acm.nbu.edu.cn/v1.0/Problems/Problem.php?pid2416 标题粗心&#xff1a; 有一个色子&#xff…

Spring AOP无法拦截内部方法调用-- expose-proxy=true用法

假设一个接口里面有两个方法&#xff1a; package demo.long;public interface CustomerService { public void doSomething1(); public void doSomething2(); } 接口实现类如下&#xff1a; package demo.long.impl;import demo.long.CustomerService; public class Custo…

HDD工作原理 导图

以上导图介绍了我们使用的 (HDD)机械硬盘的基本构造以及核心工作原理&#xff0c;对于大家扫盲有所帮助 参考文档&#xff1a; https://blog.csdn.net/yizhaoxin/article/details/53615740

计算机专业口号16字,计算机专业16口号

计算机专业&#xff0c;我们学校要弄运动会&#xff0c;求霸气口号计算机系齐心协力!! 力争上游!! 永不言弃!! 心系X班&#xff0c;合作无间&#xff0c;力斩群敌&#xff0c;舍我其谁 . 凌云赛场,斗志昂扬.文韬武略,笑傲群芳.利剑出鞘,倒海翻江 友谊第一、比赛第二 赛出风格、…

检测实现OpenCV2.4.4实现Shi-Tomasi角点检测(goodFeaturesToTrack)

最近研究检测实现&#xff0c;稍微总结一下&#xff0c;以后继续补充&#xff1a; #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> #include <stdio.h> #include <stdlib.h>using…

autoLayout

第一次使用自动布局&#xff0c;记录下来,或许以后用第三方用不到这个&#xff0c;但是第一次接触VFL语言。 一个按钮&#xff0c;不论横竖屏&#xff0c;都要在屏幕底部。 UIView *bottomV [[UIView alloc]init]; bottomV.backgroundColor [UIColor whiteColor];[bottomV se…

复制图片的一部分

// 复制图片的一部分 procedure TForm1.Button1Click(Sender: TObject);var Bitmap: TBitmap; MyRect: TRect;begin MyRect : Rect(10,10,100,100);//定义复制范围 Bitmap : TBitmap.Create; //生成Bitmap对象 Bitmap.LoadFromFile(1.bmp); Form1.Canvas.BrushCopy(MyRec…

计算机rsnge指令,计算机二级office Excel 函数复习重点

原标题&#xff1a;计算机二级office Excel 函数复习重点计算机二级来袭&#xff01;近期&#xff0c;计算机二级考试即将开始&#xff0c;小编在这里为大家奉上众多难点中的一个考点的详解——《excel函数的应用》&#xff0c;希望能为您的考试锦上添花。常用的逻辑函数1、求和…

tag标签[置顶] 高级NFC

最近朋友几篇文章分析了改tag标签的文章. 关联文章的地址 文章译自&#xff1a;Advanced NFC 本文档分析了高级NFC&#xff0c;如与各种标签技术协作&#xff0c;NFC标签写入和前台调度&#xff0c;它答应应用程序在前台处置的intent&#xff0c;即使当其他应用程序过滤器雷同…

python中类的约束和限制对象添加属性

通过__slots__限制对象可添加的属性 class A:__slots__ [a, b]passa1 A() a1.a 10 print(a1.a) a1.c 0 # 只能添加a&#xff0c;b属性添加其他属性就报错 没有约束 class Alipay:def pay(self, money):print(此次消费%s % money)class QQpay:def pay(self, money):print…

CEPH核心理论 相关导图(持续更新)

围绕分布式存储(ceph)绘制的技能图谱可参考分布式存储ceph 技能图谱 相关的原始编辑文件可以从github-mindMapping下载 如有缺失、不足之处欢迎指正 CEPH架构 关于系统架构&#xff0c;这里主要是将CEPH融入操作系统架构之中 且是根据L版本进行绘制的 关于文件系统 &#xff1…

Newtonsoft.Json文件错误

今天&#xff0c;在一个项目中使用signalR&#xff0c;由于项目框架是.net 4.0,所以用signalR1.0版本&#xff0c;signalR使用需要newtonsoft.Json文件&#xff0c;它把原 newtonsoft.Json文件覆盖了&#xff0c;所以程序运行时出现如下错误&#xff1a; “ 未能加载文件或程…

提花原理与计算机,电脑提花袜的设计原理与方法:提花女袜

全电脑单针筒袜机生产提花袜&#xff0c;运用计算机辅助设计系统进行袜子的花型图案及编织程序设计。文章介绍了提花袜的组织结构设计与提花编织原理及花型设计与编辑的方法。   Jacquard hosiery has been produced on the computerized hosiery machine with single cylind…

linux网络虚拟化

地址&#xff1a;http://blog.kghost.info/2013/03/01/linux-network-emulator/安装ip netns命令&#xff1a;#yum instal -y *netns*另附一个地址&#xff1a;http://crpppc19.epfl.ch/cgi-bin/man/man2html?ip-netns8转载于:https://blog.51cto.com/kernal/1540612

Linux内存管理:bufferCache和PageCache

参考文档&#xff1a; https://zhuanlan.zhihu.com/p/42364591 https://zhuanlan.zhihu.com/p/32354613 《深入理解Linux 内核》

mfc 开启指定服务器,用MFC实现消息的发送和接收(含服务器)

《用MFC实现消息的发送和接收(含服务器)》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《用MFC实现消息的发送和接收(含服务器)(33页珍藏版)》请在人人文库网上搜索。1、精品好资料学习推荐新建WClient工程基于对话框OK&#xff0c;直接Finish界面制作我们需要三个按…

Web Api学习一

接触WebApi读的第一篇文章&#xff1a; ASP.NET Web API&#xff08;一&#xff09;&#xff1a;使用初探&#xff0c;GET和POST数据 实践过程中&#xff0c;用的Fiddler模拟Post请求时收到的对象总是为空null 解决&#xff1a;将文章中的内容改为了如下&#xff1a; User-Agen…

HTML5十五大新特性

HTML5想必大家都很熟悉了。然而&#xff0c;你能准确地说出HTML5带来了哪些新特性吗&#xff1f;本文总结了HTML5带来的15项你必须知道的新特性。一起来看下&#xff1a;1.新的文档类型 (New Doctype)目前许多网页还在使用XHTML 1.0 并且要在第一行像这样声明文档类型&#xf…

[THUWC2017]随机二分图

题目大意 给一张二分图&#xff0c;有左部点和右部点。 有三种边&#xff0c;第一种是直接从左部点连向右部点&#xff0c;出现概率为50%。 第二种边一组里有两条边&#xff0c;这两条边同时出现或者不出现&#xff0c;概率都是50%。 第三种边一组里有两条边&#xff0c;这两条…

Eclipse问题集锦

1、SDK版本过低的问题。 现象&#xff1a; 更新SDK后&#xff0c;每次进入Eclipse&#xff0c;都会提示说需要23.0.0版本的SDK&#xff0c;当前的22.6.0版本的SDK版本过低&#xff1b;然而&#xff0c;确认更新后&#xff0c;结果却是说没有任何更新的东东。 解决办法&#xff…

渥太华大学计算机硕士课程,渥太华大学计算机工程专业解析

本课程以扎实的传统工程技术为基础&#xff0c;涵盖计算机软硬件设计的多个不同方面&#xff0c;并可对基于微处理器的系统、计算机体系结构、编程概念、实时操作系统、软件工程和机器人技术进行更专业的研究。这个项目提供了多种职业发展途径。强制一年级的课程:化学原理gng11…

博弈最高位POJ 1704(Georgia and Bob-Nim博弈)

新手发帖&#xff0c;很多方面都是刚入门&#xff0c;有错误的地方请大家见谅&#xff0c;欢迎批评指正 Georgia and BobTime Limit: 1000MS Memory Limit: 10000KTotal Submissions: 6341 Accepted: 1826Description Georgia and Bob decide to play a self-invented game. Th…

用Python深入理解跳跃表原理及实现

最近看 Redis 的实现原理&#xff0c;其中讲到 Redis 中的有序数据结构是通过跳跃表来进行实现的。第一次听说跳跃表的概念&#xff0c;感到比较新奇&#xff0c;所以查了不少资料。其中&#xff0c;网上有部分文章是按照如下方式描述跳跃表的&#xff1a; 这种描述便于理解&am…

Linux进程管理:进程状态和CPU平均负载

常见的linux进程状态如下&#xff1a; 关于源文件xmid&#xff0c;可以从Mind-Mapping获取 这里借助进程状态来描述一下linux系统中的平均负载的概念 当我们感觉到系统变慢时&#xff0c;通常通过top和uptime命令来了解系统的负载情况 [rootpub-ncpu-ndb0 ~]# uptime21:06:13…

poj2420A Star not a Tree?(模拟退火)

链接 求某一点到其它点距离和最小&#xff0c;求这个和&#xff0c;这个点 为费马点。 做法&#xff1a;模拟退火 1 #include <iostream>2 #include<cstdio>3 #include<cstring>4 #include<algorithm>5 #include<stdlib.h>6 #include<vector&…