joken-前端工程师

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: :: 管理 ::
  404 随笔 :: 39 文章 :: 8 评论 :: 20万 阅读

在 Vue 3 中,setup 函数是 Composition API 的入口点,用于替代传统的 datamethodscomputed 等选项。setup 函数可以接收两个参数:propscontext。下面详细解释这两个参数及其用途。

setup 函数签名

import { SetupContext } from 'vue';

export default {
  props: {
    // 定义组件的 props
  },
  setup(props: {}, context: SetupContext) {
    // 在这里使用 props 和 context
  }
};

参数详解

1. props

props 是一个对象,包含了传递给组件的所有属性(props)。这些属性可以在 setup 函数中直接使用,并且它们是响应式的(reactive)。

  • 类型:根据你在组件中定义的 props 类型来确定。

  • 示例

    export default {
      props: {
        message: String,
        count: Number
      },
      setup(props) {
        console.log(props.message); // 输出传递给组件的 message prop
        console.log(props.count);   // 输出传递给组件的 count prop
      }
    };
    
  • 注意事项

    • props 是只读的,不能直接修改。
    • 如果需要对 props 进行转换或派生新的值,可以使用 computed 或者其他响应式机制。

2. context

context 是一个包含组件上下文信息的对象。它提供了几个有用的属性和方法,帮助你更好地管理组件的行为。

  • 类型SetupContext

  • 属性

    • attrs:包含所有未声明为 props 的属性(即 $attrs),通常用于非 props 的 DOM 属性。
    • slots:包含插槽内容,类似于 this.$slots
    • emit:一个函数,用于触发自定义事件,类似于 this.$emit
  • 示例

    export default {
      props: {
        title: String
      },
      setup(props, context) {
        // 访问 attrs
        console.log(context.attrs.class); // 输出传递给组件但未声明为 props 的 class 属性
    
        // 访问 slots
        const defaultSlot = context.slots.default ? context.slots.default() : null;
        console.log(defaultSlot); // 输出默认插槽的内容
    
        // 触发自定义事件
        context.emit('customEvent', 'some data');
      }
    };
    

完整示例

以下是一个完整的示例,展示了如何在 setup 函数中使用 propscontext

<template>
  <div>
    <p>{{ message }}</p>
    <button @click="handleClick">Click Me</button>
    <slot></slot>
  </div>
</template>

<script lang="ts">
import { defineComponent, ref } from 'vue';

export default defineComponent({
  props: {
    message: {
      type: String,
      required: true
    }
  },
  setup(props, context) {
    // 使用 props
    console.log('Message:', props.message);

    // 使用 context
    console.log('Attrs:', context.attrs);
    console.log('Slots:', context.slots.default ? context.slots.default() : null);

    // 创建一个响应式变量
    const count = ref(0);

    // 定义一个事件处理函数
    const handleClick = () => {
      count.value++;
      context.emit('increment', count.value);
    };

    return {
      handleClick,
      count
    };
  }
});
</script>

总结

  • props:包含传递给组件的所有属性,是响应式的并且只读。
  • context:包含组件的上下文信息,包括 attrsslotsemit 方法。

通过理解并合理使用 setup 函数的这两个参数,你可以更灵活地管理组件的状态、属性和事件,从而编写出更加模块化和可维护的代码。

posted on   joken1310  阅读(133)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示