vue中子到父子之间的传值(props、ref、emit)
父子组件
//父组件
<template>
<div>
<h1>我是父组件!</h1>
<child></child>
</div>
</template>
<script>
import Child from '../components/child.vue'
export default {
components: {Child},
}
</script>
//我是子组件
<template>
<h3>我是子组件!</h3>
</template>
<script>
</script>
通过props传值
props属于单向绑定,只能父组件向子组件传值,不能反向
//静态传值:子组件通过props选项来声明一个自定义属性,通过父组件对标签的嵌套,就可以通过这个属性往子组件传递数据
//父组件
<template>
<div>
<h1>我是父组件!</h1>
<child message="我是子组件一!"></child> //通过自定义属性传递数据
</div>
</template>
<script>
import Child from '../components/child.vue'
export default {
components: {Child},
}
</script>
//子组件
<template>
<h3>{{message}}</h3>
</template>
<script>
export default {
props: ['message'] //声明一个自定义的属性
}
</script>
//动态传值:可以通过v-bind绑定props的自定义属性,可以是表达式、布尔值、对象等等任何类型的值
//父组件
<template>
<div>
<h1>我是父组件!</h1>
<child message="我是子组件一!"></child>
// 这是一个 JavaScript 表达式而不是一个字符串。
<child v-bind:message="a+b"></child>
// 用一个变量进行动态赋值。
<child v-bind:message="msg"></child>
</div>
</template>
<script>
import Child from '../components/child.vue'
export default {
components: {Child},
data() {
return {
a:'我是子组件二!',
b:112233,
msg: '我是子组件三!'+ Math.random()
}
}
}
</script>
//子组件
<template>
<h3>{{message}}</h3>
</template>
<script>
export default {
props: ['message']
}
</script>
通过ref实现通信:被用來給元素或子組件引用信息的,引用信息將會注冊在父組件的refs對象上
- 如果ref用在子组件上,指向的是组件实例,通过$ref可能获取在子组件定义的属性和方法
- 如果ref在普通dom元素上使用引用指向的就是dom元素,通过ref可以获取到该dom元素
// 父组件
<template>
<div>
<h1>我是父组件!</h1>
<child ref="msg"></child>
</div>
</template>
<script>
import Child from '../components/child.vue'
export default {
components: {Child},
mounted: function () {
console.log( this.$refs.msg);
this.$refs.msg.getMessage('我是子组件一!')
}
}
</script>
// 子组件
<template>
<h3>{{message}}</h3>
</template>
<script>
export default {
data(){
return{
message:''
}
},
methods:{
getMessage(m){
this.message=m;
}
}
}
</script>
// 通过ref='msg'可以将子组件child的实例指给ref,并且通过.msg.getMessage()调用到子组件的getMessage方法,将参数传递给子组件
prop和ref之间的区别
- prop着重于数据的传递,并不能调用子组件里的属性和方法。(最适合场景:创建文章组件)
prop的实现:
1、如果直接写a='b’格式传递的是字符串,动态数据获取用的是v-bind,一般无论是动态还是静态,我们都会采用:。
2、:msg=‘meat’,meat是变量;msg=‘meat’,meat是字符串,:msg="‘meat’",meat是字符串
3、子级不能直接改变父级的数据,如果要修改可以将父级的数据修改后赋值给子级的变量,可以使用data或者computed
2、ref 主要是在父组件中添加ref="child"属性、直接使用this.$refs.child.变量来改变子组件中的值。
子级向父级传递数据(借助于事件)
两者的区别
prop:更着重于父组件给子组件的数据传输、更加灵活和方便,但是弊端是:子组件太依赖于父组件(props是单向绑定的,即只能父组件向子组件传递,不能反向)。
$refs:更着重于索引定位到子组件。不是很灵活,但优势是可以和父组件完全的解耦,父组件只要在制定的方法中去操作子组件即可。