Vue.js — Keep Alive Component — Ошибка следующего тика

Описание

Я пытаюсь воспользоваться keep-alive функциональностью vue-js 2.3, поэтому мой AJAX вызов выполняется только один раз.

Проблема

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

Ошибка в nextTick: TypeError: невозможно прочитать свойство «вставка» неопределенного

TypeError: невозможно прочитать свойство «вставка» из неопределенного

Шаги

Нажмите на кнопку, чтобы отобразить всплывающее окно

Подождите одну секунду

Закрыть всплывающее окно

Нажмите еще раз на кнопку

https://jsfiddle.net/4fwphqhv/

Пример минимальной репродукции

<div id="app">
  <button @click="showDialog = true">Show Component PopUp</button>
  <keep-alive>
      <popup v-if="showDialog" :show-dialog.sync="showDialog"></popup>
  </keep-alive>
</div>

<template id="popup">
    <el-dialog :visible.sync="show" @visible-change="updateShowDialog">{{asyncData}}</el-dialog>
</template>


Vue.component('popup', {
  template: '#popup',
  props : ['showDialog'],
  data(){
    return {
        show: this.showDialog,
      asyncData: "Loading please wait"
    }
  },
  methods: {
   updateShowDialog(isVisible) {
       if (isVisible) return false;
       this.$emit('update:showDialog', false )
   }
  },
   created:function (){
    const _this = this
    setTimeout(() => _this.asyncData = 'Async Data was loaded' , 1000)
  },
});

var vm = new Vue({
  el: '#app',
  data: {
    showDialog: false,
  },
});

Реальный код всплывающего компонента

<template>
    <el-dialog title="Order in progress" size="large" :visible.sync="show" @visible-change="updateShowLoadOrder"></el-dialog>
</template>

<script>
  let popUpData;
  export default {
    name: '',
    data () {
      return {
        ordersInProgress: [],
        show: this.showLoadOrder
      }
    },
    props: ['showLoadOrder'],
    methods: {
      updateShowLoadOrder (isVisible) {
        if (isVisible) return false;
        this.$emit('update:showLoadOrder', false)
      }
    },
    created () {
      const _this = this;
      if (!popUpData) {
        axios.get('api/mtm/apiGetOrdersInProgress').then((response) => {
          _this.ordersInProgress = popUpData = response.data;
        });
      } else {
        this.ordersInProgress = popUpData;
      }
    }
  }
</script>

person Léo Coco    schedule 31.05.2017    source источник
comment
Это определенно компонент диалогового окна element-ui. Вы можете удалить это и заменить чем-то другим, и все будет хорошо. Что-то играет не красиво.   -  person Bert    schedule 31.05.2017
comment
Я отправлю сообщение о проблеме на их github, чтобы узнать, смогут ли они ее исправить. А пока я просто не буду ставить keep-alive   -  person Léo Coco    schedule 31.05.2017
comment
Это обходной путь, который кэширует данные. jsfiddle.net/4fwphqhv/2   -  person Bert    schedule 31.05.2017
comment
Где бы вы определили popupData в одном файловом компоненте? Я попытался поместить его в data, и у меня все еще есть та же ошибка в моем реальном проекте.   -  person Léo Coco    schedule 31.05.2017
comment
перед экспортом по умолчанию, под любым импортом, который вы делаете. Будет ли у вас более одного всплывающего окна? Если это так, возможно, потребуется изменить.   -  person Bert    schedule 31.05.2017
comment
Это все еще не работает. Я обновил тему, добавив реальный код моего элемента popup. Я не вижу серьезных различий, которые могли бы объяснить тот факт, что он работает с вашим jsfiddle, а не с моим проектом.   -  person Léo Coco    schedule 31.05.2017
comment
вы удалили keep-alive не так ли?   -  person Bert    schedule 31.05.2017
comment
Без него действительно лучше работает! Спасибо за обходной путь. Я надеюсь, что element-ui правильно решит проблему.   -  person Léo Coco    schedule 31.05.2017


Ответы (1)


В порядке. Итак, ваша проблема здесь заключается в неправильном крючке жизненного цикла.

Если вы измените created на activated... это должно сработать. Это помогло мне в вашей скрипте JS.

activated:function (){
    setTimeout(() => this.asyncData = 'Async Data was loaded' , 1000)
}

Есть еще два хука, активированные и деактивированные. Это для компонентов проверки активности, тема, которая выходит за рамки этой статьи. Достаточно сказать, что они позволяют определить, когда компонент, заключенный в тег, включается или выключается. Вы можете использовать их для извлечения данных для вашего компонента или обработки изменений состояния, фактически ведя себя как созданный и перед уничтожением без необходимости выполнять полную перестройку компонента.

ИСТОЧНИК: здесь

person peaceman    schedule 31.05.2017
comment
Дважды щелкните Показать всплывающее окно компонента. Вот когда возникает ошибка. Простое изменение события жизненного цикла не решает проблему. - person Bert; 31.05.2017