vue组件传值有以下几种情况: 父组件向子组件传值、子组件向父组件传值、兄弟组件之间传值等

一、父组件向子组件传值:

  传值方式: props

<father>
// 动态传递值
<son :data="msg"></son> // 子组件son
// 静态传值
<son2 data="这是传递静态值"></son2>
</father> // 父组件
<script>
export default {
data() {
msg: '向子组件传值'
} }
</script> // 子组件 -- son
<script>
export default {
props: {
msg: {
type: String, // 基础类型检查
required: true // 是否必传值
}
},
data() {
str: this.msg // 也可以将传递过来的值定义在data中
}
}
</script>

  1:prop的大小写: HTML中的attribute名对大小写不敏感,所以prop中的驼峰值需要等价于短横线命名;如果使用字符模板,就没有这个问题了

// 在HTML中
<component :my-data="data"></component> // 在props与之对应的为驼峰命名
props: ['myData']

  2:prop的类型:

// 官方给的例子
props: ['title', 'likes', 'isPublished', 'commentIds', 'author'] // 但是,通常希望每个prop都有指定的类型,这时,可以使用对象形式列出prop,这些property的名称和值分别是prop各自的名称和类型;
props: {
title: String,
likes: Number,
isPublished: Boolean,
comments: Array,
author: Object,
callback: Function,
contractPromise: Promise
}

  3: 单项数据流

  所有的prop都使得其父子之间形成一个单行向下行绑定:父组件的更新会向下流动到子组件中,但是反过来不行;当父组件更新时,子组件中所有的props都是最新值,所以不应该在子组件中更新props;

  两种常见的试图更改一个prop的情形:

    #这个prop用来传递一个初始值;这个子组件接下来希望将其作为一个本地的prop数据来使用:这种情况下,最好定义一个本地data property并将这个prop用做其初始值; 

props: ['data'],
data() {
return {
msg: this.data
}
}

    #这个prop以一种原始的值传入且需要进行转换:在这种情况下,最好使用这个prop的值来定义一个计算属性:

props:['size'],
// 计算属性
computed: {
normalizedSize: function() {
return this.size.trim().toLowerCase()
}
}

   注意:js中对象和数组是通过应用传入的,所以对于一个数组或者对象类型的prop来说,在子组件中改变变更这个对象或数组本身将会影响到父组件的值

  4: 其他详情参考官方文档

二、子组件向父组件传值:

  通过自定义事件传值;

// 通过 this.$emit()自定义事件触发
// ====== 子组件
<template>
<div>
<button @click="emitToFather">点击向父组件传值</button>
</div>
</template>
<script>
export default {
name: 'Son',
data() {
return {
msg: '向父组件传的值'
}
},
methods: {
emitToFather() {
// getDataFromSon 是自定义事件名
this.$emit('getDataFromSon', this.msg)
}
}
}
</script>
// ====== 父组件
<template>
<div>
// 事件名需要完全匹配才可以
<son @getDataFromSon="getDataFromSon"><son>
</div>
</template>
<script>
export default {
name: 'Father',
data() {},
methods: {
getDataFromSon(val) {
// val 就是从子组件传递过来的值
}
}
}
</script>

三、兄弟之间组件传值:

   通过eventBus或者vuex进行传值;

   vue没有直接子传子的方法,如果一定需要兄弟之间传参,可以先传到父组件,再传到子组件。  

