Topic: Mdb datatable does not rendering data which comes from api in Vue.js
                  
                  fa.
                  free
                  asked 6 years ago
                
I'm trying to implement a datatable with mdbootstrap in vue.js. I would like to update table data on events and when initialized but it does not work.
Template;
<div class="col-md-12">
    <mdb-datatable
            :data="data"
            striped
            bordered
    />
</div>
Script;
 import { mdbDatatable } from 'mdbvue';
export default {
name: 'userManagement',
components: {
    mdbDatatable
},
data() {
    return {
        className:"",
        classList: [],
        data: {
            columns: [
                {
                    label: 'Name',
                    field: 'className',
                    sort: 'asc'
                }, {
                    label: 'ID',
                    field: 'id',
                    sort: 'asc'
                }
            ],
            rows: [
                {
                    className: 'Tiger Nixon',
                    id:1
                },
                {
                    className: 'Garrett Winters',
                    id:2
                }
            ]
        }
    }
},
methods: {
    getClassList(){
        var _this = this;
        this.$axios.get('my_url/admin/classes').then(function (response) {
            if (response.status === 200) {
                _this.data.rows = [];
                response.data.forEach(function (obj) {
                    let item = {
                        className: obj.className,
                        id: obj.id
                    };
                    _this.data.rows.push(item);
                });
            }
        }).catch(function (err) {
            alert("" + err);
        });
    }
},
mounted(){
    this.getClassList();
},
It always shows default values, I check the data rows from console the value seems to be updated but no change on the datatable.
Any help would be appreciated.
                      
                      vitaliy sheverov
                      free
                        answered 6 years ago
                    
Hi, code from here https://mdbootstrap.com/docs/vue/tables/datatables/#external-api by Other JSON structures doesnt work. How i can show not formatted ajax data?
Mikołaj Smoleński staff commented 6 years ago
Hi there, We're currently working on that issue. It's solved on our development branch and will be released on Monday.
Best regards
                      
                      Mikołaj Smoleński
                      staff
                        answered 6 years ago
                    
Hi there again,
We've found the solution for Your issue. The new code is available here: https://mdbootstrap.com/docs/vue/tables/datatables/#external-api
Also to make sure the data is reactive it's necessary to add the following code to the Datatable component in our package:
watch: {
    data(newVal) {
      this.columns = newVal.columns;
    },
    (...)
}
It will be fixed in the next Vue release.
Best regards
                      
                      Mikołaj Smoleński
                      staff
                        answered 6 years ago
                    
Hi there,
We're currently working on that issue. We'll try to fix it as soon as possible.
Best regards
                      
                      Eee
                      free
                        answered 6 years ago
                    
Thanks for the reply, Mikolaj!
Anyhow, I've already tried those examples on that documentation. I copied the code in "Other JSON structure" still it didn't work.
Here's my snippet of code:
<template>
    <mdb-datatable
  :data="data"
  striped
  bordered
    />
</template>
<script>
import 'mdbvue/build/css/mdb.css';
import { mdbDatatable } from 'mdbvue';
export default {
   components: {
   mdbDatatable
 },
computed: {
  data() {
    return {
      columns: [],
      rows: []
    }
  },
},
methods: {
filterData(dataArr, keys) {
  let data = dataArr.map(entry => {
    let filteredEntry = {};
    keys.forEach(key => {
      if(key in entry) {
        filteredEntry[key] = entry[key];
      }
    })
    return filteredEntry;
  })
  return data;
}
 },
mounted(){
 fetch('https://jsonplaceholder.typicode.com/users')
  .then(res => res.json())
  .then(json => {
     console.log(json);
    let keys = ["id", "name", "username"];
    let entries = this.filterData(json, keys);
    //columns
    this.data.columns = keys.map(key => {
      return {
        label: key.toUpperCase(),
        field: key,
        sort: 'asc'
      };
    });
    //rows
    entries.map(entry => this.data.rows.push(entry));
    })
    .catch(err => console.log(err));
   }
 }
.dataTables_wrapper { min-width: 80% !important; margin: 70px auto 0px !important; }
                      
                      Mikołaj Smoleński
                      staff
                        answered 6 years ago
                    
Hi there,
If You want to pass data from API, please use the following syntax:
<mdb-datatable :data="'https://my-json-server.typicode.com/Rotarepmi/exjson/db'" striped bordered  />
Also, in the next release we will udpate the datatable component, to control the data changes.
Best regards
Eee free commented 6 years ago
Does this mean that the "Other JSON structures" feature is not yet available?
Mikołaj Smoleński staff commented 6 years ago
On this page You can find all info about other data structures in datatables: https://mdbootstrap.com/docs/vue/tables/datatables/
Best regards
Eee free commented 6 years ago
Hi Mikolaj. I posted the code ( below on this comment ) based on the documentation you've sent in which it didn't work on my end. Any help would be appreciated. Thank you!
FREE CONSULTATION
Hire our experts to build a dedicated project. We'll analyze your business requirements, for free.
Answered
- ForumUser: Free
 - Premium support: No
 - Technology: MDB Vue
 - MDB Version: 5.1.1
 - Device: Macbook air
 - Browser: Chrome
 - OS: macOS High Sierra
 - Provided sample code: No
 - Provided link: Yes