Первичная таблица данных не отображается

#vue.js #primevue

#vue.js #первичный

Вопрос:

Я пытаюсь использовать PrimeVue и использовать компонент DataTable — но он не отображается? Кажется, какая-то ошибка $ slots? Компонент кнопки отображается и работает должным образом. Table.vue

 <template>
    <div>
        <DataTable :value="products">
            <Column field="brand" header="Brand"></Column>
            <Column field="year" header="Year"></Column>
            <Column field="color" header="Color"></Column>
            <Column field="vin" header="Vin"></Column>
        </DataTable>
        <ColorPicker v-model="color" />
    </div>
</template>

<script>

    import DataTable from "primevue/datatable";
    import Column from "primevue/column";
    import ColorPicker from 'primevue/colorpicker';

    export default {

        name: "Table",
        props: {
        },
        data() {
            return {
                products: [
                    {"brand": "Volkswagen", "year": 2012, "color": "Orange", "vin": "dsad231ff"},
                    {"brand": "Audi", "year": 2011, "color": "Black", "vin": "gwregre345"},
                    {"brand": "Renault", "year": 2005, "color": "Gray", "vin": "h354htr"},
                    {"brand": "BMW", "year": 2003, "color": "Blue", "vin": "j6w54qgh"},
                    {"brand": "Mercedes", "year": 1995, "color": "Orange", "vin": "hrtwy34"},
                    {"brand": "Volvo", "year": 2005, "color": "Black", "vin": "jejtyj"},
                    {"brand": "Honda", "year": 2012, "color": "Yellow", "vin": "g43gr"},
                    {"brand": "Jaguar", "year": 2013, "color": "Orange", "vin": "greg34"},
                    {"brand": "Ford", "year": 2000, "color": "Black", "vin": "h54hw5"},
                    {"brand": "Fiat", "year": 2013, "color": "Red", "vin": "245t2s"}
                ],
                color: '1976D2'

            }
        },
        components: {
            DataTable,
            Column,
            ColorPicker
        },
    }
</script>


<style scoped>

</style>  

main.js

 import Vue from 'vue'
import App from './App.vue'
import axios from 'axios'
// Importing the Nova Light PrimeVue theme styles
import 'primevue/resources/themes/rhea/theme.css';

// Importing the base PrimeVue component styles
import 'primevue/resources/primevue.min.css';

// Importing the base PrimeIcon styles
import 'primeicons/primeicons.css';

Vue.prototype.$http = axios

Vue.config.productionTip = false

new Vue({
  render: h => h(App),
}).$mount('#app')  

Таблица данных отображается в Vue DevTools:
Таблица данных в инструментах

Я получаю эту ошибку в консоли «TypeError: this.$slots.default не является функцией»:

 vue.runtime.esm.js?2b0e:619 [Vue warn]: Error in render: "TypeError: this.$slots.default is not a function"

found in

---> <DataTable> at node_modules/primevue/components/datatable/DataTable.vue
       <Table> at src/components/Table.vue
         <App> at src/App.vue
           <Root>
warn @ vue.runtime.esm.js?2b0e:619
logError @ vue.runtime.esm.js?2b0e:1884
globalHandleError @ vue.runtime.esm.js?2b0e:1879
handleError @ vue.runtime.esm.js?2b0e:1839



TypeError: this.$slots.default is not a function
    at VueComponent.headerColumnGroup (DataTable.vue?dffe:1705)
    at Watcher.get (vue.runtime.esm.js?2b0e:4479)
    at Watcher.evaluate (vue.runtime.esm.js?2b0e:4584)
    at VueComponent.computedGetter [as headerColumnGroup] (vue.runtime.esm.js?2b0e:4  

Как мне исправить эту ошибку?

Ответ №1:

Редактировать: я добавил свой ответ, прежде чем понял, что алгоритм SO показал мне вопрос почти 2-летней давности. Я уверен, что вы уже поняли это…


При очень быстром просмотре я заметил, что у вас этого нет:

 import PrimeVue from 'primevue/config';

app.use(PrimeVue, { ripple: true });
  

В вашем main.js

Вы используете Vue 2 или Vue 3?

Я когда-либо использовал его только с vue 3, так что у меня main.js что-то вроде этого:

 import { createApp, reactive } from 'vue';
import { createPinia } from 'pinia';

import App from './App.vue';
import router from './router';

// primevue
import PrimeVue from 'primevue/config';
import './assets/layout/layout.scss';

import 'primeflex/primeflex.min.css';
import 'primeicons/primeicons.css';
import 'primevue/resources/primevue.min.css';
import 'primevue/resources/themes/saga-blue/theme.css';
import 'primevue/resources/themes/fluent-light/theme.css';

// primevue components that get used multiple times throughout app
import Button from 'primevue/button';
// ... any others

// app has to be created after imports aparently
const app = createApp(App);

app.component('Button', Button); 
// ... any others

app.use(createPinia());
app.use(router);
app.use(PrimeVue, { ripple: true });


// globalProperties was designed for options API so instead of:
// app.config.globalProperties.$appState = reactive({ inputStyle: 'outlined' });
// I'm using provide/inject pattern instead: 
// https://vuejs.org/guide/components/provide-inject.html#provide
app.provide('$appState', reactive({ inputStyle: 'outlined' }));
app.provide('$primevue', app.config.globalProperties.$primevue);

// then in componentents that need access to them:
import { inject } from 'vue';
const $appState = inject('$appState');
const $primevue = inject('$primevue');