天天看点

vue中父子之间的传值

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對象上
  1. 如果ref用在子组件上,指向的是组件实例,通过$ref可能获取在子组件定义的属性和方法
  2. 如果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之间的区别

  1. 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:更着重于索引定位到子组件。不是很灵活,但优势是可以和父组件完全的解耦,父组件只要在制定的方法中去操作子组件即可。