组件渲染时Vue JS计算属性尚不可用

Posted

技术标签:

【中文标题】组件渲染时Vue JS计算属性尚不可用【英文标题】:Vue JS computed property not available yet when component renders 【发布时间】:2019-08-28 12:17:12 【问题描述】:

我正在使用 Vue JS 构建一个页面。在 Vue 实例中,我有一个构建地图点数组的计算属性,然后是页面中的一个 Vue 组件,它使用在根实例中计算的计算属性。

但是在渲染组件时计算属性尚不可用,这会在计算属性上引发错误:"error during evaluation"

如果我注释掉 Vue 组件,计算的属性会正确计算。

但是添加了组件后,计算的属性还不可用,我收到以下错误:“无法读取未定义的属性”

<google-map class="google-map" :markers="points"></google-map>

window.Vue = require('vue');

import Vuetify from 'vuetify';

Vue.use(Vuetify);

import  crudFunctionsMixin  from './mixin-crud-functions.js';

Vue.component('google-map', require('../GoogleMaps/GoogleMap').default);

var app = new Vue(
    el: '#App',
    mixins: [ crudFunctionsMixin ],
    data: () => (
        model: "prospect",
        modelName: "Prospect",
        modelNamePlural: "Prospects",
        pagination: 
            sortBy: 'name'
        ,
        headers: [
             text: 'ID', value: 'id', sortable: true ,
             text: 'Name', value: 'name', sortable: true ,
             text: 'Food Category', value: 'foodcat_id', sortable: true ,
             text: 'Contact', value: 'contact_lname', sortable: true ,
             text: 'Admin Comments', value: 'response_notes', sortable: true ,
             sortable: false 
        ]
    ),
    computed: 
        tblFilteredItems: function() 
            return this.$refs.prospectsTable.filteredItems;
        ,
        points: function() 
            return this.calcPoints(this.$refs.prospectsTable.filteredItems);
        
    ,
    methods: 
        calcPoints(items) 
            let myPts = [];

            items.forEach(function(prospect) 
                if(prospect.latitude && prospect.longitude) 
                    myPts.push(
                        id:     prospect.id,
                        position: 
                            lat: prospect.latitude,
                            lng: prospect.longitude
                        ,
                        title:  prospect.address + ", " + prospect.city + ", " + prospect.zip,
                        icon:   "\/img\/numberedMapIcons\/number_" + prospect.id + ".png"
                    );
                
            );

            return myPts;
        ,

        fetch() 
            $.get(`/$this.model/fetch`, (r) => 
                if(r.successMsg) 
                    this.collection = r.collection.data;
                
            );
        
    
);
app.fetch();

【问题讨论】:

【参考方案1】:

您可以尝试几件事:

1:如果有数据,使用 v-if 有条件地渲染地图。

`<google-map v-if="points.length" :markers="points" class="google-map" />`
您可以使用 v-else 然后呈现某种加载符号。

2:在您的计算中,您可以检查您是否已经有数据,因为我猜这是您未定义问题的来源。

points: function() 
  if (!this.$refs.prospectTable.filteredItems) return [];
  return this.calcPoints(this.$refs.prospectsTable.filteredItems);

【讨论】:

当我添加这个时,我得到这个错误 [ 渲染错误:“TypeError:无法读取未定义的属性 'filteredItems'”]。似乎“prospectsTable”引用尚不可用。

以上是关于组件渲染时Vue JS计算属性尚不可用的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 Avoriaz 的 AVA 在 Vue.js 中测试计算属性

Vue面试题集锦

Vue.js 使用自定义计算属性渲染 v-bind:style 背景图像 url 不起作用

Vue JS计算属性没有重新计算

Vue计算属性和监听属性

Vue.js - 如何访问子组件的计算属性(Vuetify 数据表)