WedX - журнал о программировании и компьютерных науках

Как получить доступ к реактивным данным дочернего компонента в слоте?

В настоящее время у меня есть родительский компонент, который отображает дочерний компонент, а также передает компонент (модальный, называемый Modal.vue) дочернему в качестве слота.

Parent.vue

<ChildComponent :id='1>
 <modal slot="modal" :postTitle="'test'" />
</ChildComponent>

Child.vue

export default {
props : ['id'],
data(){
return {
 modalHeading : "Heading"
}
}
<template>
<slot name="modal"></slot>
</template>

Modal.vue

<script>
export default {
  name: "model",
  props: ["postTitle"],
  data() {
    return {
      heading: "test"
    };
  },
  mounted() {
    console.log("mounted modal slot");
    console.log(this.postTitle);
    console.log(this.modalHeading);
};
</script>

<template>
  <div>
    <h2>{{ modalHeading }}</h2>
    <h3>This will be the modal slot</h3>
    <p>{{ postTitle }}</p>
  </div>
</template>

У меня вопрос: как я могу получить доступ к дочерним данным (и функциям) в моем компоненте слота?

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


  • Чего именно вы пытаетесь достичь? Конечно, слоты с заданной областью можно использовать для совместного использования некоторых данных Child компонента в шаблоне слота. Но функции? Не думаю. Также только потому, что ваш modal компонент используется внутри шаблона слота с заданной областью, не делает все Child данные доступными для него. Вам все еще нужно передать это modal с помощью реквизита .... 27.11.2019
  • Я пытаюсь в основном отобразить некоторые дочерние данные в модальном слоте. По сути, родительский компонент - это страница, дочерний компонент - это таблица, а слот - модальный. Для каждой нажатой строки таблицы появляется модальное окно с данными таблиц в нем. Как бы вы посоветовали это сделать? 27.11.2019

Ответы:


1

Я пытаюсь в основном отобразить некоторые дочерние данные в модальном слоте. По сути, родительский компонент - это страница, дочерний компонент - это таблица, а слот - модальный. Для каждой нажатой строки таблицы появляется модальное окно с данными таблиц в нем. Как бы вы посоветовали это сделать

Может как то так?

<template>
  <div>
    <table>
      <row v-for="item in items" @click="onRowClick(item)"
         ....show some data
      </row>
    </table>
    <modal v-if="activeItem" :item="activeItem" @onClose="onModalClose" />
  </div>
</template>
<script>
export default {
  name: 'child',
  props: ["items"]
  data() {
    return {
      activeItem: null
    }
  },
  methods: {
    onRowClick(item) {
      this.activeItem = item;
    },
    onModalClose() {
      this.activeItem = null;
    }
  }
}
</script>

Я не понимаю, откуда у этого слота гибкость?

Ну, он не такой гибкий, как слот, но выполняет свою работу :)

Если вам действительно нужно разработать свой дочерний компонент / компонент таблицы таким образом, чтобы можно было использовать его в разных местах и ​​изменить внешний вид его части (детали строки в вашем случае), то вам подойдут слоты. ...

Слоты

Слоты - это точки распространения контента. Когда вы размещаете слот внутри своего компонента, вы говорите: «Мой родительский компонент может предоставить частичный шаблон. Когда этот шаблон отображается (в области родительского компонента - важно, потому что этот шаблон имеет доступ только к родительским данным / methods и т. д.), я возьму полученный результат и помещу его в это точное место внутри моего собственного шаблона ". Использование обычного слота похоже на передачу HTML в ваш компонент.

У меня вопрос: как я могу получить доступ к дочерним данным (и функциям) в моем компоненте слота?

Вы должны предоставить шаблону слота доступ к некоторым дочерним данным явно. Допустим, у вашего дочернего компонента есть свойство item. Вы можете определить в нем слот с ограниченным объемом следующим образом:

<slot name="rowExpander" :itemProp="item"></slot>

... и используйте его внутри родителя следующим образом:

<template v-slot:rowExpander="slotProps">
  <MyRowExpanderComponent :item="slotProps.itemProp" />
</template>

Или с помощью деструктурирования ES2015

<template v-slot:rowExpander="{ itemProp }">
  <MyRowExpanderComponent :item="itemProp" />
</template>

В слот с заданной областью можно передать практически все - data / props / method / computed, вы даже можете использовать свойства экземпляра, такие как $data или $props:

<slot name="rowExpander" :childProps="$props"></slot>

Невозможно передать сам дочерний экземпляр:

<slot name="rowExpander" :child="this"></slot>

(в основном потому, что this не определен внутри шаблона - я думаю, это можно сделать, если вы напишете свой компонент без шаблона с помощью функции рендеринга, но это другая история)

Важно понимать, что шаблон слота с ограниченной областью видимости - это просто обычный шаблон Vue. Он имеет доступ ко всем свойствам экземпляра компонента, в котором он определен (родительский) и дополнительно к объекту slotProps. Когда вы используете компонент внутри шаблона слота с ограниченной областью видимости, этот компонент не имеет доступа ко всем дочерним данным или slotProps автоматически - вам все равно нужно передать его ему явно ( как в моем MyRowExpanderComponent примере выше)

27.11.2019
  • Я не понимаю, откуда у этого слота гибкость? Скажем, вместо модального окна, появляющегося при щелчке, я хотел, чтобы высота строки увеличивалась, а другая таблица появлялась под строкой, по которой щелкнули мышью. Как этого добиться? Я думал, что можно будет проанализировать компонент, который я хотел бы отобразить в качестве слота в моем компоненте таблицы? 28.11.2019
  • Прочтите Scoped Slot в документе, чтобы узнать последние новости о решении таких проблем: vuejs.org/v2/guide/components-slots.html#Scoped-Slots 12.07.2020
  • Новые материалы

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

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]