Vue Teleport внутри теневого дома

Контекст:

У меня есть приложение Vue, отображаемое внутри теневого дома. Там у меня довольно много вариантов использования, где мне нужны телепорты (https://vuejs.org/guide/built-ins/teleport.html).

Обратите внимание, что несколько вариантов использования основаны на Primevue: https://www.primefaces.org/primevue/autocomplete Но я могу сказать, что все варианты использования используют: https://github.com/primefaces/primevue/blob/master/src/components/portal/Portal.vue

Для телепортов требуется действительный селектор CSS:

Цель to ожидает строку селектора CSS или фактический узел DOM. Здесь мы, по сути, говорим Vue «телепортировать этот фрагмент шаблона в тег body».

Проблема

Однако, за исключением «я», не удалось найти селектор CSS, который мог бы углубиться в теневой DOM.

Я смог телепортироваться куда угодно, но только не в теневой Дом.

Код и мои попытки:

<HTML>
  ...
  <body>
     ...
     <customComponent id = "customElement">
        # shadow-root(open)
            <div id = "mainElement"
            ...
              <Dialog
                  v-model:visible = "showDialog"
                  appendTo = "mainElement"   
              >
            ...
               <div id = "teleportTarget"></div>
            ...
               <teleport
                  to = "#teleportTarget"
               >
            ...

Я также попробовал решение отсюда: https://forum.vuejs.org/t/how-can-i-use-teleport-inside-a-custom-webelement/130423/2 Но в отличие от Vue, PrimeVue принимает только строки. Даже если я использовал это решение, я не смог заставить его работать.


  async mounted() {
    const shadow = document.querySelector("#customElement")?.shadowRoot;
    await this.$nextTick();   //I tried with and without nextTick
    this.teleportTarget = shadow?.firstElementChild;
    console.info(this.teleportTarget);  //==> null
  },

Вопрос

Есть ли селектор запросов, который может углубиться в теневой дом, который можно использовать для телепортов Vue.

«Но в отличие от Vue, PrimeVue принимает только строки» — нет, он принимает те же значения, что и телепорт, это можно увидеть в исходном коде, свойство appendTo просто набирается таким образом. Попробуйте использовать const shadow после nextTick. Обычно это делается так, если это не работает, пожалуйста, предоставьте способ отладки

Estus Flask 13.09.2022 10:21
Поведение ключевого слова "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
1
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Кажется, я столкнулся с проблемой жизненного цикла. Решение заключалось в том, чтобы «задержать» рендеринг элемента телепорта следующим образом:


  <Dialog
    v-if = "ready"
    :appendTo = "teleportTarget"
  >
....
 data() {
    return {
      teleportTarget: null,
      ready: false,
    };
  },
 mounted() {
    this.teleportTarget = this.$el.parentNode.firstElementChild;
    this.ready = true;
  },

Я обнаружил, что использование this.$el является более «виртуальным» решением, но оно также работает с document.

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