如何使用 Vue.js 将 DataTable() 与数组中的数据(v-for 循环)附加到现有的 HTML <table>?

Posted

技术标签:

【中文标题】如何使用 Vue.js 将 DataTable() 与数组中的数据(v-for 循环)附加到现有的 HTML <table>?【英文标题】:How to attach DataTable() to existing HTML <table> with the data in array (v-for loop) using Vue.js? 【发布时间】:2019-10-03 17:18:35 【问题描述】:

我在 Vue.js 中遇到问题,无法将我的表设为 DataTable(带有搜索字段、排序列等)。

我在&lt;head&gt; 中调用原来的datatable.min.js,或者拥有并调用另一个拥有的custom.js 文件:

$(document).ready(function()
   $("#zero_configuration_table").DataTable()
);

如何像在 jQuery $('#zero_configuration_table').DataTable(); 中一样调用和/或附加?

我不知道我应该把那个代码放在哪里让它工作。

我无法应用此 https://codepen.io/feload/pen/PJKoJP?editors=1010 中的示例。甚至来自https://datatables.net/。

在我的 .vue 文件中,我称之为“表格页面”:

<template>
...
<div class="table-responsive">
<table id="zero_configuration_table" class="display table table-striped table-bordered table-hover" style="width:100%">
<caption>Popis pristiglih prijava korisnika aplikacije</caption>
<thead class="thead-dark">
<tr>
<th scope="col">DATUM I VRIJEME</th>
<th scope="col">OSOBA</th>
<th scope="col">SADRŽAJ PORUKE</th>
<th scope="col">KONTAKT INFORMACIJE</th>
</tr>
</thead>
<tbody>
<tr v-for="ci in chatItems">
<td class="align-middle"><strong>ci.datumPoruka | formatDate</strong> u <strong>ci.datumPoruka| formatDateVrijeme</strong></td>
<td class="align-middle"><a :href="ci.fotografijaKorisnik" title="Pogledaj uvećanu fotografiju korisnika" target="_blank"><img :src="ci.fotografijaKorisnik" :   class="okrugla"></a> ci.imeKorisnik</td>
<td v-if="ci.sadrzajPoruka.length && !ci.datotekaPoruka.length && !ci.kartaLat.length" class="align-middle">ci.sadrzajPoruka</td>
<td v-else-if="!ci.sadrzajPoruka.length && ci.datotekaPoruka.length && !ci.kartaLat.length" class="align-middle"><a :href="ci.datotekaPorukaURL" target="_blank" title="Pogledaj uvećanu fotografiju" class="btn btn-md btn-primary">Pogledaj uvećanu fotografiju <em class="fa fa-external-link"></em></a></td>
<td v-else-if="!ci.sadrzajPoruka.length && !ci.datotekaPoruka.length && ci.kartaLat.length" class="align-middle"><a :href="'https://www.google.com/maps/place/'+ci.kartaLat+','+ci.kartaLong" target="_blank" title="Pogledaj na karti" class="btn btn-md btn-primary">Pogledaj na karti <em class="fa fa-external-link"></em></a></td>
<td v-else class="align-middle">Prazna poruka</td>
<td class="align-middle"><a :href="'mailto:'+ci.emailKorisnik" title="Pošalji e-mail"><em class="fa fa-envelope"></em>&nbsp;ci.emailKorisnik</a><br><em class="fa fa-phone"></em>&nbsp;ci.telefonKorisnik</td>
</tr>
</tbody>
</table>
</div>
...
</template>

默认导出时,在 data() 下我有数据数组:

data() 
    return 
         chatItems: []
    
,

Under 创建了从 FireBase 获取特定数据的代码,然后在 &lt;template&gt; 中使用 v-for 显示数据:

created: function()
    $('#scroll_horizontal_table').DataTable(); // THIS IS THE PROBLEM, HOW AND WHERE TO PUT?

    this.userData(),
    db.ref("chatmodel")
    .once("value")
    .then(dataSnapshot => 
      const itemsArray = [];
      dataSnapshot.forEach(childSnapshot => 
        const childData = childSnapshot.val();
        itemsArray.push(
          fotografijaKorisnik: childData.userModel.photo_profile,
          imeKorisnik: childData.userModel.name,
          telefonKorisnik: childData.userModel.phoneNumber,
          emailKorisnik: childData.userModel.email,
          datumPoruka: childData.timeStamp,
          sadrzajPoruka: childData.message,
          datotekaPoruka: childData.fileModel.name_file,
          datotekaPorukaURL: childData.fileModel.url_file,
          kartaLat: childData.mapModel.latitude,
          kartaLong: childData.mapModel.longitude
        );
      );
      this.chatItems = itemsArray; // reverse()
    );
,
...

似乎一切正常,dataTable 没有错误,但它只是没有根据需要呈现为带有分页、搜索字段等的默认表。

我不知道为什么。

任何帮助将不胜感激。

谢谢

【问题讨论】:

我正在使用 jquery-3.3.1.min.js 和 Bootstrap 需要稍等,所以设置setTimeout(function() $("#zero_horizo​​ntal_table").DataTable(); , 4000); // 等待 4 秒。然后渲染分页、搜索字段等。 【参考方案1】:

好的,我已经提前调用了 DataTable(),所以数据还没有从 FireBase 中获取,也没有被渲染。

在方法下,我已经很少了,所以只是做了一个超时:

methods: 
    userData:function()
        var user = firebase.auth().currentUser;
        var name, email, photoUrl, uid;

        setTimeout(function()  $("#zero_horizontal_table").DataTable(); , 4000);
         // WAIT FOR 4 SECONDS AND THEN APPLY DATATABLE()

...

现在可以了。显示分页等。

【讨论】:

以上是关于如何使用 Vue.js 将 DataTable() 与数组中的数据(v-for 循环)附加到现有的 HTML <table>?的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js - 具有动态组件的多个事件

用vue js隐藏表格列

如何将 Vue.js 与 Flask 结合使用?

如何将 vue.js 与sails js 一起使用

如何将 PWA 添加到不是使用 Vue CLI 创建的 Vue.js 3 应用程序?

如何使用 vue-router 将 Bootstrap 安装到这个 Vue.js 项目中?