VueJS中的Handsontable,表仅在页面重新加载时加载

时间:2017-04-02 01:24:53

标签: javascript vue.js vuejs2 handsontable

我在VueJS单页面应用程序中使用Handsontable和vanilla javascript。使用以下监听器:

document.addEventListener('DOMContentLoaded', function() ...

该表仅出现在页面刷新上,而不是初始加载。我也尝试过使用:

document.addEventListener('load', function() ...

但该表根本没有显示(如果我删除了DOMContentLoaded监听器也没有显示)。 handontable站点上的一些示例例如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但是在上班时遇到了问题)?

2 个答案:

答案 0 :(得分:2)

您可以尝试删除事件列表器:document.addEventListener('DOMContentLoaded'并直接在mounted上执行此代码,因为vue中的mounted大致相当于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> 

答案 1 :(得分:1)

使用已安装的方法,必须将已安装的vs创建的最大区别是将元素添加到DOM的时间。当您需要与其他非Vue零件连接时,这是一个非常普遍的问题。

P.S。另外,您可能会考虑使用替代表,HT是基于忽略VNode想法等的旧技术构建的。