欢迎光临散文网 会员登陆 & 注册

Vue从零开始总结27

2021-04-23 18:56 作者:忘魂儿  | 我要投稿

父传子,子传夫两个单独的功能我们已经实现了,那么有没有发现一个问题,如果我们在子组件里面动态绑定父组件,并更改它的值,父组件里面的数据时不变的,那么为了解决这个问题,我们先剖析一下解决方案的原理,然后再进行简化。

第一步:先搞定子组件内部数据双向绑定

老样子,先写模板

<template id="son">
 <div>
   <h2>{{sonnum1}}</h2>//父组件传过来的值
   <h2>{{sonNum1}}</h2>//子组件内部key
   <input type="text" :value="sonNum1" @input="inputnum1">
   <h2>{{sonnum2}}</h2>//父组件传过来的值

   <h2>{{sonNum2}}</h2>//子组件内部key

   <input type="text" :value="sonNum2" @input="inputnum2">
 </div>
</template>

第二步:确立父子关系,将父值传递给子值,然后再将props传过来的子值,赋初值给子组件的data中相应key。

//父

const app=new Vue({
   el:document.querySelector('#app'),
   data:{

//父组件中的
   num1:0,
   num2:1
}, components:{

//子
     cpn:{
       template: '#son',
       data(){

//子组件中的key
         return {
         sonNum1:this.sonnum1,
           sonNum2:this.sonnum2
         }
       },
       props:{

//接受父组件传递过来的值
         sonnum1:Number,
         sonnum2:Number
       },
       methods:{
         inputnum1(event){

//通过input事件,接受动态绑定过来的值。注意要保持前后一致,即都是sonNum1
         this.sonNum1=event.target.value
         }
         ,
         inputnum2(event){
         this.sonNum2=event.target.value
         }
       }
     }
 }
})

<div id="app">

//对应接收父组件传值
<cpn :sonnum1="num1" :sonnum2="num2"></cpn>
</div>

做到这儿效果如下:


第三步:改变的数据,以事件的形式,通过子组件里面的函数,发送给父组件

methods:{
 inputnum1(event){
 this.sonNum1=event.target.value//通过input事件传递过来的事件,获取其动态获取的value值并赋值给子组件data中的指定变量
   this.$emit('sendnum1',this.sonNum1)//将这个改变了的值,以事件sendnum1发送给父组件里指定函数

 }
 ,
 inputnum2(event){
 this.sonNum2=event.target.value
   this.$emit('sendnum2',this.sonNum2)
 }
}

第四步:在子组件标签行内书写自定义事件,并将这个事件指定到对应父组件函数内

<div id="app">
<cpn :sonnum1="num1" :sonnum2="num2" @sendnum1="changenum1" @sendnum2="changenum2"></cpn>
</div>

至此实现了,父子数据的相互绑定

效果如下:

通过input输入的默认为String类型

所以为了防止报错,就得进行类型转换

inputnum1(event){
this.sonNum1=parseInt(event.target.value)
 this.$emit('sendnum1',this.sonNum1)
}
,
inputnum2(event){
this.sonNum2=parseInt(event.target.value)
 this.$emit('sendnum2',this.sonNum2)
}


Vue从零开始总结27的评论 (共 条)

分享到微博请遵守国家法律