Vue js достигает дочерних компонентов, дочерних от родителя

У меня есть 3 компонента: Form, Card и Button.

Во-первых, мой компонент Button.vue:

<template>
  <div>
    <slot v-bind = "{ text }">
      <button>{{ text }}</button>
    </slot>
  </div>
</template>

<script setup>
const props = defineProps({
  text: {
    type: String,
    required: true
  }
});
</script>

Вот мой компонент Card.vue:

<template>
  <Button text = "{ text }">
    <template #default = "{ text }">
      <button>{{ text }}</button>
    </template>
  </Button>
</template>

<script setup>
import Button from './Button.vue'

const props = defineProps({
  text: {
    type: String,
    required: true
  }
});
</script>

И наконец, вот мой компонент Form.vue:

<template>
  <div>
    <Card text = "Some text">
      <template #default = "{ text }">
      </template>
    </Card>
  </div>
</template>

<script setup>
import Card from './Card.vue'
</script>

Мой вопрос: как я могу передать текст из Form.vue в Button.vue дочерний компонент?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
61
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Ваш код действительно будет правильным. Однако, если вы хотите передать переменную компоненту в атрибуте HTML, вместо использования text= вам следует использовать :text=.

И вместо передачи объекта { } реквизиты Card.vue и Button.vue ожидают строку. Итак, вместо объекта передайте конкретную строку следующим образом: :text = "myVariableWithStringValue"

Card.vue

<template>
  <Button :text = "buttonText"> <!-- here need use ":text" instead of "text" -->
    <template #default = "{ text }">
      <button>{{ text }}</button>
    </template>
  </Button>
</template>

<script setup>
import Button from './Button.vue'

const props = defineProps({
  // I renamed your prop from 'props.text' to 'props.buttonText' so that we don't get confused by calling everything 'text'
  buttonText: {
    type: String,
    required: true
  }
});
</script>

Form.vue

<template>
  <div>
    <!-- I renamed your prop from 'props.text' to 'props.buttonText' so that we don't get confused by calling everything 'text' --> 
    <!-- If you want give text from variable then can use :buttonText = "variableName" -->
    <!-- Now, just give to "Some text" string as buttonText -->
    <Card buttonText = "Some text"></Card>
    <!-- And you can't use <template> in <Card> because don't have got defined <slot> in Card.vue's template -->
  </div>
</template>

<script setup>
import Card from './Card.vue'
</script>

Площадка Vue3 SFC

Кажется, вы злоупотребляете реквизитами компонентов и слотов, вы можете использовать только именованные слоты:

App.vue

<template>
  <div>
    <Card>
      <template #title>Card title</template>
      Some card content
      <template #button>Some button text</template>
    </Card>
  </div>
</template>

<script setup>
import Card from './Card.vue'

</script>

Card.vue:

<template>
    <h2><slot name = "title"></slot></h2>
    <p>
    <slot></slot>
    </p>
    <Button>
        <slot name = "button"></slot>
    </Button>
</template>

<script setup>
import Button from './Button.vue'
</script>

Кнопка.vue:

<template>
    <div>
      <button><slot></slot></button>
    </div>
</template>

<script setup>
</script>

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