在Vue实例中每个组件之间都是相互独立的,都有自己的作用域,所以组件之间是不能直接获取数据。在项目开发中一个组件可能需要获取另一个组件的值,我们可以通过其他方法间接的获取。所以,获取的方法有以下几种:

1、父子组件之间通信:

1.1    父组件 → 子组件

父组件传值给子组件:通过自定义属性传值。

父组件:

<template>
<div class="home">
<p>这是Home页面</p>
<p>组件A页面:</p>
<button @click="commitVal">父组件传值给子组件</button>
<br /><br />
<!-- :commitVal是定义的属性-->
<com-a :commitVal='fatherVal'></com-a>
</div>
</template> <script>
import comA from '../components/comA.vue'
import comB from '../components/comB.vue'
export default{
components:{
'com-a':comA,
'com-b':comB,
},
data(){
return{
fatherVal:'aaa'
}
},
methods:{
commitVal(){
//这里点击 “父组件传值给子组件”按钮将值传递给子组件A
this.fatherVal='这是父组件传过来的值';
}
}
}
</script> <style>
</style>

子组件:

<template>
<div class="box-1">
这是组件一:{{data}}
{{requestData}}
</div>
</template> <script>
export default{
data(){
return{
data:10,
requestData:''
}
},
props:['commitVal'],
watch:{
//props中的 commitVal 就是来自父组件自定义的属性,这里通过监听将值转化为子组件A的值。
commitVal(newVal,oldVal){
this.requestData=this.commitVal;
}
}
}
</script> <style>
.box-1{
border: 1px solid lightsteelblue;
height: 100px;
}
</style>

结果:点击按钮后子组件页面获取到了父组件的值。

1.2    子组件 → 父组件:通过自定义方法。

父组件页面:

<template>
<div class="home">
<p>这是Home页面</p>
<p>组件A页面:</p>
<button @click="commitVal">父组件传值给子组件</button>
<br /><br />
<p>来自子组件的值:{{sonVal}}</p>
<!-- :commitVal是定义的属性-->
<!--requestSonData是自定义的方法,在requestMethod中获取子组件传过来的值-->
<com-a :commitVal='fatherVal' @requestSonData='requestMethod'></com-a>
</div>
</template> <script>
import comA from '../components/comA.vue'
import comB from '../components/comB.vue'
export default{
components:{
'com-a':comA,
'com-b':comB,
},
data(){
return{
fatherVal:'aaa',
sonVal:null
}
},
methods:{
commitVal(){
//这里点击 “父组件传值给子组件”按钮将值传递给子组件A
this.fatherVal='这是父组件传过来的值';
},
requestMethod(val){
console.log(val);
//将传过来的值转换成自己的值
this.sonVal=val.value;
}
}
}
</script> <style>
</style>

  子组件页面:

<template>
<div class="box-1">
这是组件一:{{data}}
{{requestData}}
<button @click="commitToFather">子组件传值给父组件</button>
</div>
</template> <script>
export default{
data(){
return{
data:10,
requestData:''
}
},
props:['commitVal'],
methods:{
commitToFather(){
//点击按钮时,通过$emit(val1,val2)去触发父组件自定义的方法requestSonData,顺便传一个obj过去,参数val1是方法名称,参数val2是需要传的值。
let obj={
title:'子组件的内容',
value:1111
}
this.$emit('requestSonData',obj)
}
},
watch:{
//props中的 commitVal 就是来自父组件自定义的属性,这里通过监听将值转化为子组件A的值。
commitVal(newVal,oldVal){
this.requestData=this.commitVal;
}
}
}
</script> <style>
.box-1{
border: 1px solid lightsteelblue;
height: 100px;
}
</style>

  结果:点击按钮时父组件页面获取到了子组件的值。

  1.3在父组件页面调用子组件页面的方法和获取其值

1.3.1在父组件页面调用子组件页面的方法:通过refs属性调用

父组件页面:

<template>
<div class="home">
<p>这是Home页面</p>
<p>组件A页面:</p>
<button @click="commitVal">父组件传值给子组件</button>
<button @click="getComaData">父组件页面调用子组件页面的方法</button>
<br /><br />
<p>来自子组件的值:{{sonVal}}</p>
<!-- :commitVal是定义的属性-->
<!--requestSonData是自定义的方法,在requestMethod中获取子组件传过来的值-->
<com-a :commitVal='fatherVal' @requestSonData='requestMethod' ref='coma'></com-a>
</div>
</template> <script>
import comA from '../components/comA.vue'
import comB from '../components/comB.vue'
export default{
components:{
'com-a':comA,
'com-b':comB,
},
data(){
return{
fatherVal:'aaa',
sonVal:null
}
},
methods:{
commitVal(){
//这里点击 “父组件传值给子组件”按钮将值传递给子组件A
this.fatherVal='这是父组件传过来的值';
},
requestMethod(val){
console.log(val);
//将传过来的值转换成自己的值
this.sonVal=val.value;
},
getComaData(){
//给子组件加上ref属性,可以通过 this.$refs.coma.getData()调用了,coma是自定义的属性名称。
console.log(this.$refs.coma.getData());
}
}
}
</script> <style>
</style>

