Vue3中父子传参常见方式及用法

 更新时间:2024年01月02日 14:50:16   作者:我胡为喜呀  
在 Vue 3 中,父子组件之间进行通信有多种方式,下面简单介绍下常见的方式及其用法和使用场景,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧

在 Vue 3 中,父子组件之间进行通信有多种方式,下面简单介绍下常见的方式及其用法和使用场景:

一、Props

用于父组件向子组件传递数据。
这是最基本也是最常用的一种方式。通过在子组件上定义 props,父组件可以将数据传递给子组件。在子组件中,通过 props 对象访问这些属性。
父组件

<template>
  <ChildComponent :message="parentMessage" />
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
  components: {
    ChildComponent,
  },
  data() {
    return {
      parentMessage: 'Hello from parent!',
    };
  },
};
</script>

子组件

<template>
  <div>{{ message }}</div>
</template>
<script>
export default {
  props: {
    message: String,
  },
};
</script>

二、v-model

用于在父子组件之间实现双向绑定。在 Vue 3 中,通过 v-model 方式进行组件通信需要使用 v-model 指令和 emit 事件。父组件使用 v-model 向子组件传递数据,并通过子组件触发 ,用update:modelValue 事件来实现双向绑定。
下面是一个简单的例子:
子组件

<!-- ChildComponent.vue -->
<template>
  <input :value="message" @input="$emit('update:modelValue', $event)" />
</template>
<script>
export default {
  props: {
    modelValue: String,
  },
  computed: {
    message: {
      get() {
        return this.modelValue;
      },
      set(value) {
        this.$emit('update:modelValue', value);
      },
    },
  },
};
</script>

父组件

<!-- ParentComponent.vue -->
<template>
  <ChildComponent v-model="parentMessage" />
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
  components: {
    ChildComponent,
  },
  data() {
    return {
      parentMessage: 'Hello from parent!',
    };
  },
};
</script>

在子组件 ChildComponent 中,通过 :value=“modelValue” 将 modelValue 绑定到 input 元素上,然后通过 @input=“$emit(‘update:modelValue’, $event)” 触发 update:modelValue 事件,从而实现了父子组件之间的双向绑定。

在父组件 ParentComponent 中,使用 v-model 将 ChildComponent 的 modelValue 绑定到 message 上,这样在父组件中修改 message 的值会自动同步到 ChildComponent 中,反之亦然。

需要注意的是,v-model 实际上是一个语法糖,它会自动处理 value 和 input 事件。如果在子组件中使用 v-model,则子组件应该接受名为 modelValue 的 prop,并发出一个名为 update:modelValue 的事件。这样可以确保 v-model 在父子组件之间正确地进行双向绑定。

三、Provide/Inject:

用于祖先组件向后代组件传递数据,通过 Provide 提供数据,通过 Inject 注入数据。祖先组件通过 provide 提供数据,后代组件通过 inject 接收数据。
祖先组件

<template>
  <GrandparentComponent>
    <template v-slot="{ message }">
      <ChildComponent :message="message" />
    </template>
  </GrandparentComponent>
</template>
<script>
import GrandparentComponent from './GrandparentComponent.vue';
export default {
  components: {
    GrandparentComponent,
  },
  provide() {
    return {
      message: 'Hello from grandparent!',
    };
  },
};
</script>

父组件

<template>
  <slot :message="message" />
</template>
<script>
export default {
  inject: ['message'],
};
</script>

子组件

<template>
  <div>{{ message }}</div>
</template>
<script>
export default {
  props: {
    message: String,
  },
};
</script>

四、事件

通过自定义事件,子组件向父组件传递数据。子组件通过 $emit 触发自定义事件,父组件监听该事件接收数据。
子组件

<template>
  <button @click="sendMessage">Send Message</button>
</template>
<script>
export default {
  methods: {
    sendMessage() {
      this.$emit('message', 'Hello from child!');
    },
  },
};
</script>

父组件

<template>
  <ChildComponent @message="handleMessage" />
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
  components: {
    ChildComponent,
  },
  methods: {
    handleMessage(message) {
      console.log(message);
    },
  },
};
</script>

四、Ref

使用 ref 可以将数据在父子组件之间共享。
父组件

<template>
  <ChildComponent :message="sharedMessage" />
</template>
<script>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';
export default {
  components: {
    ChildComponent,
  },
  setup() {
    const sharedMessage = ref('Hello from parent!');
    return { sharedMessage };
  },
};
</script>

子组件

<template>
  <div>{{ message }}</div>
</template>
<script>
import { ref, watchEffect } from 'vue';
export default {
  props: {
    message: String,
  },
  setup(props) {
    const message = ref(props.message);
    watchEffect(() => {
      // 监听 props 中的 message 变化
      message.value = props.message;
    });
    return { message };
  },
};
</script>

到此这篇关于Vue3中父子传参的文章就介绍到这了,更多相关Vue3父子传参内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue封装组件之上传图片组件

    vue封装组件之上传图片组件

    这篇文章主要为大家详细介绍了vue封装组件之上传图片组件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • 浅谈vue 多个变量同时赋相同值互相影响

    浅谈vue 多个变量同时赋相同值互相影响

    这篇文章主要介绍了浅谈vue 多个变量同时赋相同值互相影响,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Vue中nextTick的原理分析

    Vue中nextTick的原理分析

    本文详细介绍了Vue中nextTick的原理和使用方法,Vue采用异步渲染机制,通过nextTick可以确保在DOM更新后执行回调,nextTick依赖微任务和宏任务,优先使用Promise,降级到MutationObserver/setTimeout,Vue3进一步优化了nextTick,减少了复杂度并提升了性能
    2025-02-02
  • vue中使用腾讯云Im的示例

    vue中使用腾讯云Im的示例

    这篇文章主要介绍了vue中使用腾讯云Im的示例,帮助大家调用对应的api,完成自己的项目,感兴趣的朋友可以了解下
    2020-10-10
  • vue自定义气泡弹窗

    vue自定义气泡弹窗

    这篇文章主要为大家详细介绍了vue自定义气泡弹窗,包含css晃动动画shake制作,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • 解决Vue3 echarts v-show无法重新渲染的问题

    解决Vue3 echarts v-show无法重新渲染的问题

    这篇文章主要介绍了Vue3 echarts v-show无法重新渲染的问题,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • 如何使用Vue3.2+Vite2.7从0快速打造一个UI组件库

    如何使用Vue3.2+Vite2.7从0快速打造一个UI组件库

    构建工具使用vue3推荐的vite,下面这篇文章主要给大家介绍了关于如何使用Vue3.2+Vite2.7从0快速打造一个UI组件库的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • 详解nuxt sass全局变量(公共scss解决方案)

    详解nuxt sass全局变量(公共scss解决方案)

    这篇文章主要介绍了详解nuxt sass全局变量(公共scss解决方案),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • element UI upload组件上传附件格式限制方法

    element UI upload组件上传附件格式限制方法

    今天小编就为大家分享一篇element UI upload组件上传附件格式限制方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • Vue项目如何安装引入使用Vant

    Vue项目如何安装引入使用Vant

    Vant是一个专为移动端设计的轻量级组件库,自2017年开源以来,提供了Vue2、Vue3及多平台版本支持,安装Vant时需要注意版本兼容问题,Vue3项目应安装最新版Vant3,而Vue2项目则需安装Vant2,安装错误时,需卸载后重新安装正确版本
    2024-10-10

最新评论