{{ keyword }}在Vue3父子组件传值的实现方式

在Vue3中,父子组件是常见的组件通信方式,而实现父子组件传值则是其中比较重要的一种应用场景。本文将从以下几个方面来详细介绍Vue3中实现父子组件传值的几种方式。

一、props

在Vue3中,props依然是一个非常重要的属性,通过在子组件中设置props选项,可以让父组件向子组件传递数据:


// 父组件传递数据到子组件
<template>
  <child-component :message="parentMessage">
  </child-component>
</template>

<script>
import ChildComponent from './ChildComponent';

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      parentMessage: 'Hello from parent component'
    };
  }
}
</script>

// 子组件接收props数据
<template>
  <div>{{ message }}</div>
</template>

<script>
export default {
  props: {
    message: String
  }
}
</script>

此时,父组件向子组件传递了一个字符串类型的message数据,而子组件接收到该数据并直接在页面中渲染出来。

二、依赖注入provide/inject

在Vue3新增了provide/inject选项,用于实现父组件向子孙组件传递数据,使用方式如下:


// 父组件提供数据
<template>
  <child-component>
  </child-component>
</template>

<script>
import { provide } from 'vue';
import ChildComponent from './ChildComponent';

export default {
  components: {
    ChildComponent
  },
  setup() {
    const parentMessage = 'Hello from parent component';
    provide('message', parentMessage);
  }
}
</script>

// 子组件接收provide中的数据
<template>
  <grandchild-component></grandchild-component>
</template>

<script>
import { inject } from 'vue';
import GrandchildComponent from './GrandchildComponent';

export default {
  components: {
    GrandchildComponent
  },
  setup() {
    const message = inject('message');
    return {
      message
    }
  }
}
</script>

// 孙子组件中使用父组件提供的数据
<template>
  <div>{{ message }}</div>
</template>

<script>
export default {
  setup(props, { attrs, slots, emit }) {
    // 这里也可以使用inject来获取到父组件提供的数据
  }
}
</script>

在父组件中使用provide来提供数据,而在子孙组件中使用inject来获取父组件提供的数据。需要注意的是,provide/inject是依赖底层组件实例的引用来实现的,所以不能在setup函数外使用。

三、$attrs/$listeners

在Vue3中,$attrs/$listeners是一种新的组件属性,前者获取父组件传递过来的非prop属性,后者获取父组件传递过来的非prop事件,使用方式如下:


// 父组件向子组件传递非prop属性和事件
<template>
  <child-component title="Hello World" @click="doSomething"></child-component>
</template>

// 子组件中使用$attrs和$listeners来访问父组件传递过来的数据
<template>
  <div :title="$attrs.title" @click="$listeners.click"></div>
</template>

<script>
export default {
  inheritAttrs: false // 必须设置,否则会将所有的非prop属性透传到根元素上
}
</script>

这里子组件中使用$attrs.data来访问title属性,$listeners.click来访问click事件。

四、$emit

在Vue3中,$emit是一种子组件向父组件传递数据的方法,使用方式如下:


// 子组件向父组件传递数据
<template>
  <div @click="sendMessage"></div>
</template>

<script>
export default {
  methods: {
    sendMessage() {
      this.$emit('message', 'Hello from child component');
    }
  }
}
</script>

// 父组件接收子组件传递过来的数据
<template>
  <child-component @message="handleMessage"></child-component>
</template>

<script>
import ChildComponent from './ChildComponent';

export default {
  components: {
    ChildComponent
  },
  methods: {
    handleMessage(message) {
      console.log(message);
    }
  }
}
</script>

子组件中通过$emit来传递数据,而父组件则通过@message来监听message事件,并在回调函数中获取到子组件传递过来的数据。

五、ref/$refs

在Vue3中,ref/$refs是一种组件引用方式,可以在父组件中通过ref属性来获取到子组件实例,从而可以调用子组件中的方法和属性,使用方式如下:


