chengpeiquan / learning-vue3

超过 230w+ 阅读人次的《Vue3 入门指南与实战案例》,关于前端工程化开发的基础知识点,以及 TypeScript 、 Vue 3 、 Pinia 的入门学习指南。

Home Page:https://vue3.chengpeiquan.com

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

该如何用useSlots() 和 useAttrs() 替代useContext()呢?

leosin opened this issue · comments

最近一个vue版本中有这样一个提示:
useContext() has been deprecated and will be removed in the next minor release. Use useSlots() and useAttrs() instead.

我当前用在父子组件间的调用,用法是这样:

const ctx = useContext()
const msb = () => {
  ctx.emit('update:msb')
}

我在网上没找到相关说明,该如何用useSlots() 和 useAttrs()呢

果然是实验性的 API ,还没正式启用就弃用了……我去瞅瞅新的变化~

最近一段时间比较忙没怎么关注 3.0 的进展,script-setup 变化还挺大的,我回头再更新一下文档~

关于这 2 个 API,用法是这样:


useAttrs 可以直接拿到非 props 的数据

<script setup lang="ts">
import { useAttrs } from 'vue'

const attrs = useAttrs()

// 打印所有的attrs
console.log(attrs);

// 只打印某个attr
console.log(attrs.msg);
</script>

如果没有指定为 props,那么父组件传进来的属性都会挂到 attrs 这边来,就可以通过这个方法拿到了


useSlots 目前推测应该是提供给 JSX / TSX 用的,用法比如:

父组件如果是像这样传入了插槽数据

<template>
  <ChildTSX>
    <p>I am a default slot from TSX.</p>
    <template #msg>
      <p>I am a msg slot from TSX.</p>
    </template>
  </ChildTSX>
</template>

<script setup lang="ts">
import ChildTSX from '@cp/context/Child.tsx'
</script>

那么在 JSX / TSX 的子组件,通过 useSlots 来获取父组件传进来的 slots

import { defineComponent, useSlots } from 'vue'

const ChildTSX = defineComponent({
  setup() {
    const slots = useSlots()
    return () => (
      <div>
        <p>{ slots.default ? slots.default() : '' }</p>
        <p>{ slots.msg ? slots.msg() : '' }</p>
      </div>
    );
  },
});

export default ChildTSX;