首先写好父子组件
子组件:
<template>
<div class='son'>
<h3>我是子组件</h3>
</div>
</template>
父组件:
<template>
<div id="app">
<h1>我是app.vue</h1>
<h2>父传子的案例</h2>
<Son></Son>
</div>
<!-- 需求:在父组件中有一个数据:num,要传入给子组件,子组件将来得到num之后需要渲染到页面上,并且点击一个按钮,修改这个num的值-->
</template>
在父组件中引入子组件,并且在data定义一个属性num,就是我们需要的传入的值
<script>
//导入子组件
import Son from './components/son'
export default {
data(){
return {
num:0
}
},
components: {
Son,
}
}
</script>
在页面上把父组件的num值显示出来
<template>
<div id="app">
<h1>我是app.vue</h1>
<h2>父传子的案例</h2>
<div>父组件中的值:num:{{num}}</div>
<Son></Son>
</div>
</template>
为了容易看清楚,给父子组件加上边框
1,在父组件中给导入的子组件定义一个自定义属性(ftos),把num的赋值给这个属性,因为这里是动态传值,采用v-bind绑定,简写为:ftos='num'
<Son :ftos='num'></Son>
2,子组件在自己的页面通过props属性来接收,接受的时候是接收的自定义属性
<script>
export default {
props:['ftos']
}
</script>
也可以使用对象
props:{
ftos:{
type:number,
default:'默认值'
}
}
需求:在子组件定义一个按钮,点击让子组件的值加一,并且把子组件的num值再传给父组件
<button @click="changeNum">点我改变num的值:</button>
一个bug,不能在子组件对num的值进行修改,它只有权利使用,没有权利修改.因为vue有一个很重要的特性,叫做单向数据流特性
官方文档是这样解释的:
1,在子组件的data中定义一个属性(mynum),将从父组件接收来的值传给该属性,再在方法中,对mynum进行修改
<script>
export default {
props:['ftos'],
data(){
return {
mynum:''
}
},
created() {
this.mynum=this.ftos
},
methods: {
changeNum(){
this.mynum++
}
},
}
</script>
2,不能直接在子组件对num的值进行修改,只能通过子传父,把父组件的num的值改变,来达到效果
子传父,需要在子组件通过emit('事件名',参数)
methods: {
changeNum(){
this.mynum++
// 将this.mynum的值传给父组件
this.$emit('changefathernum',this.mynum)
}
}
3,父组件接收子组件传过来的值,通过定义一个方法接收
<Son @changefathernum='getNum' :ftos='num'></Son>
直接将子组件传递的值赋值给num
methods: {
getNum(value){
this.num=value
}
},
现在,点击按钮,就能实现需求了