// 父组件中获取子组件实例
<template>
  <child-component ref="child"></child-component>
</template>

<script>
import { ref } from 'vue';
import ChildComponent from './ChildComponent';

export default {
  components: {
    ChildComponent
  },
  setup() {
    const childRef = ref(null);
    return {
      childRef
    }
  },
  mounted() {
    console.log(this.$refs.child); // 这里也可以获取到子组件实例
  }
}
</script>

// 子组件中可以通过this.$emit来向父组件传递数据
<template>
  <div></div>
</template>

<script>
export default {
  methods: {
    sendMessage() {
      this.$emit('message', 'Hello from child component');
    }
  }
}
</script>

在父组件中,可以通过ref来获取到子组件的实例,在子组件中则可以通过this.$emit来向父组件传递数据。

通过以上五种方式,我们可以在Vue3中实现父子组件之间的数据传递和通信。需要根据实际场景来选择不同的实现方式,以达到更好的应用效果。

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-12 12:10
下一篇 2024-12-12 12:10

相关推荐

  • Python缓存图片的处理方式

    本文将从多个方面详细阐述Python缓存图片的处理方式,包括缓存原理、缓存框架、缓存策略、缓存更新和缓存清除等方面。 一、缓存原理 缓存是一种提高应用程序性能的技术,在网络应用中流…

    编程 2025-04-29
  • 如何修改ant组件的动效为中心

    当我们使用Ant Design时,其默认的组件动效可能不一定符合我们的需求,这时我们需要修改Ant Design组件动效,使其更加符合我们的UI设计。本文将从多个方面详细阐述如何修…

    编程 2025-04-29
  • Ant Design组件的动效

    Ant Design是一个基于React技术栈的UI组件库,其中动效是该组件库中的一个重要特性之一。动效的使用可以让用户更清晰、更直观地了解到UI交互的状态变化,从而提高用户的满意…

    编程 2025-04-29
  • Python在线编辑器的优势与实现方式

    Python在线编辑器是Python语言爱好者的重要工具之一,它可以让用户方便快捷的在线编码、调试和分享代码,无需在本地安装Python环境。本文将从多个方面对Python在线编辑…

    编程 2025-04-28
  • Java表单提交方式

    Java表单提交有两种方式,分别是get和post。下面我们将从以下几个方面详细阐述这两种方式。 一、get方式 1、什么是get方式 在get方式下,表单的数据会以查询字符串的形…

    编程 2025-04-27
  • 用Pythonic的方式编写高效代码

    Pythonic是一种编程哲学,它强调Python编程风格的简单、清晰、优雅和明确。Python应该描述为一种语言而不是一种编程语言。Pythonic的编程方式不仅可以使我们在编码…

    编程 2025-04-27
  • Java多版本支持实现方式

    本文将从以下几个方面阐述如何实现Java多版本支持,并给出可行的代码示例。 一、多版本Java环境概述 Java是一门跨平台的编程语言,但是在不同的应用场景下,可能需要使用不同版本…

    编程 2025-04-27
  • SpringBoot Get方式请求传参用法介绍

    本文将从以下多个方面对SpringBoot Get方式请求传参做详细的阐述,包括URL传参、路径传参、请求头传参、请求体传参等,帮助读者更加深入地了解Get请求方式下传参的相关知识…

    编程 2025-04-27
  • Python获取APP数据的多种方式

    如果您需要对APP进行分析、数据采集、监控或者自动化测试,那么您一定需要获取APP的数据。本文将会介绍一些Python获取APP数据的方式。 一、使用ADB工具获取APP数据 AD…

    编程 2025-04-27
  • Python中用空格隔开的使用方式

    Python是一种高级编程语言,非常流行,因为它有很多有用的功能。其中一个有用的功能是用空格隔开代码。在本文中,我们将从多个方面讨论Python中如何使用空格隔开代码。 一、Pyt…

    编程 2025-04-27

发表回复

登录后才能评论