vue3中setup参数attrs,slots,emit实例分析

发布时间:2022-08-09 11:22:07 作者:iii
来源:亿速云 阅读:1039

Vue3中setup参数attrs, slots, emit实例分析

Vue3 引入了 Composition API,其中 setup 函数是 Composition API 的核心部分。setup 函数在组件实例创建之前执行,它接收两个参数:propscontextcontext 是一个包含 attrsslotsemit 的对象。本文将深入分析 setup 函数中的 attrsslotsemit,并通过实例演示它们的使用。

1. setup 函数概述

在 Vue3 中,setup 函数是 Composition API 的入口点。它接收两个参数:

setup 函数返回一个对象,该对象的属性将被暴露给模板使用。

export default {
  setup(props, context) {
    // 在这里可以使用 props 和 context
    return {
      // 暴露给模板的属性
    };
  },
};

2. attrs 的使用

attrs 是一个包含所有非 prop 的 attribute 的对象。这些 attribute 包括 classstyle 以及任何未在 props 中声明的 attribute。

2.1 基本用法

假设我们有一个组件 MyComponent,它接收一个 title prop,并且我们还传递了一些其他的 attribute:

<MyComponent title="Hello" class="my-class" data-id="123" />

setup 函数中,我们可以通过 context.attrs 访问这些非 prop 的 attribute:

export default {
  setup(props, { attrs }) {
    console.log(attrs.class); // 输出: "my-class"
    console.log(attrs['data-id']); // 输出: "123"

    return {
      // 暴露给模板的属性
    };
  },
};

2.2 在模板中使用 attrs

我们可以将 attrs 传递给子组件,或者在模板中直接使用它们:

export default {
  setup(props, { attrs }) {
    return {
      attrs,
    };
  },
};

在模板中:

<template>
  <div v-bind="attrs">
    <!-- 这里可以使用 attrs 中的所有 attribute -->
  </div>
</template>

2.3 注意事项

3. slots 的使用

slots 是一个包含所有插槽内容的对象。通过 slots,我们可以在 setup 函数中访问和操作插槽内容。

3.1 基本用法

假设我们有一个组件 MyComponent,它包含一个默认插槽和一个具名插槽:

<MyComponent>
  <template v-slot:default>
    <p>Default Slot Content</p>
  </template>
  <template v-slot:footer>
    <p>Footer Slot Content</p>
  </template>
</MyComponent>

setup 函数中,我们可以通过 context.slots 访问这些插槽:

export default {
  setup(props, { slots }) {
    console.log(slots.default()); // 输出: [VNode]
    console.log(slots.footer()); // 输出: [VNode]

    return {
      // 暴露给模板的属性
    };
  },
};

3.2 在模板中使用 slots

我们可以将 slots 传递给子组件,或者在模板中直接使用它们:

export default {
  setup(props, { slots }) {
    return {
      slots,
    };
  },
};

在模板中:

<template>
  <div>
    <slot name="default"></slot>
    <slot name="footer"></slot>
  </div>
</template>

3.3 动态插槽

我们还可以动态地渲染插槽内容:

export default {
  setup(props, { slots }) {
    const slotName = ref('default');

    return {
      slotName,
      slots,
    };
  },
};

在模板中:

<template>
  <div>
    <component :is="slots[slotName]" />
  </div>
</template>

3.4 注意事项

4. emit 的使用

emit 是一个用于触发自定义事件的函数。通过 emit,我们可以在子组件中触发事件,并在父组件中监听这些事件。

4.1 基本用法

假设我们有一个组件 MyComponent,它包含一个按钮,点击按钮时触发一个自定义事件 click

<MyComponent @click="handleClick" />

setup 函数中,我们可以通过 context.emit 触发这个事件:

export default {
  setup(props, { emit }) {
    const handleClick = () => {
      emit('click', 'Hello from MyComponent');
    };

    return {
      handleClick,
    };
  },
};

在父组件中,我们可以监听这个事件:

export default {
  methods: {
    handleClick(message) {
      console.log(message); // 输出: "Hello from MyComponent"
    },
  },
};

4.2 在模板中使用 emit

我们可以在模板中直接使用 emit

export default {
  setup(props, { emit }) {
    return {
      emit,
    };
  },
};

在模板中:

<template>
  <button @click="emit('click', 'Hello from MyComponent')">Click Me</button>
</template>

4.3 注意事项

5. 综合实例

下面是一个综合使用 attrsslotsemit 的实例:

export default {
  setup(props, { attrs, slots, emit }) {
    const handleClick = () => {
      emit('click', 'Hello from MyComponent');
    };

    return {
      attrs,
      slots,
      handleClick,
    };
  },
};

在模板中:

<template>
  <div v-bind="attrs">
    <slot name="default"></slot>
    <button @click="handleClick">Click Me</button>
    <slot name="footer"></slot>
  </div>
</template>

在父组件中使用:

<MyComponent class="my-class" @click="handleClick">
  <template v-slot:default>
    <p>Default Slot Content</p>
  </template>
  <template v-slot:footer>
    <p>Footer Slot Content</p>
  </template>
</MyComponent>

6. 总结

在 Vue3 的 setup 函数中,attrsslotsemit 是非常有用的工具。通过它们,我们可以访问非 prop 的 attribute、操作插槽内容以及触发自定义事件。掌握这些工具的使用,可以帮助我们更好地构建灵活且可复用的组件。

希望本文对你理解 Vue3 中的 setup 参数有所帮助。如果你有任何问题或建议,欢迎在评论区留言讨论。

推荐阅读:
  1. vue3中如何使用setup、ref和reactive
  2. Vue3中emits与attrs的区别有哪些

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

vue3 setup attrs

上一篇:vue3中setup函数的参数props和context怎么配置

下一篇:github访问速度慢的问题如何解决

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》