// 通过eventBus(即通过on监听,emit触发的方式)
// eventBus.js 定义一个新的vue实例,专门用于传递数据,并导出
import Vue from 'vue'
export default new Vue() // 定义传递的方法名和传输内容,点击事件或钩子函数eventBus.emit事件
// componentA.vue
<template>
<div>
<button @click="emitToB">点击传递数据给兄弟组件B</button>
</div>
</template>
<script>
import eventBus from 'common/js/eventBus.js'
export default {
methods: {
emitToB() {
// 也可以在全局挂载eventBus即vue实例。通过this调用
eventBus.$emit('eventFromA', 'A传递给B组件的值') // 定义方法名和要传输的数据
}
}
}
</script>
// componentB
<template>
<div>{{ title }}</div>
</template>
<script>
import eventBus from 'common/eventBus.js'
export default {
data() {
return { title: '' }
},
mounted() { this.getEventData }, // 可以在created或者mounted钩子函数中调用
methods: {
getEventData() {
// 区分this指向那个vue实例
const that = this
// eventFromA是自定义的事件名和传递时保持一致
eventBus.$on('eventFromA', function(val) {
that.title = val // val 就是A组件传递过来的值
// this.title = val 此处this指向eventBus的vue实例
})
}
}
}
</script>

  # 大项目时使用vuex进行数据传递:详情:https://baijiahao.baidu.com/s?id=1618794879569468435&wfr=spider&for=pc

四、1:通过路由带参数进行传值

    A组件传值写法:this.$router.push({ path: '/componentB', query: { id: 2 } }) // 跳转到B

    B组件取值写法: this.$route.query.id

    注意:

    1:Vue路由导航有两种方法:声明式导航<router-link :to="...">和编程式导航 router.push(...)

    2:页面跳转有push和replace两种方式

    # this.$router.push(): 描述:跳转到不同的url这个方法会向history栈添加一个记录,点击后退会返回上一个页面

    #this.$touter.replace() 描述:同样是跳转到指定的url,但是这个方法不会向history栈中添加新的记录,点击返回,会跳转到上上一个页面,上一个记录是不会存在的。

    #this.$touter.go(n) 相对于当前页面向前或者向后跳转多少个页面,类似于window.history.go(n)

    3:传参的方式又分为查询参数query(+path) 和命名路由params(+name)两种方式:

     #命名路由搭配params,刷新页面会参数丢失;

     #查询参数搭配query,刷新页面数据不会丢失;

       接收参数使用this.$router后面就是搭配路由的名称就能获得取到的参数

  2:通过设置session Stroage缓存的形式进行传递

    两个组件A和B,在组件中设置缓存orderData

    const orderData = { 'orderData': 123 }

   sessionStorage.setItem('缓存名称', JSON.stringify(orderData))

    B组件就可以获取在A中设置的缓存了

    const dataB = JSON.parse(sessionStorage.getItem(‘缓存名称’))

五、.sync修饰符

  在有些情况下,我们可能需要对一个prop进行双向数据绑定,推荐使用update:myPropName的模式进行触发事件取而代之。

// 举个例子
在一个包含title prop的假设的组件中,我们可以用以下方法表达对其赋值的意图
this.$emit('update:title', newTitle)
// 为了方便起见,我们为这中模式提供一个缩写,即.sync修饰符
<text-document :title.sync='title'></text-document>

官方文档:https://cn.vuejs.org/v2/guide/components-props.html

