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

下面是详细讲解“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.nextTick 的实现方法

    当数据发生变化后,Vue 不会立即更新 DOM,而是加入一个更新队列,并在下一次事件循环中更新视图。而 Vue.nextTick 可以在下次 DOM 更新循环结束之后执行回调。这使得我们可以在 DOM 变化后立即操作更新后的 DOM,例如获取更新后的元素宽高等。 一、Vue.nextTick 的调用方式 Vue 提供了两种调用方式: 1.1 全局调用方式 V…

    Vue 2023年5月29日
    00
  • Vue实现插槽下渲染dom字符串的使用

    当我们在使用Vue时,我们经常会用到插槽,它可以让我们在组件中定义一些可重用的模板代码。然而,有时候我们需要在插槽中插入一些动态生成的DOM字符串,Vue并没有提供直接的方式来完成这个操作,此时我们可以使用v-html指令和render函数来实现。 使用v-html指令 使用v-html指令可以将一个字符串作为HTML代码进行渲染,这个过程和在模板中使用双括…

    Vue 2023年5月27日
    00
  • 十分钟带你读懂Vue中的过滤器

    十分钟带你读懂Vue中的过滤器 什么是过滤器 过滤器(Filter)是Vue.js提供的一项非常实用的功能,它用于在渲染数据之前对数据进行一些处理。 在Vue中,我们可以使用过滤器来快速地处理数据,比如格式化日期、去除重复项等操作。 基本用法 在Vue中,我们可以通过filters选项来定义过滤器: <div id="app"&gt…

    Vue 2023年5月27日
    00
  • vue3的动态组件是如何工作的

    Vue3 的动态组件相比于 Vue2 有了较大的改变,本文将详细讲解 Vue3 的动态组件是如何工作的,包括其实现原理和示例说明。 什么是动态组件 Vue 中的组件是指可复用并具有独立功能的代码块,根据其作用域及其之间的交互可以实现复杂的组件化应用。而动态组件,顾名思义指在运行时可以动态地切换所渲染的组件。 Vue3 中动态组件的实现原理 在 Vue2 中,…

    Vue 2023年5月27日
    00
  • vue开发之moment的介绍与使用

    Vue开发之Moment的介绍与使用 Moment.js介绍 Moment.js是一个专门用来解析、显示和操作日期时间数据的JavaScript库,提供了各种格式化、时间计算、日期相差、本地化和持续时间等功能,非常实用。 Moment.js可以用在浏览器端和Node.js环境下,可以通过npm或直接引入CDN来使用。同时,Moment.js也支持在Vue和其…

    Vue 2023年5月29日
    00
  • 修改vue+webpack run build的路径方法

    下面是修改vue+webpack run build的路径方法的详细攻略。 1. 理解打包路径 在修改打包路径之前,我们首先需要理解打包路径的概念。在使用vue-cli构建项目时,我们可以通过执行npm run build命令来进行打包,打包后的文件默认会被生成到dist目录下。如果我们需要修改打包后文件的输出路径,那么就需要修改webpack的配置文件。 …

    Vue 2023年5月28日
    00
  • vue新玩法VueUse工具库具体用法@vueuse/core详解

    VueUse工具库详解 什么是VueUse工具库 VueUse是一个基于Vue3的工具库,旨在提供许多实用功能用于开发Vue应用程序。它由一系列的模块组成,每个模块都集成了一组相关功能。例如:表单,状态,副作用等,而这些模块均提供了许多工具函数和hooks,您可以在Vue3项目中使用它们来轻松完成特定任务。 如何使用VueUse 通常,您可以通过npm安装V…

    Vue 2023年5月27日
    00
  • elementUI+Springboot实现导出excel功能的全过程

    下面我将详细讲解如何使用ElementUI和Springboot实现导出excel功能的全过程。 第一步:搭建环境 1.1 安装Node.js和npm 在使用ElementUI之前,你需要先安装Node.js和npm。你可以在官网上下载Node.js的安装包,然后安装完成之后就可以通过npm来安装ElementUI依赖了。 1.2 导入ElementUI 你…

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