Umsetzung Vue.js + Datentabellen richtig
Ich versuche zu implementieren Vue.js + jQuery-DataTables-aber gibt es einen seltsamen Dinge geschehen.
Überprüfen Sie diese Geige auf firefox (nicht bei chrome):
http://jsfiddle.net/chrislandeza/xgv8c01y/
wenn ich den Zustand der DataTable (z.B. Sortieren, suchen, etc.):
- Neu hinzugefügte Daten auf der Liste verschwindet
- Der DOM ist nicht das Lesen der Richtlinien oder der vue Eigenschaften
Ich bin mir ziemlich sicher, dass jeder, der versucht zu mischen vue.js+datatables dieses problem erlebt. was haben Sie getan, um dieses Problem zu lösen?
oder ist es eine Reine Vue.js script/plugin, das die gleiche (oder schließen) Funktionalität wie jquery DataTable? (pagination, Suche, Sortierung, Anzahl der Einträge, um zu zeigen, etc.).
hier ist der code von der fiddle über:
HTML:
<div class='container-fluid' id="app">
<div class='row'>
<div class='col-md-9'>
<table class="table table-bordered" id="app-datatable">
<thead>
<tr>
<th>Name</th>
<th>Age</th>
<th></th>
</tr>
</thead>
<tbody>
<tr v-repeat="user: users">
<td>{{ user.name }}</td>
<td>{{ user.age }}</td>
<td>
<button type="button" v-on="click: foo(user)">Action</button>
</td>
</tr>
</tbody>
</table>
</div>
<div class='col-md-3'>
<div class="form-group">
<label>Name</label>
<input type="text"
class="form-control"
v-model="newUser.name"
>
</div>
<div class="form-group">
<label>Age</label>
<input type="name"
class="form-control"
v-model="newUser.age"
>
</div>
<button type="submit" class="btn btn-primary" v-on="click: addUser()">Add</button>
</div>
</div>
</div>
JavaScript:
$(document).ready(function () {
var dT = $('#app-datatable').DataTable();
});
var vm = new Vue({
el: '#app',
data: {
newUser: {},
users: [
{name: 'Chris', age: 1},
{name: 'John', age: 2}
]
},
methods:{
addUser: function(){
this.users.push(this.newUser);
this.newUser = {};
},
foo: function(user){
console.log(user.name);
}
}
});
Anregungen sind wir sehr dankbar.
- die Geige ist nicht arbeiten, weil Sie sich auf githubusercontent direkt -, die Sie verwenden sollten rawgithub.com -> jsfiddle.net/cLd46juf finden Sie unter Verweis GitHub-Datei in jsFiddle
- Das Problem ist das gleiche wie bei der Verwendung der jQuery dataTables Stil in eckig. Beide versuchen, das DOM zu verändern, vue, gewinnt die Schlacht. Traurig zu sagen, ich glaube nicht, dass es eine einfache out-of-the-box-Lösung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bekommen die DataTables-plugin korrekt eingebunden Vue, es gibt ein paar Dinge im Auge zu behalten:
Pro Ihrem Beispiel, können Sie
var dT = $('#app-datatable').DataTable();
zum initialisieren der DataTables wenn Sie bereits die Daten bereit und Verdienste um den DOM. Wenn Sie nicht über die DOM -<table></table>
vollständig dargestellt sind (vielleicht aufgrund der Daten aufgefüllt, die über eine verzögerte ajax-call), können Sie Sie nicht initialisieren DataTables, bis die Daten bereit sind. Als Beispiel, wenn Sie einefetchData
Methode in der Komponente, können Sie initialisieren die DataTable, sobald das Versprechen wurde erfüllt.In der Tabelle zu aktualisieren, sobald Sie initialisiert wurde, vielleicht aufgrund einer änderung in der zugrunde liegenden Tabelle Daten, der besten (vielleicht der einzige Weg), ist die erste zu zerstören, den Tisch, bevor die neuen Daten empfangen und geschrieben, um den DOM von Vue:
Dann, sobald die Daten (in deinem Fall die user-array) aktualisiert worden ist,
re-initialisieren DataTable als so:
Den $nextTick ist notwendig, um sicherzustellen, Vue geleert wurde, die die neuen Daten auf den DOM, vor dem re-initialisieren. Wenn das DOM aktualisiert, nachdem die DataTable-plugin initialisiert wurde, sehen Sie die Daten der Tabelle, aber die übliche Sortierung, paging, etc. wird nicht funktionieren.
Ein weiterer wichtiger Punkt ist, um eine Zeilen-id im dataset, und setzen Sie den Schlüssel in die
<tr></tr>
:<tr v-repeat="user: users" track-by="id">
Ohne die
track-by
, Vue beschweren, wenn Sie Spülen die neuen Daten an den DOM nach DataTables wurde initialisiert, wahrscheinlich nicht findet DOM Elemente, die hi-jacked von DataTables.vielleicht können Sie die verwenden der lifecycle-hooks, infact diese seltsamen Dinge, die verursacht werden durch den Wettbewerb der Manipulation der DOM. in Ihre vue-Instanz, fügen Sie eine erstellt() hook dann initialisieren DataTable einfach wie die folgenden:
});
Habe ich von extern gelieferten Daten zur Tabelle (nicht in ein Ajax-Aufruf von
DataTable
) und zerstören /neu erstellen der Tabelle mit nur diesen lifecycle-hooks ist für mich arbeiten:Vom https://alligator.io/vuejs/component-lifecycle/
"Der beforeUpdate-Haken läuft nach änderung der Daten auf Ihre Komponente und die update-Zyklus beginnt, direkt vor dem DOM ist gepatcht und neu gerendert. Es erlaubt Ihnen, um den neuen Status einer reaktiven Daten auf Ihre Komponente, bevor es tatsächlich gerendert wird."
"Die aktualisierte Haken läuft nach änderung der Daten auf Ihre Komponente und der DOM neu gerendert. Wenn Sie brauchen, um auf das DOM zugreifen, nachdem Sie eine Eigenschaft ändern, hier ist wahrscheinlich der sicherste Ort, um es zu tun."