【问题标题】:Vue.js - Keep Alive Component - Error next TickVue.js - 保持活动组件 - 下一个勾选错误
【发布时间】:2017-05-31 16:34:33
【问题描述】:

说明

我正在尝试利用vue-js 2.3keep-alive 功能,所以我的AJAX 调用只进行一次。

问题

我第二次尝试打开popup 组件时收到此错误:

nextTick 中的错误:“TypeError: Cannot read property 'insert' of undefined”

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>

【问题讨论】:

  • 肯定是element-ui对话框组件。您可以删除它并用其他东西替换它,它工作正常。有什么不好。
  • 我会在他们的github 上发布一个问题,看看他们是否可以解决它。同时,我不会把keep-alive
  • 这是一种将缓存数据的解决方法。 jsfiddle.net/4fwphqhv/2
  • 在单个文件组件中你会在哪里定义popupData?我试图把它放在data 中,但在我的实际项目中仍然有同样的错误。
  • 你把keep-alive去掉了吗?

标签: vue.js vuejs2 keep-alive


【解决方案1】:

好的。所以你的问题是错误的生命周期钩子。

如果您将 created 更改为 activated... 它应该可以工作。它在你的 JS 小提琴中对我有用。

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

还有另外两个钩子,已激活和已停用。这些是用于保持活动的组件,这个话题超出了本文的范围。只要说它们允许您检测包装在标签中的组件何时打开或关闭就足够了。您可以使用它们为您的组件获取数据或处理状态更改,从而有效地按照 created 和 beforeDestroy 进行操作,而无需重新构建完整的组件。

来源here

【讨论】:

  • 单击“显示组件弹出窗口”两次。这就是错误发生的时候。仅仅改变生命周期事件并不能解决问题。
猜你喜欢
  • 2019-07-13
  • 1970-01-01
  • 2017-08-21
  • 1970-01-01
  • 1970-01-01
  • 2018-08-25
  • 1970-01-01
  • 1970-01-01
  • 2018-04-13
相关资源
最近更新 更多