VueJS 中的 Handsontable,table 仅在页面重新加载时加载
Handsontable in VueJS, table loads only on page reload
我在 VueJS 单页应用程序中使用 Handsontable 和 vanilla javascript。使用以下侦听器:
document.addEventListener('DOMContentLoaded', function() ...
table 仅出现在页面刷新时,而不是初始加载时。我也试过使用:
document.addEventListener('load', function() ...
但 table 根本不显示(如果我删除 DOMContentLoaded 侦听器也不显示)。 handsontable 站点上的一些示例,例如 https://docs.handsontable.com/0.18.0/demo-bootstrap.html 使用 DOMContentLoaded 侦听器,其他示例则不使用任何侦听器。
下面是VueJS页面代码。
TableView.vue:
<template>
<div id="example"></div>
</template>
<script>
import Handsontable from 'handsontable'
import 'handsontable/dist/handsontable.full.css'
export default {
name: 'TablesView',
data () {
return {
tableData: {}
}
},
created: function () {
this.populateHot()
},
methods: {
populateHot: function() {
document.addEventListener('DOMContentLoaded', function() {
var data = [
['', 'Kia', 'Nissan', 'Toyota', 'Honda', 'Mazda', 'Ford'],
['2012', 10, 11, 12, 13, 15, 16],
['2013', 10, 11, 12, 13, 15, 16]
]
var container1 = document.getElementById('example')
var hot1 = new Handsontable(container1, {
data: data,
startRows: 2,
startCols: 5
})
})
}
}
</script>
我尝试将 Handsontable 代码移到 VueJS 导出默认块之外,即:
<script>
import ....
var hotData = []
export default {...
// update hotData with ajax loaded data
}
function initializeHandsOn() {...}
document.addEventListener('DOMContentLoaded', initializeHandsOn(), false)
</script>
但我收到 handsontable.js 抛出的错误:
Uncaught TypeError: Cannot read property 'insertBefore' of null(…)
关于如何最好地将 Handsontable 与 VueJS 集成有什么想法吗? (我尝试了 vue-handsontable 和 vue-handsontable-official 但都无法正常工作)?
你可以尝试去掉事件监听器:document.addEventListener('DOMContentLoaded'
直接在mounted
上执行这段代码,因为mounted
在vue中大致等同于DOMContentLoaded
,比如以下:
<script>
import Handsontable from 'handsontable'
import 'handsontable/dist/handsontable.full.css'
export default {
name: 'TablesView',
data () {
return {
tableData: {}
}
},
mointed: function () {
this.populateHot()
},
methods: {
populateHot: function() {
var data = [
['', 'Kia', 'Nissan', 'Toyota', 'Honda', 'Mazda', 'Ford'],
['2012', 10, 11, 12, 13, 15, 16],
['2013', 10, 11, 12, 13, 15, 16]
]
var container1 = document.getElementById('example')
var hot1 = new Handsontable(container1, {
data: data,
startRows: 2,
startCols: 5
})
}
}
</script>
使用 mounted 方法,当你必须使用 mounted 与 created 时最大的区别是你的元素被添加到 DOM。当您需要与其他 non-vue 部件连接时,这是一个很常见的问题。
P.S。您也可以考虑使用替代表,HT 是基于忽略 VNode 思想等的旧技术构建的
我在 VueJS 单页应用程序中使用 Handsontable 和 vanilla javascript。使用以下侦听器:
document.addEventListener('DOMContentLoaded', function() ...
table 仅出现在页面刷新时,而不是初始加载时。我也试过使用:
document.addEventListener('load', function() ...
但 table 根本不显示(如果我删除 DOMContentLoaded 侦听器也不显示)。 handsontable 站点上的一些示例,例如 https://docs.handsontable.com/0.18.0/demo-bootstrap.html 使用 DOMContentLoaded 侦听器,其他示例则不使用任何侦听器。
下面是VueJS页面代码。
TableView.vue:
<template>
<div id="example"></div>
</template>
<script>
import Handsontable from 'handsontable'
import 'handsontable/dist/handsontable.full.css'
export default {
name: 'TablesView',
data () {
return {
tableData: {}
}
},
created: function () {
this.populateHot()
},
methods: {
populateHot: function() {
document.addEventListener('DOMContentLoaded', function() {
var data = [
['', 'Kia', 'Nissan', 'Toyota', 'Honda', 'Mazda', 'Ford'],
['2012', 10, 11, 12, 13, 15, 16],
['2013', 10, 11, 12, 13, 15, 16]
]
var container1 = document.getElementById('example')
var hot1 = new Handsontable(container1, {
data: data,
startRows: 2,
startCols: 5
})
})
}
}
</script>
我尝试将 Handsontable 代码移到 VueJS 导出默认块之外,即:
<script>
import ....
var hotData = []
export default {...
// update hotData with ajax loaded data
}
function initializeHandsOn() {...}
document.addEventListener('DOMContentLoaded', initializeHandsOn(), false)
</script>
但我收到 handsontable.js 抛出的错误:
Uncaught TypeError: Cannot read property 'insertBefore' of null(…)
关于如何最好地将 Handsontable 与 VueJS 集成有什么想法吗? (我尝试了 vue-handsontable 和 vue-handsontable-official 但都无法正常工作)?
你可以尝试去掉事件监听器:document.addEventListener('DOMContentLoaded'
直接在mounted
上执行这段代码,因为mounted
在vue中大致等同于DOMContentLoaded
,比如以下:
<script>
import Handsontable from 'handsontable'
import 'handsontable/dist/handsontable.full.css'
export default {
name: 'TablesView',
data () {
return {
tableData: {}
}
},
mointed: function () {
this.populateHot()
},
methods: {
populateHot: function() {
var data = [
['', 'Kia', 'Nissan', 'Toyota', 'Honda', 'Mazda', 'Ford'],
['2012', 10, 11, 12, 13, 15, 16],
['2013', 10, 11, 12, 13, 15, 16]
]
var container1 = document.getElementById('example')
var hot1 = new Handsontable(container1, {
data: data,
startRows: 2,
startCols: 5
})
}
}
</script>
使用 mounted 方法,当你必须使用 mounted 与 created 时最大的区别是你的元素被添加到 DOM。当您需要与其他 non-vue 部件连接时,这是一个很常见的问题。
P.S。您也可以考虑使用替代表,HT 是基于忽略 VNode 思想等的旧技术构建的