道具在我的Vue.js应用程序中不起作用

时间:2018-09-09 15:19:31

标签: javascript json node.js vue.js nuxt.js

我正在开发一个原型,以便对某些领域进行硬编码。 我可以知道为什么以下抛出错误吗?

vue.runtime.esm.js:587 [Vue warn]: Property or method "A" 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. See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.

found in

---> <Recommendation> at components/Recommendations.vue
       <HomePage> at pages/profile.vue
         <Nuxt>
           <Default> at layouts/default.vue
             <Root>

Recommendations.vue

<template>
    <div class="recommendations">
        <div class="recommendations__content">
            <AppOption :selected="A"></AppOption>
            <AppOption :selected="B"></AppOption>
            <AppOption :selected="C"></AppOption>
        </div>
    </div>
</template>

<script>
import AppOption from '@/components/Option.vue'

export default {
    name: 'Recommendation',
    components: {
        AppOption
    },
    data() {
        return {
        }
    }
}
</script>

Option.vue

<template>
    <div>
        <b-field>
            <b-select
                placeholder="Select skill"
                v-model="current"
                size="is-medium"
                expanded>

                <template v-for="option in options">
                    <option :value="option.value" v-bind:key="option.value">{{ option.title }} </option>
                </template>
            </b-select>
        </b-field>
        <div class="recommendations__content__row">
            <div class="fieldset">
                <label>Current:</label>
                **<input type="text" value="6.0" disabled>**
            </div>
            <div class="fieldset">
                <label>Goal:</label>
                <input type="text" value="8.0">
            </div>
        </div>
    </div>
</template>

<script>
export default {
    props: ['selected'],
    data() {
        return {
            current: this.selected,
            options: [
                { title: 'Skill A', value: 'A', points: 6},
                { title: 'Skill B', value: 'B', points: 5},
                { title: 'Skill C', value: 'C', points: 4}
            ]
        }
    }
}
</script>

我还如何根据父页面选择的内容更新Option.vue中用“ **”突出显示的部分,以从JSON中的“点”更新?

2 个答案:

答案 0 :(得分:1)

发生这种情况是因为在Recommendations.vue中,您引用的是A,B和C变量,但没有在数据部分中声明它们。

因此,如果希望它们成为变量,则需要声明它们:

export default {
    name: 'Recommendation',
    components: {
        AppOption
    },
    data() {
        return {
           A: 'A',  
           B: 'B',
           C: 'C',      
        }
    }
}

或者,如果您只想使用A,B和C作为值,则不需要绑定:。 Docs

<AppOption selected="A"></AppOption>
<AppOption selected="B"></AppOption>
<AppOption selected="C"></AppOption>

答案 1 :(得分:1)

在这部分

        <AppOption :selected="A"></AppOption>
        <AppOption :selected="B"></AppOption>
        <AppOption :selected="C"></AppOption>

您必须定义A,B,C属性或数据。例如,添加

data() {
    return {
      A: '',
      B: '',
      C: '',
    }
}

第二部分,最好的方法是添加一个计算属性。

computed: {
        selectedPoints() {
            return this.current.points 
        }
    }

然后添加

**<input type="text" :value="selectedPoints" disabled>**

在第二部分中,如果您发现v-model更适合您的用例,也可以使用它。


@yeeen更新: 我用一个for循环来获取我想要的分数。评论中的解释

computed: {
    selectedPoints() {
        for(let i=0; i<this.options.length; i++) {
            console.log(this.options[i]);
            if (this.options[i].value == this.current)
                return this.options[i].points
        }
        return 0;
    }
}