我想在Laravel + Vue.js项目中创建一个反应式数据表。我正在使用datatables.js
库来显示我的数据。当我进行API调用以从db API获取数据时返回一个数组,所以我想在datatable
中填充该数组。但它的工作很奇怪?
以下是API调用:
methods: {
getUsers() {
axios.get('/api/users')
.then(response => {
if(response.status === 200) {
this.users = response.data.users;
console.log(this.users);
}
})
.catch(error => {
console.error(error);
});
}
},
mounted() {
$('#users-datatable-responsive').DataTable();
this.getUsers();
}
这是我填充datatable
<tr v-for="user in users">
<td>@{{ user.fullname }}</td>
<td>@{{ user.phone }}</td>
<td>@{{ user.email }}</td>
</tr>
数据表的搜索和其他功能无效。什么是解决方法?
编辑:
mounted() {
let table = $('#users-datatable-responsive').DataTable({
language: this.dataTableOptions
});
this.getUsers();
table.rows().invalidate().draw();
}
这种方法对我不起作用。
答案 0 :(得分:1)
如果它是一个简单的表,您可以使用vue docs中的此网格表组件 https://vuejs.org/v2/examples/grid-component.html
答案 1 :(得分:0)
根据我的评论,有两个问题导致您遇到的问题:
table.rows().invalidate().draw();
this.users
来呈现正确的标记。使用Vue.nextTick()
调用“重置”的逻辑&#39;桌子。要解决此问题,您可以在app / component中调用一个自定义方法来处理表的强制刷新,即:
methods: {
getUsers() {
axios.get('/api/users')
.then(response => {
if(response.status === 200) {
// Populate VueJS data store with received data
this.users = response.data.users;
// Call a method that manually refreshes table
this.forceRefreshUserDataTable();
}
})
.catch(error => {
console.error(error);
});
}
},
mounted() {
this.usersDataTable = $('#users-datatable-responsive').DataTable();
this.getUsers();
},
methods: {
forceRefreshUserDataTable() {
Vue.nextTick(function () {
this.usersDataTable.rows().invalidate().draw();
});
}
}
答案 2 :(得分:0)
我无法得到Terry的工作答案,但经过一段时间的游戏后发现在渲染之前破坏了表格,然后在下一个刻度上重建表格确实有效。
...
methods: {
drawDT() {
$("#dt").DataTable().draw();
},
async refreshData() {
this.isLoading = true;
$("#dt").DataTable().destroy();
try {
let data = await fetchData();
this.users = data.slice(0, getRandomInt(1, data.length));
await this.$nextTick(this.drawDT);
} catch (err) {
console.error(err);
} finally {
this.isLoading = false;
}
}
},
...