vue3中组件传值的多种方法总结

yizhihongxing

下面是详细讲解“vue3中组件传值的多种方法总结”的完整攻略。

1. 组件传值概述

在vue3中,组件传值是非常常见的场景,通常包括父组件向子组件传值和子组件向父组件传值两种类型。

在vue3中,组件传值的方式主要包括如下几种:

  1. 父组件向子组件传值(prop)
  2. 子组件向父组件传值($emit)
  3. 祖先组件向后代组件传值(provide/inject)
  4. 跨级组件之间传值($attrs/$listeners)

下面我们分别来详细说明它们的用法和示例:

2. 父组件向子组件传值(prop)

父组件向子组件传值是最常见的一种方式,常见的写法是在父组件的标签中使用属性来向子组件传值。子组件中可以通过this.$props来访问这个属性,这个属性可以是普通的字符串、数字、对象等类型。

示例代码如下:

// 父组件
<template>
  <div>
    <child-component :msg="message"></child-component>
  </div>
</template>

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

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      message: 'Hello Vue3!'
    }
  }
}
</script>

// 子组件
<template>
  <div>{{ msg }}</div>
</template>

<script>
export default {
  props: {
    msg: {
      type: String
    }
  }
}
</script>

在这个示例中,父组件向子组件传递了一个名为message的值,子组件通过props接收到这个值,并显示在页面上。

3. 子组件向父组件传值($emit)

子组件向父组件传值通常都是通过事件来实现的,即子组件通过$emit方法触发一个自定义事件,父组件在子组件标签上监听该自定义事件,并执行相应的方法。

示例代码如下:

// 父组件
<template>
  <div>
    <child-component @change="handleChange"></child-component>
  </div>
</template>

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

export default {
  components: {
    ChildComponent
  },
  methods: {
    handleChange(value) {
      console.log(value)
    }
  }
}
</script>

// 子组件
<template>
  <div>
    <input type="text" v-model="inputValue" @input="handleInput">
  </div>
</template>

<script>
export default {
  data() {
    return {
      inputValue: ''
    }
  },
  methods: {
    handleInput() {
      this.$emit('change', this.inputValue)
    }
  }
}
</script>

在这个示例中,子组件通过$emit方法触发一个名为change的自定义事件,并将inputValue的值作为参数传递给父组件,父组件监听该事件,并执行handleChange方法来处理接收到的参数。

4. 祖先组件向后代组件传值(provide/inject)

祖先组件向后代组件传值通常使用provide/inject来实现,provide/inject用于祖先组件向所有后代组件传递数据,后代组件可以通过inject来接收这些数据。需要注意的是,provide/inject建立的是一种祖先组件与后代组件之间的默默传递关系,不像props和$emit那样需要明确地进行传递和捕获,而且provide/inject提供的是一种全局的无障碍通道,便于数据的灵活传递。

示例代码如下:

// 祖先组件
<template>
  <div>
    <parent-component :color="color">
      <child-component></child-component>
    </parent-component>
  </div>
</template>

<script>
import ParentComponent from './ParentComponent.vue'

export default {
  components: {
    ParentComponent
  },
  provide() {
    return {
      color: 'red'
    }
  }
}
</script>

// 父组件
<template>
  <div :style="{ color: color }">
    <slot></slot>
  </div>
</template>

<script>
export default {
  props: {
    color: {
      type: String
    }
  }
}
</script>

// 子组件
<template>
  <div>
    {{ color }}
  </div>
</template>

<script>
export default {
  inject: ['color']
}
</script>

在这个示例中,祖先组件给所有后代组件提供了一个名为color的数据,父组件和子组件都可以通过inject来接收这个数据,并在自己的模板中使用它。

5. 跨级组件之间传值($attrs/$listeners)

在vue3中,父子组件之间的传值已经可以通过props和$emit实现,但是在跨级组件中,由于存在多级组件嵌套,如果每个组件之间都需要通过props和$emit来传值,代码就会很复杂。这个时候,就可以使用$attrs和$listeners来实现跨级组件之间的数据传递。

$attrs包含了父组件在使用子组件时所有的属性,包括class和style等,而$listeners可以拿到父组件在子组件中绑定的所有事件。这样,就可以实现跨级组件之间的联动。

示例代码如下:

// 父组件
<template>
  <div>
    <ancestor-component :msg="message" @change="handleChange"></ancestor-component>
  </div>
</template>

<script>
import AncestorComponent from './AncestorComponent.vue'

export default {
  components: {
    AncestorComponent
  },
  data() {
    return {
      message: 'Hello Vue3!'
    }
  },
  methods: {
    handleChange(value) {
      console.log(value)
    }
  }
}
</script>

// 祖先组件
<template>
  <div>
    <parent-component v-bind="$attrs" v-on="$listeners">
      <slot></slot>
    </parent-component>
  </div>
</template>

<script>
import ParentComponent from './ParentComponent.vue'

export default {
  components: {
    ParentComponent
  }
}
</script>

// 父组件
<template>
  <div>
    <child-component v-bind="$attrs" v-on="$listeners"></child-component>
  </div>
</template>

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

