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

Как запустить компонент в родительском vue?

Я использую Laravel 6 (смесь) + Vue.js 2.

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

Внутри index.blade.php

<div class="modal fade" id="modal-addItem">
    <form>
        <div class="card" v-for="(value, index) in nbDefinitions">
            <div class="card-header">@{{ value }}.</div>
            <div class="card-body">
                <dl class="row">
                    <dt class="col-sm-3">English</dt>
                    <dd class="col-sm-9">
                        <autocomplete data-language="english" :search="searchDefinition" :get-result-value="getDefinitionResultValue" @submit="handleSearchDefinitionSubmit"></autocomplete>
                    </dd>
                    <dt class="col-sm-3">French</dt>
                    <dd class="col-sm-9">
                        <autocomplete data-language="french" :search="searchDefinition" :get-result-value="getDefinitionResultValue" @submit="handleSearchDefinitionSubmit"></autocomplete>
                    </dd>
                </dl>
            </div>
        </div>
        <div class="row">
            <button type="button" class="btn btn-primary" id="addItems-addDefinition" @click="addDefinition">+ Add definition</button>
        </div>
    </form>
</div>

Внутри myCustom.js

new Vue({
    el: '#modal-addItem',
    data:  {
        nbDefinitions: 0,
        nbSentencesPerDef: [],
        translatedDefinitions: []
    },
    methods: {
        addDefinition: function() {
            this.nbDefinitions++;
            this.nbSentencesPerDef.push(1);
            this.translatedDefinitions.push({
                english: null,
                french: null
            });
        },
        searchDefinition: function (input) {
            // How can I know which <autocomplete> is triggered?
            return new Promise(resolve => {
                if (input.length < 3) { return resolve([]); }
                fetch(`/api/v1/definitions?search=${encodeURI(input)}`)
                .then(response => response.json())
                .then(responseJson => {
                    resolve(responseJson.definitions);
                })
            })
        },
        getDefinitionResultValue: function(result) {
            // How can I know which <autocomplete> is triggered?
            let definition = result.definition;
            let item = result.item.name;
            return `${item} - ${definition}`;
        },
        handleSearchDefinitionSubmit: function(result) {
            // How can I know which <autocomplete> is triggered?
            console.log(this);
        }
    }
});

Я использую autocomplete, который является внешним компонентом, загружаемым глобально (в основном app.js Laravel) https://autocomplete.trevoreyre.com/#/

Мой вопрос: как я могу узнать внутри методов «addDefinition», «searchDefinition» и «handleSearchDefinitionSubmit», какой дочерний компонент был запущен? Поскольку у меня есть 3 компонента автозаполнения внутри моего объекта Vue, а this относится к корню (в моем случае модальное html), поэтому я понятия не имею, какой дочерний элемент автозаполнения был запущен. Также this.$refs пуст.

Может быть, это архитектурная проблема, но у меня недостаточно опыта, чтобы понять, как это сделать.


  • вы жестко кодируете языки, как показано в вашем примере? Если это так, вы всегда можете создать searchEnglishDefinition, searchFrenchDefinition и т. д., которые вызывают searchDefinition, например searchDefintion(input, 'english'). 24.11.2019
  • или - посмотрите на эту проблему - это не совсем то, о чем вы спрашиваете, но это может пролить свет 24.11.2019

Ответы:


1

Сам компонент не поддерживает это напрямую (например, передавая себя в качестве параметра функций). Но, к счастью, в случае функций, переданных в качестве реквизита, мы можем использовать функцию JS, называемую «замыканием» — вместо простого имени функции вызывать функцию, которая возвращает другую функцию. В случае событий мы можем использовать функцию Vue, позволяющую нам получить доступ к специальному значению «$event» при определении обработчиков.

Как это:

  • до: <autocomplete data-language="english" :search="searchDefinition" @submit="handleSearchDefinitionSubmit" />
  • после: <autocomplete data-language="english" :search="getSearchDefinitionFunc('english')" @submit="handleSearchDefinitionSubmit($event, 'english')" />

... и измените свои методы следующим образом:

    getSearchDefinitionFunc(lang) {
      return input => this.searchDefinition(input, lang);
    },
    searchDefinition: function(input, lang) {
      console.debug(`searchDefinition called with "${input}" and "${lang}"`);

      if (input.length < 3) {
        return Promise.resolve([]);
      }

      // ...don't create new Promise, just return an existing one
      return fetch(`/api/v1/definitions?search=${encodeURI(input)}`)
          .then(response => response.json())
          .then(responseJson => responseJson.definitions);
    },
    handleSearchDefinitionSubmit: function(result, lang) {
      console.log(`Submit: ${lang}`);
    }

Я также немного реорганизовал ваш код, так как создание нового обещания не требуется.

Вы можете найти рабочий пример здесь

Можно еще больше реорганизовать, определив ваши языки в данных компонента (['english', 'french']) и сгенерировав каждую строку, используя v-for

24.11.2019
Новые материалы

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

Работа с цепями Маркова, часть 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]