Vue组件之间通信的更多相关文章

  1. 前端面试 vue 部分 (5)——VUE组件之间通信的方式有哪些

    VUE组件之间通信的方式有哪些(SSS) 常见使用场景可以分为三类: 父子通信: null 父向子传递数据是通过 props ,子向父是通过 $emit / $on $emit / $bus Vuex ...

  2. Vue 组件之间通信 All in One

    Vue 组件之间通信 All in One 组件间通信 1. 父子组件之间通信 https://stackblitz.com/edit/vue-parent-child-commutation?fil ...

  3. vue组件之间通信传值

    原文链接:https://blog.csdn.net/lander_xiong/article/details/79018737 我认为这位博主的这篇文章写的非常详细,通俗易懂, 我们这次的vue项目 ...

  4. vue组件之间通信总结(超详细)

    组件通信在我们平时开发过程中,特别是在vue和在react中,有着举足轻重的地位.本篇将总结在vue中,组件之间通信的几种方式: props.$emit $parent.$children $attr ...

  5. Vue组件之间通信的三种方式

    最近在看梁颠编著的<Vue.js实战>一书,感觉颇有收获,特此记录一些比价实用的技巧. 组件是MVVM框架的核心设计思想,将各功能点组件化更利于我们在项目中复用,这类似于我们服务端面向对象 ...

  6. vue组件之间通信的8种方式

    对于vue来说,组件之间的消息传递是非常重要的,下面是我对组件之间消息传递的常用方式的总结. props和$emit(常用) $attrs和$listeners 中央事件总线(非父子组件间通信) v- ...

  7. vue组件之间通信总结---点赞

    总结:父组件-->子组件 ①通过属性 步骤1: <son myName="michael" myPhone='123'></son> <son ...

  8. vue 组件之间通信

    父传子 **父组件代码** <template> <header-box :title-txt="showTitleTxt"></header-box ...

  9. 【Vue课堂】Vue.js 父子组件之间通信的十种方式

    这篇文章介绍了Vue.js 父子组件之间通信的十种方式,不管是初学者还是已经在用 Vue 的开发者都会有所收获.无可否认,现在无论大厂还是小厂都已经用上了 Vue.js 框架,简单易上手不说,教程详尽 ...

随机推荐

  1. Eclipse 从SVN检出项目之《文件夹 “” 已不存在 》

    1.eclipse 从svn检出项目 报文件夹不存在, 参考博客 https://blog.csdn.net/wenbsu/article/details/80965680 2.You need to ...

  2. Linux 安装jdk1.8

    Linux安装jdk1.8 总结一句话就是:下载jdk1.8 ==> 解压 ==> 配置环境变量. 一.  jdk的下载,这里有两种方法: 1.去Oracle官网下载. 2.jdk1.8的 ...

  3. 夏日葵电商:连锁零售店小程序o2o系统解决方案

    公众平台"附近小程序"功能上线后,一个主体账号可以同时绑定N+个门店,这对连锁零售店铺来说是重磅福利呀,无论你是通过搜索还是线下扫码进入小程序,线上与线下都完全贯通了,线上多种入口 ...

  4. 富文本编辑器CKeditor的配置和图片上传,看完不后悔

    CKeditor是一款富文本编辑器,本文将用极为简单的方式介绍一下它的使用和困扰大家很久的图片上传问题,要有耐心. 第一步:如何使用 1.官网下载https://ckeditor.com/ckedit ...

  5. 我的python学习记_03

    数据类型 python中的数据类型包括:1.数字类型number:整型int(即整数) 浮点型float(小数形式,整数的话后面加".0") 布尔型(判断正确与否) 复数型(com ...

  6. 【Android开发】Coding + git命令行基本使用

    上传代码 进入本地仓库的目录. cd ... 查看仓库链接 : git remote -v 如果没有,则添加url链接 : git remote add testName https://git.co ...

  7. 【001】学习前提——安装linux虚拟机,搭建docker

    1. 配置linux 1.1 修改配置 安装virtualbox的过程略过. 进入cd /etc/sysconfig/network-scripts,编辑:vi ifcfg-enp0s3 1>将 ...

  8. [ Vim ] 自动重载文件

    https://www.cnblogs.com/yeungchie/ 手动重载 :e 或者 :! 自动重载 set autoread 一般情况下,vim 切换缓冲区或者重新聚焦的时候会触发重载. 如果 ...

  9. 记录Jenkins升级到最新版遇到的问题

    ​ 首先吐槽一下Jenkins: 1.安装插件的时候无法根据Jenkins的版本号安装对应的插件! 2.安装插件安装版本不一致的时候无法降低插件版本! 3.为啥要我们升级到最新版! 一.升级原因 我的 ...

  10. 以ARM和RISC-V为内核的单片机写寄存器

    我以为这是个很简单的问题,没想到还有一些初学者不会.可能他们也是跟我一样是直接学的如何操作单片机并没有学微机原理么. ARM和RISC-V的机器的系统架构都是哈佛结构的,意思是程序存储器.数据存储器和 ...