子组件页面:

<template>
<div class="box-1">
这是组件一:{{data}}
{{requestData}}
<button @click="commitToFather">子组件传值给父组件</button>
</div>
</template> <script>
export default{
data(){
return{
data:10,
requestData:''
}
},
props:['commitVal'],
methods:{
commitToFather(){
//点击按钮时,通过$emit(val1,val2)去触发父组件自定义的方法requestSonData,顺便传一个obj过去,参数val1是方法名称,参数val2是需要传的值。
let obj={
title:'子组件的内容',
value:1111
}
this.$emit('requestSonData',obj)
},
//这里将值返回给调用的对象
getData(){
return '这是通过父组件页面调用的';
}
},
watch:{
//props中的 commitVal 就是来自父组件自定义的属性,这里通过监听将值转化为子组件A的值。
commitVal(newVal,oldVal){
this.requestData=this.commitVal;
}
}
}
</script>

  结果:

1.3.2在父组件页面获取子组件页面的值得另一种方法:通过refs属性获取

此方法类似于1.3.2的方法这里只展示部分代码:

this.$refs.coma.data; //10  获取到了子组件的值。

1.4在子组件页面如何获取父组件的中的值:通过$parent调用

父组件:只展示部分代码

getData(){
return '这是父组件的值'+this.fatherVal;
}

  子组件:

<button @click="getFather">调用父组件的方法</button>

getFather(){
console.log(this.$parent.getData());
}

  结果:

2、非父子组件的传值:可以通过子组件A将值传给父组件,父组件再将值传给子组件B,这样做很麻烦,我们可以借助中央事件总线($bus)来进行传值,$bus就像一个中间键。

main.js页面:新建一个vue空实例作为$bus挂载到原型链上。

     Vue.prototype.$bus=new Vue();
import Vue from 'vue'
import App from './App'
import router from './router'
import store from './store/index.js'
//将一个$bus挂载到vue实例的原型链上,在其它任何页面就可以直接使用了。
Vue.prototype.$bus=new Vue(); Vue.config.productionTip = false
new Vue({
el: '#app',
router,
store,
components: { App },
template: '<App/>'
})

  

组件A:

通过this.$bus.$emit()去触发 commitDataTo,同时自定义一个obj传过去。
<template>
<div class="box-1">
这是组件一:{{data}}
{{requestData}}
<!--<button @click="commitToFather">子组件传值给父组件</button>-->
<!--<button @click="getFather">调用父组件的方法</button>-->
<button @click="commitToB">传值给组件B</button>
</div>
</template> <script>
export default{
data(){
return{
data:10,
requestData:''
}
},
methods:{
commitToB(){
//通过this.$bus.$emit()去触发 commitDataTo,同时自定义一个obj传过去。
let obj={
title:'这是组件A传过来的值',
value:1111
}
this.$bus.$emit('commitDataTo',obj)
}
},
}
</script>

  组件B:

      通过this.$bus.$on()监听。

<template>
<div class="box-2">
这是组件二:{{data}}
这是组件一:{{valueOne}}
</div>
</template> <script>
export default{
data(){
return{
data:20,
valueOne:''
}
},
mounted(){
//通过this.$bus.$on监听commitDataTo,同时获取传过来的值。
this.$bus.$on('commitDataTo',(val)=>{
console.log(val);
this.valueOne=val.title;
});
},
methods:{
getDataTwo(){
console.log('组件二的值:'+this.data);
},
}, }
</script>

  结果:

  

 3、非父子组件之间方法的调用:

也是通过$bus.$emit和$bus.$on,将要调用的方法写在$bus.$on的回调方法里。

以上就是父子组件、非父子组件之间的传值和方法的调用。

