Vue父子组件双向绑定详解

一、父子组件双向绑定

Vue的父子组件双向绑定是Vue中的一个非常核心的特性,它允许子组件可以通过prop接收父组件的数据并且能够在父组件中实现对子组件的响应数据更新。可以理解为:父组件向子组件传递props数据时,子组件能够实时知晓数据的变化。

//父组件代码
<template>
  <div>
    <child-component :message="parentMessage" @update-message="updateParentMessage"/>
  </div>
</template>

<script>
  import childComponent from './childComponent.vue';
  export default {
    components: {
      'child-component': childComponent 
    },
    data() {
      return {
        parentMessage: 'Hello, Vue!'
      }
    },
    methods: {
      updateParentMessage(msg) {
        this.parentMessage = msg 
      }
    }
  }
</script>

//子组件代码
<template>
  <div>
    <input v-model="childMessage"/>
    <button @click="updateParent">Update Parent</button>
  </div>
</template>

<script>
  export default {
    props: ['message'],
    data() {
      return {
        childMessage: ''
      }
    },
    methods: {
      updateParent() {
        //用于传递更新数据到父组件
        this.$emit('update-message', this.childMessage)
      }
    }
  }
</script>

上述代码中展示了一个比较基础的父子组件双向绑定的例子。父组件<div>中使用了<child-component>标签,通过:绑定的方式将父组件的parentMessage数据传递到子组件中,并且调用了updateParentMessage方法更新了父组件的数据。在子组件中使用v-model绑定message数据,配合updateParent方法通过$emit方法将子组件中的childMessage数据更新到父组件中。

二、Vue实现父子组件双向数据绑定

在Vue中实现父子组件双向数据绑定需要依靠在子组件中使用v-model并且父组件保持sync修饰符同步更新子组件数据的方式,同时也需要保证在更新父组件数据后,子组件能够及时响应并更新。

//父组件代码
<template>
  <div>
    <child-component :message.sync="parentMessage"/>
  </div>
</template>

<script>
  import childComponent from './childComponent.vue';
  export default {
    components: {
      'child-component': childComponent 
    },
    data() {
      return {
        parentMessage: 'Hello, Vue!'
      }
    }
  }
</script>

//子组件代码
<template>
  <div>
    <input v-model="message"/>
  </div>
</template>

<script>
  export default {
    props: ['message'],
    watch: {
      message(newVal) {
        this.$emit('update:message', newVal)
      }
    }
  }
</script>

上述代码实现了父子组件双向数据绑定。在父组件中通过:绑定的方式将parentMessage的值传递给子组件中的message,子组件使用v-model绑定message并且保证在数据变化后及时响应。在子组件的watch中监听message数据变化,并且通过$emit方法将更新后的数据通知给父组件。

三、Vue3父子组件双向绑定

在Vue3中实现父子组件双向数据绑定,需要使用v-model增强组件props,在父组件中使用v-model进行双向数据绑定。

//父组件代码
<template>
  <div>
    <child-component v-model:message="parentMessage"/>
  </div>
</template>

<script>
  import childComponent from './childComponent.vue';
  export default {
    components: {
      'child-component': childComponent 
    },
    data() {
      return {
        parentMessage: 'Hello, Vue 3!'
      }
    }
  }
</script>

//子组件代码
<template>
  <div>
    <input :value="message" @input="$emit('update:message', $event.target.value)"/>
  </div>
</template>

<script>
  export default {
    props: ['message']
  }
</script>

在Vue3中,使用v-model增强组件props,需要在子组件中增加value以及$emit方法。

四、Vue父子组件异步传值

父组件传递给子组件的数据,在某些场景下可能需要异步获取,这时候就可能出现一个问题:在子组件中接收到父组件的数据时,此时它的数据还不存在,需要在后面的某个时间点才会有。如果按照父子组件传值的常规方式,子组件获取不到父组件的数据,就会出现问题。

针对这个问题,Vue提供了一个双向数据绑定的修饰符.sync,也可以在Vue2中使用以及通过Vue3中的v-model实现。这个修饰符可以帮助我们在父子组件中实现异步的数据传递。

//父组件代码
<template>
  <div>
    <child-component :message.sync="data"/>
  </div>
</template>

<script>
  import childComponent from './childComponent.vue';
  export default {
    components: {
      'child-component': childComponent 
    },
    data() {
      return {
        data: null
      }
    },
    created() {
      this.getData().then(res => {
        this.data = res 
      })
    },
    methods: {
      getData() {
        return Promise.resolve('Hello, Vue!')
      }
    }
  }
</script>

//子组件代码
<template>
  <div>
    <input :value="message" @input="updateMessage"/>
  </div>
</template>

<script>
  export default {
    props: ['message'],
    methods: {
      updateMessage(event) {
        this.$emit('update:message', event.target.value)
      }
    }
  }
</script>

上述代码中展示了如何在父子组件中实现异步的数据传递。父组件在created中通过getData异步获取数据,并且在获取到数据后将数据更新到data中。在父组件中将message绑定到data上,子组件通过props接收message,并且使用v-model绑定message。在子组件中通过$emit方法,将输入框的值更新到message中,并通知父组件更新。

五、Vue父子组件销毁顺序

在Vue中,使用组件是非常频繁的,对于开发者而言,知道什么时候组件被销毁是很重要的。Vue中一般的组件销毁顺序是:子组件 -> 父组件 -> 父组件页面的其他部分。

在Vue的官方文档中,给出了一份更详细的组件销毁顺序:

  1. 调用beforeDestroy()
  2. 销毁子组件和它们对应的监听器和DOM元素
  3. 调用destroyed()
  4. 从父组件中删除占位符节点
  5. 调用beforeDestroy()
  6. 调用destroyed()

