vue中使用watch实现父子组件双向绑定

在子组件中使用watch进行双向绑定

  1. 先实现父组件向子组件传值,子组件使用props进行数据的接收
  2. 因为Vue规定props中的数据不能随意改动,所以需要将props中的数据本地化,具体方法是在data中定义新属性,将props中的数据赋值给新属性
    props:{
      number: Number  
    },
    data(){
        return{
            childNum: this.number
        }
    }    
    
  3. v-model对新属性实现双向绑定,并用watch属性监听新属性的变化,最后将变化后的值广播给父组件
    <input type="text" v-model='childNum' />
    
    watch:{
        childNum(newValue){
            this.$emit('numchanged', this.childNum)
        }
    }
    
  4. 父组件在引用子组件的地方进行监听,并自定义方法接收子组件传来的数据,从而实现父子组件双向绑定
    <cpn :number=num @numchanged='numchanged' />
    
     methods: {
         numchanged(value){
           this.num = parseFloat(value);
         }
       }
    

完整代码:

  <div id="app">
    <cpn :number=num @numchanged='numchanged' />
  </div>

  <template id='cpn'>
    <div>
      <h2>父组件传过来的值:{{number}}</h2>
      <p>子组件自定义属性接收父组件的值:{{childNum}}</p>
      <input type="text" v-model='childNum' />
    </div>
  </template>
    const child = {
      template: '#cpn',
      props: {
        number: Number,
      },
      data(){
        return{
          childNum: this.number,
        }
      },
      watch: {
        childNum(newValue){
          this.$emit('numchanged', this.childNum)
        }
      }
    }


    const vm = new Vue({
      el: '#app',
      data: {
        num: 100,
      },
      methods: {
        numchanged(value){
          this.num = parseFloat(value);
        }
      },
      components: {
        'cpn': child
      }
    })
Vue 父子组件之间可以通过 props 和 events 实现数据的双向绑定。具体的步骤如下: 1. 在父组件定义一个数据,并将其作为 props 传递给子组件: ```vue <template> <div> <child-component :message="message" @update-message="updateMessage"></child-component> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { message: '' }; }, methods: { updateMessage(value) { this.message = value; } } }; </script> ``` 2. 在组件使用 props 接收父组件传递的数据,并使用 $emit 方法触发一个自定义的事件来通知父组件更新数据: ```vue <template> <div> <input type="text" v-model="childMessage" @input="updateParentMessage"> </div> </template> <script> export default { props: ['message'], data() { return { childMessage: this.message }; }, methods: { updateParentMessage() { this.$emit('update-message', this.childMessage); } }, watch: { message(newValue) { this.childMessage = newValue; } } }; </script> ``` 在上述示例,父组件通过 :message="message" 将自己的 message 数据以 props 的方式传递给子组件组件接收到这个父组件的 message 数据后,使用 v-model 绑定到一个本地的 childMessage 变量上。当组件的输入框内容发生变化时,通过 @input 事件触发 updateParentMessage 方法,该方法使用 $emit 触发自定义事件 'update-message' 并将组件的 childMessage 数据作为参数传递给父组件。父组件接收到这个事件后,触发 updateMessage 方法来更新自己的 message 数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值