vue中父子组件之间的传值、非父子组件之间的传值的更多相关文章

  1. Vue父子,子父,非父子组件之间传值

    Vue组件基础 纯属随笔记录,具体详细教程,请查阅vue.js网站 子组件给父组件传值: <body> <div id="app"> <my-app& ...

  2. vue 2 使用Bus.js进行兄弟(非父子)组件通信 简单案例

    vue2中废弃了$dispatch和$broadcast广播和分发事件的方法.父子组件中可以用props和$emit().如何实现非父子组件间的通信,可以通过实例一个vue实例Bus作为媒介,要相互通 ...

  3. vue中通过修改element-ui的类修改相关组件的样式

    可以在App.vue中的style中修改element-ui的样式. 注意:一定要在属性值后面加上 !important 使自己定义的css样式处于权重最高,不加的话在本地调试的时候是没有问题的,不过 ...

  4. Vue bus的使用(兄弟|非父子组件传值)-->可以使用一个空的Vue实例作为中央事件总线new Vue()

    1.在main.js中注册全局的bus  Vue.prototype.bus=new Vue(); 2.在组建中使用 子组建使用:this.bus.$emit('自定义事件名',data) metho ...

  5. vue 父子之间通信及非父子之间通信

    直接看图说话 vue Bus总线 import Vue from 'vue';import VueBus from 'vue-bus';Vue.use(VueBus); 这是子组件要发到父组件的写法 ...

  6. vue中,使用element ui的弹窗与echarts之间的问题

    今天项目中有个需求,就是在页面中点击一个图标,弹出一个抽屉式的弹窗(弹窗是element UI的抽屉),弹窗里边是echarts呈现的数据,当我直接用echarts的时候,报错dom没有获取到: 这就 ...

  7. 组件基础(非父子组件传值)—Vue学习笔记

    最近几天忙着写Api去了,抽空把后面的内容下出来,然后再分享给大家web可以使用的api. 上次说了父子组件直接的传值,这次看一下非父子组件之间的传值(总线机制) 要实现非父子组件之间的传值非常重要的 ...

  8. Vue组件通信之非父子组件传值

    前言: 如果想要了解非父子关系的组件传值,最好是在了解父传子和子传父的基础上在来了解非父子传值可能会有更透彻的思路. 因为非父子传值是通过定义事件总线来代理实现父传子+子传父从而实现的传值方式. 这是 ...

  9. Vue 非父子组件通信

    组件是Vue核心的一块内容,组件之间的通信也是很基本的开发需求.组件通信又包括父组件向子组件传数据,子组件向父组件传数据,非父子组件间的通信.前两种通信Vue的文档都说的很清楚,但是第三种文档上确只有 ...

  10. vue.js 创建组件 子父通信 父子通信 非父子通信

    1.创建组件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

随机推荐

  1. 七牛 qshell 全命令实践

    七牛API服务的命名行测试工具,参考文档 七牛开发者中心 命令行工具(qshell) 实践目的 安装 account 设置ak.sk stat 查看文件状态 buckets/listbucket/do ...

  2. 13、cookie

    一.cookie: 1.cookie cookie的应用: 1.用户名密码 自动登录 2.购物车商品的保存. <1>缓存信息,只存储特定的重要的信息.程序编程完成.缓存信息cookie技术 ...

  3. python语法_算数运算+赋值运算符+比较运算符+逻辑运算符

    算术运算符 + - * /  加减乘除 5/2 = 2.5 5//2 = 2  整除,地板除 5%2= 1 取余数 2**10 指数运算 2的10次方 算术优先级 无论多少级,都使用()小括号进行优先 ...

  4. How to enable Linux-PAM on uClinux

    By default the uClinux  uses the tools provided by busybox firstly. So the init login and passwd are ...

  5. Fiddler (进阶)内置命令与断点

    Fiddler 内置命令与断点 命令 对应请求项 介绍 示例 ? All 问号后边跟一个字符串,可以匹配出包含这个字符串的请求 ?google > Body 大于号后面跟一个数字,可以匹配出请求 ...

  6. openstack--部暑

    ##1.Centos7环境准备-- openstack pike ##1.Centos7环境准备-- openstack pike [https://blog.csdn.net/shiyu115775 ...

  7. 17.4-uC/OS-III消息管理(任务消息队列使用)

    任务消息队列跟任务信号量一样,均隶属于某一个特定任务, 不需单独创建,任务在则在, 只有该任务才可以接收这个任务消息队列的消息,其他任务只能给这个任务消息队列发送消息, 却不能接收.任务消息队列与(普 ...

  8. 如何知道网页浏览器cookie是什么?

    一直有网友问网页cookie如何获取,其实想知道自己访问网页时的cookie没那么难,用Chrome内核浏览器的debug功能就能看到,怎么查看呢?随ytkah一起来看看吧! 打开网页,按F12键,选 ...

  9. Cartographer源码阅读(7):轨迹推算和位姿推算的原理

    其实也就是包括两个方面的内容:类似于运动模型的位姿估计和扫描匹配,因为需要计算速度,所以时间就有必要了! 1. PoseExtrapolator解决了IMU数据.里程计和位姿信息进行融合的问题. 该类 ...

  10. Tomcat不加项目名称访问设置

    一.Tomcat不加项目名称访问设置 一.方法一:修改配置文件server.xml 1.修改配置文件server.xml <Host appBase="webapps" au ...