Как получить реквизиты в API композиции vue3

Я пытаюсь написать компонент контейнера «A» для компоновки стороннего компонента «Tree», чтобы использовать A, я использую «inheritAttrs», чтобы получить все реквизиты и события «Tree»:

<template>
    <Tree v-bind = "$attrs" />
</template>
<script lang = "ts">
  export default {
    inheritAttrs: true,
  };
</script>
<script lang = "ts" setup>
  import { Tree } from 'ant-design-vue';
  import { onMounted, PropType, toRef, unref, ref, toRefs } from 'vue';
  function A() {
      // this is not working
      console.info(props);
   }

</script>

как я могу получить некоторые атрибуты реквизита, наследуемые от «Дерева» в функции A?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
96
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

«Наследовать атрибуты»

Во-первых, наследовать атрибуты не означает наследование реквизита, inheritAttrs установленное значение true означает, что вы автоматически наследуете атрибуты (не реквизит) и привязываете эти атрибуты к корневому узлу компонента.

Что такое «Атрибуты»?

Некоторыми распространенными являются атрибуты class, style, id, disabled, required и minlength, и это лишь некоторые из них. В основном все нативные HTML-атрибуты адресуются с помощью inheritAttrs.

Как получить доступ к объекту props внутри <script setup>?

В API композиции вам необходимо явно указать определять реквизиты в <script setup>, чтобы иметь возможность использовать объект props.

В компонентах с одним файлом (SFC) с помощью свойства могут быть объявлены с помощью макроса defineProps():

<script setup>
  const props = defineProps(['foo'])

  console.info(props.foo)
</script>

Подробнее: Что, если у меня есть prop с тем же именем, что и attribute?

Давайте настроим пример. Вы определяете реквизит с именем disabled в MyComponent.vue.

MyComponent.vue

<template>
   <Tree v-bind = "$attrs"/>
</template>

<script setup>
   const props =  defineProps({
      disabled: Boolean,
   })
   
   console.info(props.disabled); // this works
</script>

... а затем добавьте компонент вот так, передав disabled. Обратите внимание, что :disabled = "true" и просто disabled означают одно и то же в обоих случаях — независимо от того, определены реквизиты или нет.

App.vue

<MyComponent disabled />

Поскольку вы определили реквизиты с помощью, defineProps() у v-bind = "$attrs" больше не будет disabled в качестве атрибута в объекте $attrs. Это так же, как объясняют документы:

Vue components require explicit props declaration so that Vue knows what external props passed to the component should be treated as fallthrough attributes...

Другими словами, если вы не определите props, они будут рассматриваться как attributes.

Спасибо, теперь я знаю, как это сделать: просто повторно объявил атрибут, который мне нужен, в моем пользовательском компоненте.

learn to code 23.03.2022 02:26

Вы можете определить безопасные для типов реквизиты с помощью Typescript и Composition API (<script setup lang = "ts" />), например:

<script setup lang = "ts">
const props = defineProps({
  foo: { type: String, required: true },
  bar: Number
})

props.foo // string
props.bar // number | undefined
</script>

However, it is usually more straightforward to define props with pure types via a generic type argument:

<script setup lang = "ts">
interface Props {
  foo: string,
  bar?: number
}
const props = defineProps<Props>()

props.foo // string
props.bar // number | undefined
</script>

См. Документы. Если вы хотите также установить значения по умолчанию. См. здесь

Другие вопросы по теме