光之晨曦🌟🌟🌟

vuePress-theme-reco 晨曦    2021 - 2022
光之晨曦🌟🌟🌟 光之晨曦🌟🌟🌟

Choose mode

  • dark
  • auto
  • light
首页
前端开发
  • CSS
  • FrontEnd
  • GraphQL
  • JS基础语法
  • JavaScript
  • TypeScript
  • Vue
  • Webpack
  • 数据结构与算法
  • 浏览器相关
  • 推荐文档
JS指南
  • JS基础相关
  • ECMAScript 6
  • OOP面向对象编程
  • JavaScript设计模式
前端框架
  • Vue相关

    • Vue基础相关
    • Vue官方生态
    • Vue.js的设计核心
性能优化
  • 前端缓存

    • HTTP缓存
    • 数据缓存
    • 离线缓存
    • CDN缓存
  • 优化方案

    • SEO方向的优化方案
    • Webpack的性能优化
    • Canvas性能优化方案
    • 了解常见的Web、App性能优化方案
    • React、Vue框架使用性能优化方案
前端工程化
  • 部署
  • Git
  • Vite
  • WebPack
第三方拓展
时间线
关于
GitHub
author-avatar

晨曦

82

文章

61

标签

首页
前端开发
  • CSS
  • FrontEnd
  • GraphQL
  • JS基础语法
  • JavaScript
  • TypeScript
  • Vue
  • Webpack
  • 数据结构与算法
  • 浏览器相关
  • 推荐文档
JS指南
  • JS基础相关
  • ECMAScript 6
  • OOP面向对象编程
  • JavaScript设计模式
前端框架
  • Vue相关

    • Vue基础相关
    • Vue官方生态
    • Vue.js的设计核心
性能优化
  • 前端缓存

    • HTTP缓存
    • 数据缓存
    • 离线缓存
    • CDN缓存
  • 优化方案

    • SEO方向的优化方案
    • Webpack的性能优化
    • Canvas性能优化方案
    • 了解常见的Web、App性能优化方案
    • React、Vue框架使用性能优化方案
前端工程化
  • 部署
  • Git
  • Vite
  • WebPack
第三方拓展
时间线
关于
GitHub

「译」 VueDose Tip 29 - 在 Vue.js 3 Composition API 中访问实例属性

vuePress-theme-reco 晨曦    2021 - 2022

「译」 VueDose Tip 29 - 在 Vue.js 3 Composition API 中访问实例属性

晨曦 2020-02-04 Vue 3VueDose文章翻译

在上一个 Tip 轻松切换到 Vue.js 3 Composition API中,我解释了如何将 Vue.js 基于对象 API 的组件迁移到新的 Composition API。

然而,这并不完整。我们以前使用的实例属性,例如 this.$emit,this.$slots,this.$attrs,该怎么办呢?他们虽然在组件实例 this 上, 但 Composition API 中并没有 this。

在上一篇 Tip 中,我并没有使用 prop, 我们过去使用 this 来访问 prop,但是现在你根本不可能访问到它。

事实上,我之前没有说明过当使用 Composition API 时,setup 函数的参数。

setup 函数的第一个参数接收组件所有的 prop。接着上一个 Tip 的示例,我们来为 money和 delta 本地状态增加两个 prop 作为他们的初始值:

export default {
  props: {
    money: {
      type: Number,
      default: 10
    },
    delta: {
      type: Number,
      default: 1
    }
  },
  setup(props) {
    const money = ref(props.money);
    const delta = ref(props.delta);

    // ...
  }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

十分简单。在 Vue.js 组件中,除了 prop 管理外,没有其它变化。

其它所有的实例属性和例如 $emit 的方法呢?你可以在 setup 函数的第二个参数:setup context 对象中找到它们。

setup context的有以下结构:

interface SetupContext {
  readonly attrs: Record<string, string>;
  readonly slots: { [key: string]: (...args: any[]) => VNode[] };
  readonly parent: ComponentInstance | null;
  readonly root: ComponentInstance;
  readonly listeners: { [key: string]: Function };
  emit(event: string, ...args: any[]): void;
}
1
2
3
4
5
6
7
8

更 cool 的是,我们可以在 setup context 上使用对象解构,并且它们都不失去响应式的特性。

为了说明这一点,我将修改之前的示例,并在 onMounted 钩子中打印一些东西,以及在 money 改变时触发 money-changed 事件:

setup(props, { emit, attrs, slots }) {
    // State
    const money = ref(props.money);
    const delta = ref(props.delta);

    // Hooks
    onMounted(() => {
      console.log("Money Counter (attrs): ", attrs);
      console.log("Money Counter (slots): ", slots);
    });

    // Watchers
    const moneyWatch = watch(money, (newVal, oldVal) =>
      emit("money-changed", newVal)
    );
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

以上!现在,你已经可以使用大多数 Vue.js 组件实例属性和方法了。

但是你可能意识到,并非所有内容都在渲染时的 context 中...比如 this.$refs,还有会注入一些内容的插件,例如 this.$store,这些该怎么办呢?

不用担心,我将在接下来的 Tip 中介绍!

# CodeSandbox

# 原文链接

编辑