Javascript 实现Vue.js+;正确使用数据表
我正在尝试实现Vue.js+jQuery的DataTables,但是发生了一件奇怪的事情 在firefox上检查此小提琴(不适用于chrome): 当我更改DataTable的状态(例如排序、搜索等)时:Javascript 实现Vue.js+;正确使用数据表,javascript,jquery,datatables,vue.js,Javascript,Jquery,Datatables,Vue.js,我正在尝试实现Vue.js+jQuery的DataTables,但是发生了一件奇怪的事情 在firefox上检查此小提琴(不适用于chrome): 当我更改DataTable的状态(例如排序、搜索等)时: 列表中新添加的数据将消失 DOM没有读取指令或vue属性 我敢肯定,任何试图混合使用vue.js+datatables的人都会遇到这个问题。你做了什么来解决这个问题 或者是否有一个纯Vue.js脚本/插件具有与jquery的DataTable相同(或相近)的功能?(分页、搜索、排序、要显
- 列表中新添加的数据将消失
- DOM没有读取指令或vue属性
非常感谢您的建议。要使DataTables插件与Vue正确集成,请记住以下几点:
var dT=$('#app datatable').datatable()如果已经准备好数据并呈现给DOM,则使用code>初始化数据表。如果没有完全呈现DOM
(可能是由于通过延迟的ajax调用填充了数据),则在数据准备就绪之前无法初始化数据表。例如,如果组件中有fetchData
方法,则可以在承诺实现后初始化DataTable
var dT = $('#app-datatable').DataTable();
dT.destroy();
然后,一旦数据(在您的例子中是用户数组)被更新,
重新初始化数据表,如下所示:
this.$nextTick(function() {
$('#app-datatable').DataTable({
// DataTable options here...
});
})
$nextTick是确保Vue在重新初始化之前已将新数据刷新到DOM所必需的。如果在初始化DataTable插件后更新DOM,您将看到表数据,但通常的排序、分页等将不起作用
中设置键:
如果没有track by
,则在初始化DataTables后将新数据刷新到DOM时,Vue将发出抱怨,这可能是因为找不到DataTables占用的DOM元素也许您可以使用生命周期挂钩,事实上,这些奇怪的事情是由操纵DOM的竞争引起的。在vue实例中,添加一个created()钩子,然后初始化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);
}
},
created(){
this.$nextTick(function() {
$('#app-datatable').DataTable();
})
}
})) 我从外部提供了表数据(不是来自
DataTable
的Ajax调用),仅使用这些生命周期挂钩销毁/重新创建表对我来说是可行的:
beforeUpdate: function() {
if (this.dataTable) {
this.dataTable.destroy()
}
},
updated: function() {
this.dataTable = $(this.$el).DataTable()
}
从
beforeUpdate钩子在组件上的数据更改之后运行,更新周期开始,就在DOM被修补和重新呈现之前。它允许您在组件上的任何反应数据实际呈现之前获取其新状态
更新的钩子在组件上的数据更改后运行,DOM重新呈现。如果在属性更改后需要访问DOM,这里可能是最安全的地方小提琴不起作用,因为您直接引用了githubusercontent-您应该使用rawgithub.com->查看问题与在angular中使用jQuery样式的dataTables时相同。两者都试图操纵DOM,vue正在赢得这场战斗。遗憾的是,我认为没有现成的解决方案。
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);
}
},
created(){
this.$nextTick(function() {
$('#app-datatable').DataTable();
})
}
beforeUpdate: function() {
if (this.dataTable) {
this.dataTable.destroy()
}
},
updated: function() {
this.dataTable = $(this.$el).DataTable()
}