Search code examples
javascriptvue.jsvuejs2kendo-gridvue-cli-3

Vue property definition warning even though it is defined on the instance


Edit - I have setup a repo on github with the erraneous code here if anyone wants to pull this down and see the error for themselves: https://github.com/andrewjrhill/what-the-instance-grid. You can run npm run serve to kick off the webserver.


I am running into an issue where my Vue is throwing the following errors:

[Vue warn]: Property or method "columns" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property.
[Vue warn]: Property or method "items" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property.

This is a pretty common issue with Vue apps and is usually the result of a property not being defined on a Vue data object. Unfortunatley in this case I have indeed added columns and itemsto the new Vue call. Any ideas why I am getting this error? It looks like data isn't available at all to the template.

This project was generated by the latest Vue-CLI and is using the runtimeCompiler: true flag in a vue.config.js file if that makes any difference.

The .vue file in question:

<template>
  <div id="vueapp" class="vue-app">
    <Grid :columns="columns" :data-items="items" :style="{ height: '280px' }"></Grid>
  </div>
</template>

<script>
import Vue from "vue";

import { Grid } from "@progress/kendo-vue-grid";

Vue.component("Grid", Grid);

new Vue({
  el: "#vueapp",
  data: function() {
    return {
      items: [],
      columns: [
        { field: "ProductID" },
        { field: "ProductName", title: "Product Name" },
        { field: "UnitPrice", title: "Unit Price" }
      ]
    };
  },
  methods: {
    createRandomData(count) {
      const productNames = [
        "Chai",
        "Chang",
        "Syrup",
        "Apple",
        "Orange",
        "Banana",
        "Lemon",
        "Pineapple",
        "Tea",
        "Milk"
      ];
      const unitPrices = [12.5, 10.1, 5.3, 7, 22.53, 16.22, 20, 50, 100, 120];

      return Array(count)
        .fill({})
        .map((_, idx) => ({
          ProductID: idx + 1,
          ProductName:
            productNames[Math.floor(Math.random() * productNames.length)],
          UnitPrice: unitPrices[Math.floor(Math.random() * unitPrices.length)]
        }));
    }
  },
  mounted() {
    this.items = this.createRandomData(50);
  }
});

export default {
  name: "App",
  components: {
    Grid
  }
};
</script>

Solution

  • Don't reinstantiate Vue inside the App.vue component.
    Fix like this (files from your repo):

    main.js:

    import App from './App.vue'
    import Vue from 'vue'
    import { Grid } from "@progress/kendo-vue-grid";
    
    Vue.component("Grid", Grid);
    
    Vue.config.productionTip = false
    
    new Vue({
      render: h => h(App),
    }).$mount('#vueapp')
    

    App.vue:

    <template>
      <div id="vueapp" class="vue-app">
        <Grid :columns="columns" :data-items="items" :style="{ height: '280px' }"></Grid>
      </div>
    </template>
    
    <script>
      export default {
        name: "App",
        data: function() {
          return {
            items: [],
            columns: [
              { field: "ProductID" },
              { field: "ProductName", title: "Product Name" },
              { field: "UnitPrice", title: "Unit Price" }
            ]
          };
        },
        methods: {
          createRandomData(count) {
            // your code
          }
        },
        mounted() {
          this.items = this.createRandomData(50);
        }
      };
    </script>