Vue3父子组件数据传递

getCurrentInstance方法

Vue2中,可以通过this来获取当前组件实例;

Vue3中,在setup中无法通过this获取组件实例,console.log(this)打印出来的值是undefined。

在Vue3中,getCurrentInstance()可以用来获取当前组件实例。

复制代码
let { proxy } = getCurrentInstance();

在setup中分别打印下面3个值,结果如下:

复制代码
console.log(getCurrentInstance,typeof(getCurrentInstance));
console.log(getCurrentInstance(),typeof(getCurrentInstance()));
console.log(proxy,typeof(proxy));

可以看到,getCurrentInstance是一个function方法,getCurrentInstance()是一个对象,proxy也是一个对象。proxy是getCurrentInstance()对象中的一个属性,通过对象的解构赋值方式拿到proxy。

getCurrentInstance只能在setup或生命周期钩子中使用

用于线上环境使用方法:

方法1:

复制代码
const instance = getCurrentInstance()
console.log(instance.appContext.config.globalProperties)

方法2:

复制代码
const { proxy } = getCurrentInstance()  

$emit使用方法

许多Vue模式涉及使用props将数据从父组件传递到子组件。但如果我们需要一个子组件将数据传给它的父组件呢?

使用 emit,我们可以触发事件并将数据传递到组件的层次结构中。这对下面几种情况很有用,如:

  • 从 input 中发出数据
  • 从 modal 本身内部关闭 modal
  • 父组件响应子组件

Vue Emit是如何工作的?

当我们 emit 一个事件时,我们用一个或多个参数调用一个方法:

  • eventName: string - 事件的名称
  • values: any - 通过事件传递的参数

下面是一个内联 emit的例子,<button @click="$emit('add', Math.random())">。emit一个名为add的事件,并将Math.random()的值作为参数传递出去。

然后,在父组件使用v-on或@指令可以监听我们的自定义添加事件并接收该参数值。

Child.vue

复制代码
<template>
  <button @click="$emit('add', Math.random())">
    Add Math.random()
  </button>
</template>

Parent.vue中监听:

复制代码
<script setup>
import { ref } from 'vue'
const count = ref(0)
// 也可以从我们的模板中调用一个函数 `<ChildComponent @add="add" />
// const add = (i) => count.value += i
</script>
<template>
  <ChildComponent @add="(i) => count += i" /> 
  <p>Count: {{ count }}</p>
</template>

每次我们点击按钮,Child.vue 都会 emit 一个 add 事件,并带有一个0到1之间的随机值。 然后,Parent.vue 捕捉到这个事件,并将这个值添加到计数中。

可以传递任意多的参数,监听器也会收到所有的参数:

  • Child - $emit('add', Math.random(), 44, 50)
  • Parent - @add="(i, j, k) => count += i + j + k"

现在,我们知道如何在我们的模板中 emit 内联事件,但在更复杂的例子中,如果我们从SFC的script 中 emit 一个事件会更好。特别是当我们想在 emit 事件之前执行一些逻辑时,这很有用。

在Vue 3中,我们有2种不同的方法来做到这一点:

  • 选项API - this.$emit
  • 带有setup()的组合API - context.emit
  • 带有
相关推荐
magic 2452 分钟前
深入解析Promise:从基础原理到async/await实战
开发语言·前端·javascript
海盗强3 分钟前
babel和loader的关系
前端·javascript
顾洋洋8 分钟前
WASM与OPFS组合技系列三(魔改写操作)
前端·javascript·webassembly
清粥油条可乐炸鸡14 分钟前
el-transfer穿梭框数据量过大的解决方案
前端·javascript
天天扭码15 分钟前
Trae 04.22 版本:前端学习者的智能成长助手
前端·trae
snakeshe101017 分钟前
深入解析React Hooks:useCallback与useMemo的原理与区别
前端
洋3318 分钟前
[纯原创无Ai] 我把React调教成vue的模样了
vue.js·react.js
听风吹等浪起19 分钟前
html5:从零构建经典游戏-扫雷游戏
前端·html·html5
独立开阀者_FwtCoder19 分钟前
TypeScript 是怎么工作的?一文带你深入编译器内部流程
前端·javascript·面试
独立开阀者_FwtCoder24 分钟前
前端自适应方案全面解析:打造多端适配的现代网页
前端·javascript·面试