export default {
  components: {
    ChildComponent
  }
}
</script>

// 子组件
<template>
  <div>
    <input type="text" v-model="inputValue" @input="handleInput">
    <button @click="handleClick">传递数据</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      inputValue: ''
    }
  },
  methods: {
    handleInput() {
      this.$emit('change', this.inputValue)
    },
    handleClick() {
      this.$emit('transferData', this.inputValue)
    }
  }
}
</script>

在这个示例中,父组件通过$attrs和$listeners将所有的属性和事件都传递给祖先组件,祖先组件又将这些属性和事件传递给了父组件,父组件也通过$attrs和$listeners将这些属性和事件传递给了子组件,子组件在自己的模板中使用了input、button等标签,并向父组件传递数据。父组件和祖先组件监听了子组件的自定义事件change和transferData,并执行了相应的方法来处理接收到的数据。

这就是vue3中组件传值的多种方法总结的详细攻略,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue3中组件传值的多种方法总结 - Python技术站

(0)
上一篇 2023年5月29日
下一篇 2023年5月29日

相关文章

  • 详解vue移动端日期选择组件

    让我详细讲解一下“详解Vue移动端日期选择组件”的完整攻略。 标题1 标题2 标题3 首先,这篇攻略将详细介绍如何使用Vue框架开发移动端日期选择组件,并且会包含至少两个示例说明。下面就让我们开始吧。 组件的功能需求 在开始编写组件之前,我们需要先定义组件的功能需求,以便于后续在设计中进行调整。 支持用户选择年份、月份和日期。 根据年份和月份计算当月天数。 …

    Vue 2023年5月28日
    00
  • Vue Promise的axios请求封装详解

    标题:Vue Promise的Axios请求封装详解 简介:Vue.js 是一款轻量级、渐进式的 JavaScript 框架,提供了数据驱动和组件化的思想,可用于构建任何复杂的单页面应用。而 Axios 是一个基于 Promise 的 HTTP 客户端,用于浏览器和 Node.js。在 Vue.js 开发中,我们常常需要用到 Axios 去请求后台数据。为了…

    Vue 2023年5月28日
    00
  • js实现数据导出为EXCEL(支持大量数据导出)

    下面为你详细讲解如何使用JS实现数据导出为Excel的完整攻略。 步骤1:引入相关JS库 实现数据导出为Excel需要使用到相关的JS库,最常用的有两种,分别是SheetJS和xlsx.js。你可以根据自己的需要选择其中任何一种。 SheetJS SheetJS是一款基于开源JS库FileSaver和JSZip的纯JS后端实现的表格处理工具。它的最大优势是支…

    Vue 2023年5月27日
    00
  • vue中添加mp3音频文件的方法

    下面是详细讲解 Vue 中添加 mp3 音频文件的方法的完整攻略。 1.准备工作 在 Vue 项目的 public 目录下创建 audio 目录,并将需要添加的 mp3 音频文件放置在该目录下。 2.添加音频标签 在需要添加音频的组件中,使用 HTML5 音频标签 audio,并为其设置 src 属性为音频文件的相对路径: <audio src=&qu…

    Vue 2023年5月27日
    00
  • vscode运行vue项目需要配置什么? vscode启动vue项目的技巧

    要在VSCode中运行Vue项目,需要进行以下配置: 安装Node.js和Vue CLI 在开始之前,需要安装Node.js和Vue CLI。Node.js是JavaScript运行环境,Vue CLI是Vue.js的脚手架工具。Vue CLI会生成一个Vue项目的基本结构,包括依赖和配置文件。可以通过以下命令安装Node.js和Vue CLI: # 安装N…

    Vue 2023年5月28日
    00
  • vue2.0开发实践总结之疑难篇

    Vue2.0开发实践总结之疑难篇攻略 在Vue2.0开发实践中,我们经常会遇到一些疑难问题。本攻略主要介绍Vue2.0开发中的一些常见疑难问题及其解决方法。 1. Vue组件中引入CSS文件 使用Vue开发时,可以使用<style>标签将样式写在组件内部,但是当我们需要引入外部的CSS文件时应该怎么办?我们可以使用@import或<link…

    Vue 2023年5月28日
    00
  • 浅谈Vue的双向绑定和单向数据流冲突吗

    浅谈Vue的双向绑定和单向数据流冲突吗 双向绑定 Vue中的双向绑定是指数据的变化可以同时影响到视图和模型,即视图上的数据变化可以同步到模型中,模型中的数据变化也可以同步到视图中。双向绑定可以双方互相通讯,使得开发者更加方便地处理数据和界面。 双向绑定的实现原理是借助了 Object.defineProperty() 方法,将 data 中的数据属性由原本的…

    Vue 2023年5月27日
    00
  • 初识 Vue.js 中的 *.Vue文件

    初识 Vue.js 中的 .vue 文件 在 Vue.js 中,.vue 文件是一个自定义的单文件组件(Single-File Component),可以将 HTML、CSS 和 JavaScript 集中到一个 .vue 文件中,并进行组件化开发。 一个 .vue 文件一般包含三部分:template(模板)、script(脚本)和 style(样式),它…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部