Ajax Reload on Vue.js DataTables
Ajax Reload on Vue.js DataTables
ajax.reload() and/or ajax.url().load() is just not working for Vue3 DataTable integration. It works if you include the CDN and follow the jQuery approach to it.
If you follow the instructions on https://datatables.net/blog/2022-06-22-vue on how to integrate DataTables into Vue3, that feature just doesn't seem to work.
For example:
<template>
<div class="p-6">
<button @click="changeIt">
Change
</button>
<DataTable
class="display"
id="datatable"
:columns="columns"
:ajax="{
url: 'api/users',
}"
ref="table"
:options="{
select: true,
serverSide: true,
}"
>
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Email</th>
<th>Action</th>
</tr>
</thead>
<tbody>
</tbody>
</DataTable>
</div>
</template>
<script>
import DataTable from 'datatables.net-vue3'
import DataTablesLib from 'datatables.net';
DataTable.use(DataTablesLib);
export default {
name: 'DataTableComponent',
components: {DataTable},
data(){
return {
columns: [
{"data": "id"},
{"data": "name"},
{"data": "email"},
{"data": "action", "sortable": false},
],
}
},
methods: {
changeIt() {
$('#datatable').DataTable().ajax.url('users/user').load();
}
},
}
</script>
<style>
@import 'datatables.net-dt';
</style>
For a simple example, if you click the button, there would be a new Ajax request to somewhere else. This does not currently work.
The error that I get is:
runtime-core.esm-bundler.js:218 Uncaught TypeError: $(...).DataTable is not a function
at Proxy.changeIt (DataTableComponent.vue:55:29)
at _createElementVNode.onClick._cache.<computed>._cache.<computed> (DataTableComponent.vue:3:25)
at callWithErrorHandling (runtime-core.esm-bundler.js:155:22)
at callWithAsyncErrorHandling (runtime-core.esm-bundler.js:164:21)
at HTMLButtonElement.invoker (runtime-dom.esm-bundler.js:369:13)
This question has an accepted answers - jump to answer
This discussion has been closed.
Answers
I'm not familiar with VUE but this section of the blog you linked to shows how to get an instance of the API which is what
$('#datatable').DataTable()would do in a Javascript environment.Kevin
Thanks Kevin (@kthorngren). I've tried that too...and can't believe I missed that..and I'm still not getting access to it.
https://codesandbox.io/s/serverless-pond-4mu4zw?file=/src/App.vue
Error that I get:
TypeError: Cannot read properties of undefined (reading 'dt')OK, So I got it to work, but I'm missing something here. The onMounted function is the culprit. It works if I use the <script setup> tag.
Solved. Needed to use this.$refs in mounted() and not ref() as the docs suggested.