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

Как получить значение от дочернего компонента к родительскому на nuxt.js?

Я застрял, пытаясь передать данные из дочернего компонента A ($ emit) в родительский и из родительского в дочерний B (реквизиты).

Используя nuxt.js, у меня есть:

макеты / default.vue

Этот шаблон по умолчанию загрузит множество компонентов. Эти компоненты будут использоваться или нет в зависимости от переменной из дочернего элемента, переменная будет устанавливать директиву v-if.

Дети - это такие страницы, как:

страницы / блог / index.vue страницы / о / index.vue ...

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

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

Идея на layout / default.vue.

<template>
    <div>
        <TopBar v-if=showTopBar></TopBar>
        <Nav v-if=showNav></Nav>
        etc...
        <nuxt />
    </div>
</template>

<script>

import TopBar from "../components/TopBar";
import Nav from "../components/Nav";
etc...

export default {
    data() {
        return {
            showTopBar: false,
            showNav: false
            etc...
        };
    },
}

</script>


На дочернем элементе уже есть $ emit, но не повезло.

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

Цель состоит в том, чтобы иметь что-то вроде двойного пути между дочерними компонентами, например:

Вызов маршрута / блога вызовет страницы / блог / index.vue

Это отправит в layout / default.vue с помощью $ emit, какие компоненты будут отображаться (выбираются пользователем в области администрирования и извлекаются из API) и идентификатор компонента. (пример: {topBar: true, topBarID: 2})

В макетах / default.vue после получения $ emit из страниц / blog / index.vue у меня было бы, например, TopBar false, а затем не отображать его или получить true с идентификатором, этот идентификатор будет отправлен в TopBar как опора для рендеринга настроенного TopBar, созданного пользователем в админке.

Возможно, кто-нибудь покажет пример, как получить эти данные для этого конкретного сценария, пожалуйста? (Не имеет значения, если вы используете локальные переменные из дочернего компонента или vuex, просто ищите пример, как получить содержимое переменной из дочернего компонента вместо простого объекта или неопределенного объекта).

PS: Если есть лучший подход к работе с динамическими макетами, я тоже принимаю предложения.

PS2: Я знаю, что буду использовать определенный шаблон для каждой страницы, например макет / блог, макет / контакт и т. Д., Но поскольку идея заключается в создании CMS, это не подходит для этого сценария, я имею в виду, из области администратора пользователь должен иметь возможность создавать страницы, включающие или отключающие компоненты с помощью мастера страниц (идея получает что-то вроде Wix, каждая настройка компонента от пользователя будет храниться в базе данных с использованием идентификатора, а в макетах пользователь выбирает предыдущие компоненты, монтирующие страницу , в конце концов, все вызовы будут выполняться с использованием их идентификаторов), и не нужно добавлять конкретное программирование макетов, потому что эта идея установить все возможные компоненты и макеты в layout / default.vue на данный момент кажется лучшим подходом, но если это не так, мне бы хотелось увидеть другие способы достижения той же цели.


Ответы:


1

Правильный способ сделать это:

<child-component-1 :showNav.sync="showNav">

А внутри дочернего компонента вы бы обновили это, выполнив:

this.$emit('update:showNav', value)

Родитель определил бы это свойство:

data() {
  return {
    showNav: default_value
  }
}

Вам нужно будет передать эту переменную каждому дочернему компоненту. Каждый дочерний компонент должен определить его как свойство.

Возможно, лучший способ сделать это - вместо этого создать простой store в nuxt и использовать его для хранения настроек.

22.07.2019
  • Спасибо за помощь @Ohgodwhy !!! Я еще не понял, как заставить его работать. Судя по вашему совету, я включил vuex с помощью: export const state = () = ›({layout: [{topBar: true, topBarID: 2}]}); А в layout / default.vue я могу получить к нему доступ с помощью: computed: {useTopBar () {return this. $ Store.state.blog.layout; }}, Это дает мне доступ к массиву, это почти то, что я ищу. Я добавлю новый ответ с более подробной информацией, а также обновлю основной вопрос. 23.07.2019
  • Точка использования $ emit из Page (Child) заключается в том, что этот способ не требуется для новых страниц, добавляя в layout / default.vue новые вычисляемые функции для каждой новой страницы. Вместо этого просто проверьте, отправляет ли страница информацию о том, какой компонент будет отображаться, и идентификатор этого компонента, например, topBar и какой из них следует использовать (идентификатор). Я пытаюсь сделать что-то вроде Wordpress в виде маленькой CMS. Компонент TopBar сам будет получать данные для рендеринга с использованием идентификатора, полученного в качестве опоры. Не знаю, имеет ли это для вас смысл. Если у вас есть лучший способ, скажите, пожалуйста. 23.07.2019
  • Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

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

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

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


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