在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. linux软链接的创建、删除和更新

    大家都知道,有的时候,我们为了省下空间,都会使用链接的方式来进行引用操作.同样的,在系统级别也有.在Windows系列中,我们称其为快捷方式,在Linux中我们称其为链接(基本上都差不多了,其中可能有 ...

  2. Nestjs OpenAPI(Swagger)

    官方文档 用来描述api

  3. linux操作2

    第2天 linux操作系统的目录结构 bin   #可执行程序的安装目录,命令boot #系统启动引导目录dev #设备目录,deviceetc #软件配置文件目录home #用户的家目录lib #系 ...

  4. macOS Sierra上面的php开发环境安装

    本文参考资料: 启动apache时,解决  How to Fix AH00558 and AH00557 httpd apr_sockaddr_info_get() Error Message     ...

  5. 让wampserver2.5.exe支持sql server数据库的方法

    将D:\wamp\bin\php\php5.5.12\ext路径下 这两个文件复制到php.ini中 链接数据库方法 <?php $serverName = "."; $co ...

  6. maven如何单独启动插件目标

    说来恼火,在网上找了半天没找到 原来插件名称其实不需要定义而是直接想象到的,如下,我尝试过了好几种 mvn plugin:goal 都没成功:从代码看goal已经没啥疑问了,就是compile,但哪个 ...

  7. 关于js执行机制的理解

    js是单线程语言.指的是js的所以程序执行通过仅有的这一个主线程来执行. 但是还有辅助线程,包括定时器线程,ajax请求线程和事件线程. js的异步我理解的是: 主线程执行时候,从上到下依次执行,遇到 ...

  8. sshfs远程挂载

    一.什么是 SSHFSSSHFS(Secure SHell FileSystem)是一个客户端,可以让我们通过 SSH 文件传输协议(SFTP)挂载远程的文件系统并且在本地机器上和远程的目录和文件进行 ...

  9. SVN和Git对比梳理

    在日常运维工作中,经常会用到版本控制系统,目前用到最广泛的版本控制器就是SVN和Git,那么这两者之间有什么不同之处呢?SVN(Subversion)是集中式管理的版本控制器,而Git是分布式管理的版 ...

  10. SQL基础语法提纲

    一.SQL需知5点 1.SQL是Structured Query Language的缩写,是用来访问关系型数据库的,非过程化的,高级编程语言. 2.SQL具有语法高度综合统一,高度的非过程化,对集合进 ...