Как визуализировать экземпляр компонента с помощью функции h() в Vuejs?

У меня есть компонент Vuejs, который выглядит так:

<template>
  <button @click = "generateItem()">Add item</button>
  <div class = "container"></div>
</template>

<script setup>
  import { h } from 'vue'
  import MyItem from '@/components/MyItem.vue'

  function generateItem(){
    return h(MyItem)
  }
</script>

Я пытаюсь использовать функцию h() для визуализации экземпляра MyItem внутри div.container при запуске generateItem(). Но после прочтения официальной документации Vuejs по функции h() я не понимаю, как это сделать. Мысли о том, как это сделать?

Возможно, функция уже работает, но вам нужно указать ей место для вставки сгенерированного виртуального узла. Возможно, попробуйте использовать v-if где-нибудь в вашем шаблоне, чтобы затем вставить новый компонент. Кроме того, нужны ли вам здесь функции рендеринга? Не можете ли вы вставить компонент напрямую?

kissu 27.06.2024 09:46

@kissu, как мне вставить vNode в DOM? Должен ли я использовать функцию рендеринга?

gespinha 27.06.2024 10:47

Если вам нужна функция рендеринга, я помещу ее в компонент и v-if при необходимости. Вы тоже можете пойти по этому пути, но прежде всего нужно знать, нужна ли вам вообще функция рендеринга. Чего именно вы пытаетесь достичь?

kissu 27.06.2024 10:58

@kissu компонент, который я пытаюсь отобразить, — это всплывающее уведомление. Я бы хотел, чтобы он отображался, когда я вызываю определенную функцию.

gespinha 27.06.2024 12:50

Я не уверен, чем это может быть полезно для всплывающего уведомления, попробуйте лучше это . Есть пример модального окна, не слишком отличающийся от тоста. Функции рендеринга здесь бесполезны.

kissu 27.06.2024 15:19
Поведение ключевого слова "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) для оценки ваших знаний,...
0
5
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я считаю, что функция рендеринга не предназначена для использования с <script setup>. Он используется как гибкая альтернатива программному объявлению функции рендеринга вместо использования template внутри Vue SFC.

Тем не менее, вы можете добиться рендеринга сгенерированного элемента следующим образом:

<script setup>
  import { h, ref, shallowRef } from 'vue'
  import MyItem from './MyItem.vue'


  const component = shallowRef(null)
  function generateItem(){
    component.value = MyItem
  }
</script>

<template>
  <button @click = "generateItem()">Add item</button>
  <div class = "container">

    <component v-if = "component" :is = "component" :testStr = "'The test str from App.vue'"></component>
  </div>
</template>

(см. URL-адрес этой игровой площадки здесь: Vue SFC Playground)

Это также работает, если вы используете h(), но я считаю, что в этом нет необходимости:

component.value = h(MyItem)

Поскольку MyItem будет использоваться в качестве всплывающего уведомления, мне нужно будет создать несколько. Если я использую <компонент> в качестве заполнителя, он будет отображать все уведомления в одном и том же слоте, а не накладывать новые уведомления друг на друга, верно?

gespinha 27.06.2024 14:58

Зависит от стиля ваших компонентов, но вы должны иметь возможность визуализировать их все и соответствующим образом стилизовать их, используя v-for и css.

Tobias Braun 27.06.2024 20:33
Ответ принят как подходящий

Используйте v-for (адаптируйте под свои нужды):

Детская площадка

<template>
  <button @click = "generateItem()">Add item</button>
  <div class = "container">
    <my-item v-for = "item in items">{{ item }}</my-item>
  </div>
</template>

<script setup>
  import { reactive } from 'vue'
  import MyItem from './MyItem.vue'
  const items = reactive([]);
  let counter = 1;
  function generateItem(){
    items.push('Item ' + counter++)
  }
</script>

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