Vue JS воссоздает корневой компонент

Мне нужно уничтожить и воссоздать корневой компонент приложения. Это мой шаблон:

<div id = "app">
  {{ num }}
</div>

И это мой код:

 if (app) {
      app.$destroy();
    } else {
      app = new Vue(Object.assign({
        el: '#app',
      }, { data: { num: Math.random() } }))
    }

Этот код запускается при нажатии кнопки, но он не очищает шаблон и не обновляет новые данные, которые я передаю. Есть идеи, почему?

Вы можете использовать app. $ ForceUpdate ()

Patrick Hollweck 26.08.2018 15:13

Если установлен app, то будет вызываться app.$destroy(), но app = new Vue не потому, что он находится в блоке else, поэтому он не будет воссоздан (app.$destroy не будет волшебным образом очистить переменную app). Но как вы хотите это сделать, вместо того, чтобы обновлять данные?

t.niese 26.08.2018 15:13

Это не полная история; Мне нужна эта функциональность.

undefined 26.08.2018 15:24

Зачем вам нужен этот функционал? Пожалуйста, уточните, если вы этого не сделаете, мы можем только угадать

Patrick Hollweck 26.08.2018 15:26
Поведение ключевого слова "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
4
984
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Чтобы обновить свой компонент, вы можете использовать

this.$forceUpdate()

для принудительной перезагрузки компонента.

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

undefined 26.08.2018 15:28
Ответ принят как подходящий

Я почти уверен, что ваша попытка решить проблему таким образом, чтобы она не решалась, или что вы неправильно используете vue.

Но у вас проблема, когда вы выполняете этот код:

if (app) {
  app.$destroy();
}

Тогда в документации указано:

Completely destroy a vm. Clean up its connections with other existing vms, unbind all its directives, turn off all event listeners.

Поэтому они не говорят, что элемент, к которому прикреплено приложение vue, должен измениться или изменится. Если вы хотите очистить DOM, вам нужно удалить содержимое вручную.

После app.$destroy() переменная app все еще будет содержать уничтоженный экземпляр vue (app не будет сброшен волшебным образом). Таким образом, повторное выполнение кода не вызовет срабатывания блока else. Вы также должны установить app на то, что считается ложным.

if (app) {
  app.$destroy();
  app = undefined;
}

Теперь app - это undefined, поэтому при следующей оценке состояния if будет оценен блок else и будет создан новый экземпляр.

Вы можете создать плункер? Это все еще не работает. Взгляд не меняется.

undefined 26.08.2018 15:42

@undefined вы, скорее всего, не восстанавливали содержимое app, чтобы снова содержать временную разметку. Потому что этот рабочий пример работает нормально. Но все же это, скорее всего, неправильный способ решения проблемы, чего бы вы ни хотели достичь.

t.niese 26.08.2018 15:53

@undefined это то, что вы написали в своем коде. Выньте new Vue из блока else, и вам не нужно будет щелкать. Вы не очень осведомлены о том, что именно вы хотите делать и почему.

t.niese 26.08.2018 15:58

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