在vue中实现父子组件数据的双向绑定实时更新

在Vue中有许多组件数据的绑定方法,但很多时候数据不能及时更新,这里介绍一种使用Vue的watch监听来实现双向绑定的方法。

这里以Vue2举例,Vue3也是差不多的写法

假设有父组件:

<template>
    <div>
        <SubComponent :prop.sync="FatherProp"/>
    </div>
</template>

<script>
import SubComponent from '.../your_path'
    components:{
        SubComponent
    },
    data(){
        return {
            FatherProp: "我是父组件的属性"
        }
    }
...
</script>

父组件通过:prop.sync向子组件传递值,sync允许子组件使用this.$emit来更新父组件的数据。

子组件:

<template>
    <div>
        子组件的值为: {{ inside_prop }}
    </div>
</template>

<script>
    name: "SubComponent",
    data(){
        inside_prop: "我是子组件内部属性";
    },
    props:{
        prop:{
            type: String,
            default: "这是外部属性没传时的默认值",
            required: false
        }
    },
    watch:{
        // 监听内部属性的变化
        inside_prop:{
            handler(inside_prop_new){
                // 将外部的属性更新
                this.$emit('update:prop',inside_prop_new);  
            },
            deep: true,
            immediate: true
        },
        
        // 监听外部属性的变化
        prop:{
            handler(outside_prop_new){
                // 更新内部的属性
                this.inside_prop = outside_prop_new;
            },
            deep: true,
            immediate: true
        }
    }
</script>

原理其实不难理解,Vue提供了sync的语法糖,在内部提供了一个临时类,它拥有公开的get和set方法,当临时数据的set方法被调用时,watch监听到set的调用,我们这时get拿到临时数据的新值,再调用内部自己的set方法去更新内部的属性。监听内部的set同理,这样就实现了一个双向绑定的作用。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue实现父子组件数据双向绑定可以通过props和$emit来实现。下面是一种常见的实现方式: 1. 在父组件,通过props将数据传递给子组件。在子组件,通过props接收父组件传递的数据。 2. 在子组件,通过在子组件的data选项定义一个与props同名的属性,用于接收父组件传递的数据。 3. 在子组件,通过在模板使用v-model指令将子组件的属性与父组件数据进行绑定。这样,当子组件的属性发生变化时,父组件数据也会相应地更新。 4. 在子组件,通过使用$emit方法触发一个自定义事件,并将子组件的属性作为参数传递给父组件。 5. 在父组件,通过在子组件标签上监听自定义事件,并在事件处理函数更新组件数据。 下面是一个示例代码: ```html <!-- 父组件 --> <template> <div> <p>父组件数据:{{ parentData }}</p> <child-component v-model="parentData"></child-component> </div> </template> <script> import ChildComponent from './ChildComponent.vue'; export default { components: { ChildComponent }, data() { return { parentData: '' }; } }; </script> <!-- 子组件 --> <template> <div> <input type="text" v-model="childData"> <button @click="updateParentData">更新组件数据</button> </div> </template> <script> export default { props: ['value'], data() { return { childData: this.value }; }, methods: { updateParentData() { this.$emit('input', this.childData); } } }; </script> ``` 在上述示例,父组件通过v-model将parentData与子组件的属性进行双向绑定。当子组件的输入框内容发生变化时,父组件的parentData也会相应地更新。而当点击子组件的按钮时,子组件会通过$emit方法触发一个名为input的自定义事件,并将子组件的属性childData作为参数传递给父组件。父组件通过监听该自定义事件,并在事件处理函数更新parentData,从而实现父子组件数据双向绑定
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值