- 父组件给子组件传值
-
在父组件中的子组件上绑定属性,在子组件里面接受传值(props)
-
传值、传对象、传方法
-
可在接受传值的时候,规定传值的类型
例1:父组件为APP.vue,子组件为Home.vue
App.vue:
<template>
<div id="app">
<div class="par_b">
<p>{{msg}}</p>
<v-home :title="toHome" :tobool="ishow" :tofun="getchild"></v-home>
</div>
</div>
</template>
<script>
import Home from './Components/Home.vue';
export default {
name: 'app',
components:{
'v-home':Home
},
data () {
return {
msg:"我是根组件",
toHome:"测试父组件和子组件的传值", //传值
ishow:true
}
},
methods:{
//传方法
getchild(){
console.log(1);
}
}
}
</script>
Home.vue:
<template>
<div id="home">
<p>{{msg}}</p>
<p>{{title}}</p>
<p>{{tobool}}</p>
</div>
</template>
<script>
export default {
name:'home',
props:{
//对于传来的值进行校验
'title':String,
'tobool':Boolean,
'tofun':Function
},
//基本方式
//props:['title','tobool','tofun'],
mounted(){
this.tofun();
},
data(){
return{
msg:"我是home组件"
}
}
}
</script>
总结:子组件可以通过props属性获取父组件传递的值和方法
- 子组件给父组件传值
问题一:
Q:父组件如何使用子组件里的属性和方法?
A:使用ref(ref获取虚拟dom元素节点,可在父组件里获取子组件里的整个对象,利用“对象.属性”和“对象.方法”进行使用)。因此在父组件中的子组件上定义ref属性,通过 this.$ refs.name.属性或this.$refs.name.方法
例2:在例1基础上
App.vue:
<template>
<div id="app">
<div class="par_b">
<p>{{msg}}</p>
<v-home ref="homedata" :title="toHome" :tobool="ishow" :tofun="getchild"></v-home>
<button @click="getchildMsg">获取home组件的属性和方法</button>
</div>
</div>
</template>
<script>
import Home from './Components/Home.vue';
export default {
name: 'app',
components:{
'v-home':Home,
},
data () {
return {
msg:"我是根组件",
toHome:"测试父组件和子组件的传值",
ishow:true
}
},
methods:{
getchild(){
console.log(1);
},
getchildMsg(){
//通过虚拟dom节点获取整个子组件对象
let homelist=this.$refs.homedata;
console.log(homelist);
}
}
}
</script>
问题二:
Q:子组件如何获取父组件的整个对象(子组件主动获取父组件的属性和方法)?
A:法一:在父组件中的子组件上定义:parent=“this” ,在子组件中通过props获取parent(类似于父组件给子组件传值,子组件通过props获取父组件传的值)
法二:子组件里直接获取父组件
使用this.$ parent.数据和this.$parent.方法
例3(法一):在例2基础上
App.vue:
<template>
<div id="app">
<div class="par_b">
<p>{{msg}}</p>
<v-home ref="homedata" :parent="this" :title="toHome" :tobool="ishow" :tofun="getchild"></v-home>
<button @click="getchildMsg">获取home组件的属性和方法</button>
</div>
</div>
</template>
<script>
import Home from './Components/Home.vue';
export default {
name: 'app',
components:{
'v-home':Home
},
data () {
return {
msg:"我是根组件",
toHome:"测试父组件和子组件的传值",
ishow:true
}
},
methods:{
getchild(){
console.log(1);
},
getchildMsg(){
//通过虚拟dom节点获取整个子组件对象
let homelist=this.$refs.homedata;
console.log(homelist);
}
}
}
</script>
Home.vue:
<template>
<div id="home">
<p>{{msg}}</p>
<p>{{title}}</p>
<p>{{tobool}}</p>
</div>
</template>
<script>
export default {
name:'home',
props:['title','tobool','tofun','parent'],
mounted(){
this.tofun();
console.log(this.parent.ishow);
},
data(){
return{
msg:"我是home组件"
}
}
}
</script>
例4(法二):在例2基础上
Home.vue:
<template>
<div id="home">
<p>{{msg}}</p>
<p>{{title}}</p>
<p>{{tobool}}</p>
</div>
</template>
<script>
export default {
name:'home',
props:['title','tobool','tofun'],
mounted(){
this.tofun();
console.log(this.$parent);
},
data(){
return{
msg:"我是home组件"
}
}
}
</script>
<style lang="scss">
</style>
- 非父组件之间传值
不建议使用子父间的传值,使用vue里面的全局广播,即事件的监听
例5:List.vue给Home.vue传值
-
建立一个与Home.vue同级的组件,名为List.vue ;
-
要做广播,需建一个全局文件(在src里新建一个名为Emit的文件夹,在该文件夹里新建一个名为Emit.js的文件);
-
在Emit.js里实例化vue对象;
-
将对象进行暴露。
整个vue环境里就一个new vue,这个new vue就是进行全局广播
Emit.js:
//实例化vue对象
//导入vue
import Vue from 'vue';
let emit=new Vue();
//将emit暴露出去
export default emit;
- 在哪里广播,在其上导入vue的全局对象;
import Emit from '../Emit/Emit.js'
注:广播和接收广播都需导入
- 在List.vue中触发广播;
List.vue:
<template>
<div id="list">
<p>{{msg}}</p>
<!--
List组件给Home组件传值 广播 (非父之间传值,这里的非父指两组件为同级关系)
-->
<button @click="sendhome">给home组件传值</button>
</div>
</template>
<script>
//导入vue的全局对象
import Emit from '../Emit/Emit.js';
export default {
name:'list',
data(){
return{
msg:"我是list组件",
tohome:"接受list广播"
}
},
methods:{
sendhome(){
//触发广播 tohomedata相当于事件,一种类型
Emit.$emit("tohomedata",this.tohome);
}
}
}
</script>
- 接收非父组件之间的广播传值
Home.vue:
<template>
<div id="home">
<p>{{msg}}</p>
</div>
</template>
<script>
import Emit from '../Emit/Emit.js';
export default {
name:'home',
mounted(){
//接收非父组件之间的广播传值 监听tohomedata
Emit.$on("tohomedata",(res)=>{
console.log(res);
});
},
data(){
return{
msg:"我是home组件"
}
}
}
</script>
- 传来的值需打印上去进行绑定
Home.vue:
<template>
<div id="home">
<p>{{msg}}</p>
<p>{{listdata}}</p>
</div>
</template>
<script>
import Emit from '../Emit/Emit.js';
export default {
name:'home',
mounted(){
//接收非父组件之间的广播传值 监听tohomedata
Emit.$on("tohomedata",(res)=>{
this.listdata=res;
});
},
data(){
return{
msg:"我是home组件",
listdata:null
}
}
}
</script>
例6(在例5的基础上):Home.vue给List.vue传值
- 在Home.vue中触发广播
Home.vue:
<template>
<div id="home">
<p>{{msg}}</p>
<p>{{listdata}}</p>
<button @click="sendtolist">给list组件广播</button>
</div>
</template>
<script>
import Emit from '../Emit/Emit.js';
export default {
name:'home',
mounted(){
//接收非父组件之间的广播传值 监听tohomedata
Emit.$on("tohomedata",(res)=>{
this.listdata=res;
});
},
data(){
return{
msg:"我是home组件",
tolist:"接受home广播",
listdata:null
}
},
methods:{
sendtolist(){
//触发广播
Emit.$emit("tolistdata",this.tolist);
}
}
}
</script>
- 接收非父组件之间的广播传值
List.vue:
<template>
<div id="list">
<p>{{msg}}</p>
<p>{{giveme}}</p>
<button @click="sendhome">给home组件传值</button>
</div>
</template>
<script>
import Emit from '../Emit/Emit.js';
export default {
name:'list',
data(){
return{
msg:"我是list组件",
tohome:"接受list广播",
giveme:null
}
},
mounted(){
Emit.$on("tolistdata",(res)=>{
this.giveme=res;
});
},
methods:{
sendhome(){
//触发广播 tohomedata相当于事件,一种类型
Emit.$emit("tohomedata",this.tohome);
}
}
}
</script>