VueJS $ children пусто при использовании слотов в сборке веб-компонента - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь создать два пользовательских элемента с VueJS, чтобы они могли быть вложены и использованы на любой веб-странице или CMS, таких как Wordpress или каркас веб-приложения, без npm / webpacker et c. Думайте об этом как о создании пары пользовательских <ul> и <li> элементов с VueJS. Это минимальный пример, который воспроизводит мою проблему:

Я создал два отдельных файловых компонента:

components/MinimalInner.vue:

<template><p>Inner</p></template>

<script>export default {}</script>

components/MinimalOuter.vue:

<template>
    <div>Outer<slot>default slot text</slot></div>
</template>

<script>
export default {
    mounted() {
        console.log(this.$children.length, " children");
    }
}
</script>

И, наконец, это мой App.vue:

<template>
  <div id="app">
    <MinimalOuter>
      <MinimalInner></MinimalInner>
    </MinimalOuter>
  </div>
</template>

<script>
import MinimalInner from "./components/MinimalInner.vue";
import MinimalOuter from "./components/MinimalOuter.vue";

export default {
  components: {
    MinimalInner,
    MinimalOuter
  }
};
</script>

Когда я запускаю это как Vue Компоненты через vue serve -o App.vue, я получаю ожидаемый результат в console: 1 children при подключении MinimalOuter.

Но когда я обслуживаю указанный ниже файл HTML, используя сборку веб-компонента, сгенерированную с помощью vue-cli-service build --target wc --name fc 'components/*.vue', я получаю 0 children. В консоли браузера ошибки не отображаются.

minimal.html:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <script src="https://unpkg.com/vue"></script>
  <script src="dist/fc.js"></script>
</head>

<body>
    <fc-minimal-outer>
        <fc-minimal-inner></fc-minimal-inner>
    </fc-minimal-outer>
</body>
</html>

Каким-то образом $children пусто при использовании MinimalOuter в качестве веб-компонента с <slot> s. Документы по https://vuejs.org/v2/api/#vm -детям говорят только о том, что $children не реагирует и порядок не гарантируется. Я не думаю, что массив $children ожидается пустым, когда дочерний компонент был передан через <slot>, но я могу ошибаться.

Чего я пытаюсь достичь в целом:

Мой сценарий использования для доступа к $children - создание пользовательского интерфейса для отработки флэш-карт, и фактический код можно увидеть здесь : https://github.com/learn-awesome/flashcard/tree/master/components. По сути, внешний компонент можно рассматривать как карусель, а внутренние компоненты представляют собой слайды. Показывается только первый слайд, но при взаимодействии с пользователем можно либо сделать первый слайд до последней позиции, либо удалить его из набора. Итак, я надеюсь, что $children будет массивом VueComponent экземпляров, точно так же, как я получаю с vue serve -o App.vue, чтобы я мог вызвать $destroy для них. Мне также потребуется способ вызова метода для внешнего элемента, когда пользователь нажимает кнопку во внутреннем элементе. В настоящее время я делаю это с:

      if(this.$parent && this.$parent.doSomething)
        this.$parent.doSomething();

, но мне нужен подход, который работает как в vue serve -o App.vue, так и в пользовательском элементе (<fc-minimal-outer> and <fc-minimal-inner> версии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...