这里需要注意的是:在销毁子组件之前,会调用beforeDestroy()方法,子组件被销毁之后,又会调用一次beforeDestroy()和destroyed(),然后再销毁父组件。

六、Vue父子组件数据双向绑定

在Vue中,父子组件的双向数据绑定是非常方便的,可以通过prop和$emit方法实现。但是,在一些特殊场景下,双向数据绑定会带来一些问题,这时候可以使用计算属性实现父子组件数据双向绑定。

//父组件代码
<template>
  <div>
    <child-component :value="computedValue" @input="updateValue"/>
  </div>
</template>

<script>
  import childComponent from './childComponent.vue';
  export default {
    components: {
      'child-component': childComponent 
    },
    data() {
      return {
        parentValue: 'Hello, Vue!'
      }
    },
    computed: {
      computedValue: {
        get() {
          return this.parentValue
        },
        set(val) {
          this.parentValue = val
        }
      }
    },
    methods: {
      updateValue(val) {
        this.parentValue = val
      }
    }
  }
</script>

//子组件代码
<template>
  <div>
    <input :value="value" @input="$emit('input', $event.target.value)"/>
  </div>
</template>

<script>
  export default {
    props: ['value']
  }
</script>

上述代码中展示了如何通过计算属性实现父子组件双向数据绑定。在父组件中定义computedValue计算属性,并且在computedValue的get和set方法中分别将其关联到parentValue上。在父组件的<child-component>标签中绑定value(即父组件中的computedValue),并且通过@input事件将子组件中的值更新到父组件中。

七、Vue自定义组件实现双向绑定

在Vue中,自定义组件是非常重要、常用的组件类型。要实现自定义组件实现双向绑定,需要在组件内部使用v-model并且使用$emit方法将更新的数据从组件传递到父组件中。

//父组件代码
<template>
  <div>
    <custom-input v-model="parentValue"/>
  </div>
</template>

<script>
  import customInput from './customInput.vue';
  export default {
    components: {
      'custom-input': customInput 
    },
    data() {
      return {
        parentValue: 'Hello, Vue!'
      }
    }
  }
</script>

//子组件代码
<template>
  <div>
    <input :value="value" @input="$emit('input', $event.target.value)"/>
  </div>
</template>

<script>
  export default {
    props: ['value']
  }
</script>

上述代码中展示了如何通过自定义组件实现双向绑定。在父组件中使用<custom-input>标签,并且将v-model绑定到parentValue。在子组件中使用v-model绑定到value,并且通过$emit方法将input事件的值更新到父组件中。

八、Vue组件内部双向绑定

在Vue的组件中可以通过v-model实现组件内部双向数据绑定。

//组件

原创文章,作者:ZVAI,如若转载,请注明出处:https://www.506064.com/n/132621.html

(0)
ZVAIZVAI
上一篇 2024-10-03
下一篇 2024-10-03

相关推荐

  • Python 中的threading模块

    该模块提供以下管理线程的功能: 这是上一个教程的代码片段,我们将使用它来查看threading模块提供的各种功能。 该函数返回当前活动的Thread对象的数量。 import ti…

    编程 2024-10-03
  • cajshbdj7777(gjb7706)

    1、请说一下张海迪、邰丽华、洪战辉等人的事迹 2、少先队英雄模范人物 1991 年张海迪在做过癌症手术后,继续以不屈的精神与命运抗争,她开始学习哲学专业研究生课程。经过不懈的努力她…

  • Python安装OpenCV的步骤

    1. 介绍 OpenCV是一个强大的计算机视觉库,具有在许多应用程序中实现图像和视频处理的广泛应用。本文将介绍如何在Python中安装OpenCV库。 2. 正文 一、安装Pyth…

    编程 2024-10-04
  • Spring Security 6.0详解

    Spring Security是一种基于Spring框架的安全选项,在Spring Boot应用程序中支持对应用程序进行身份验证和授权。Spring Security 5.5.0于…

    编程 2024-10-04
  • 如何提高Linux终端命令行工具中输入的体验

    一、使用Tab键补全命令或路径 在使用Linux终端命令时,往往命令或路径很长,手动输入容易出错。此时使用Tab键可以自动补全命令或路径,极大地提高了输入命令或路径的效率。例如,在…

    编程 2024-10-04
  • 详解xlrd库

    一、xlrd简介 xlrd是一个Python库,用于读取Microsoft Excel(.xls文件)格式的电子表格数据。它提供了一种方便快捷的方式来访问Excel表格中的数据,还…

    编程 2024-10-04
  • 添加mysql数据库用户(sqlserver数据库添加用户)

    1、mysql怎么给数据库添加用户 2、mysql如何创建新用户 3、mysql如何创建新用户,例如创建一个sss 密码为123的用户 4、mysql怎样增加用户 5、如何添加my…

  • Python实现数据可视化

    随着大数据时代的展开,数据分析在各行各业中变得越来越重要。而数据可视化作为一种直观、直观的手段,正得到越来越多的重视。本文将介绍Python在数据可视化中的应用,包括绘制不同类型的…

    编程 2024-10-04
  • 关于西安碑林区php文件怎么运行的信息

    本文目录一览: 1、PHP是怎么运行的,PHP是运行 2、php文件怎么运行啊? 3、php文件怎么运行。 4、PHP文件是什么文件?怎么打开? PHP是怎么运行的,PHP是运行 …

    编程 2024-10-04
  • 网页目录树php,html 目录树

    本文目录一览: 1、php开发中,如何将开发目录已经存在的项目显示到zendstudio的目录树 2、用php做的网盘,网盘页面用的是js,但是登陆上之后,页面的目录树总是不显示,…

    编程 2024-10-04

发表回复

登录后才能评论