【发布时间】:2017-05-31 16:34:33
【问题描述】:
说明
我正在尝试利用vue-js 2.3 的keep-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