【问题标题】:Vuejs: How to make this if else as Boolean?Vuejs:如果否则为布尔值,如何将其设为?
【发布时间】:2020-03-04 17:04:51
【问题描述】:

我有一个带有按钮的组件,当我们单击它们时会显示一些元素(v-autocomplete),但我应该使用布尔值来简化代码,我该怎么做?

因为实际上,它在 showCompetence 状态下将项目的索引添加到一个数组中,但我只想在每个索引上添加一个布尔值基本上在“方法”中的“openCompetence”函数中。

import { mapGetters, mapActions } from "vuex";

export default {
    name: "SkillCvCard",
    data() {
        return {
            selectedCompetence: []
        }
    },
    updated() {
        this.addSelectSkill(this.userCompetences.competences.list);
        console.log(this.selectedSkills)
    },
props: {
        userCompetences: {
            type: Array
        },
        showCompetence: {
            type: Array
        }
    },

computed: {
        ...mapGetters(["selectedSkills"]),
        console: () => console,
    },

methods: {
...mapActions(['addSelectSkill']),
openCompetence(index) {
    if (this.showCompetence.includes(index)) {
        console.log("close")
        this.showCompetence.splice(this.showCompetence.indexOf(index), 1)
    } else {
        this.showCompetence.push(index)
        console.log("open")
    }

    console.log(this.showCompetence)
}
}

关于模板我只添加最低限度我希望它会好的:

第一个是我们点击的地方,启动“openCompetence”功能。

<div v-for="(competences, index) of userCompetences.competences" :key="index">
        {{ competences.category }} <v-btn @click="openCompetence(index)"> Add </v-btn>
</div>

剩下的是一个v-container和一个v-for,包括多个v-autocomplete,但里面最重要的是v-if

<div class="skill-field" v-for="(skill, index) of userCompetences.competences" :key="index">
                                <template>
                                <v-flex md12 sm12 xs12 v-if="skill.list.length>0">
                                    <v-autocomplete
                                    v-if="showCompetence.includes(index)"
                                    v-model="userCompetences.competences.list"
                                    :items="skill.list"
                                    chips
                                    hide-selected
                                    :label="skill.category"
                                    item-text="name"
                                    item-value="name"
                                    multiple
                                    >
</v-autocomplete>
</v-flex>
</template>
</div>

【问题讨论】:

  • 计算属性?

标签: javascript vue.js boolean


【解决方案1】:

通常,您会使用计算属性来解决此类问题。但是,因为您在 v-for 内部,所以计算属性有点困难,因为您无法在 v-forindex 的每个值的上下文中评估它。

有两种常见的选择:

  1. 做你正在做的事。它实际上并没有降低效率,因为除非它依赖的数据发生变化,否则它不会重新评估。

  2. 添加一个类似于competencesDisplayState 的计算函数,它返回一个与userCompetences.competences 数组在v-for 中的排序相匹配的布尔数组。然后你的 v-if 可以变成这样:

v-if="competencesDisplayState[index]"

我通常只选择第一种方法,因为它更简单,更易于阅读和维护。

如果你想走路线 2,这里有一些用于计算能力显示状态的代码:

        competencesDisplayState: () => {
            var result = [];
            for (var index=0;index < this.userCompetences.competences.length;++index) {
                result(this.showCompetence.includes(index));
            }
            return result;
        }

【讨论】:

  • 我想尝试做你的第二个解决方案,并想开始在“计算”中编写代码,但我不知道从哪里开始。但我应该在组件中写一个新状态,对吧?谢谢!
  • 所以要写这个计算我必须把它添加到一个函数中?就像在计算中一样: test(index) { 你写的代码 } 以及如何运行这个函数?它应该自动加载吗?因为当我放那个 v-if="competenvesDisplayState[index]" 时我什么都没有你可以在这里看到组件:codepen.io/jervalles/pen/NWqwWKB 我的代码有效,但我真的想了解计算的工作原理。谢谢!
  • 首先,我认为 codepen 不支持 .vue 组件。看一个像这样的 Vue pen 的例子:codepen.io/bluesmy/pen/poJdJZO 其次,我已经更新了上面的代码以匹配更多你需要的东西。
猜你喜欢
  • 1970-01-01
  • 2014-01-24
  • 1970-01-01
  • 2014-02-07
  • 2020-10-07
  • 2019-05-12
  • 1970-01-01
  • 2015-07-03
  • 1970-01-01
相关资源
最近更新 更多