vue.js - 我可以动态地将计算属性插入到 Vue 组件中吗

标签 vue.js vuejs2 vue-component computed-properties

我通过遍历大量对象来生成 Vue 组件的内容。我想使用计算属性来确定是否显示某些节点​​,但由于计算引用在循环内使用,我需要能够动态设置引用名称。

下面是我正在尝试做的一个概念性示例。如何根据当前项目更改 showItemX

<template>
  <ul>
    <li v-for="item in myArr" v-if="showItemX">
      {{ item.name }}
    </li>
  </ul>
</template>
<script>
  export default {
    data() {
      return {
        myArr: [{
          id: 'item1',
          name: 'Item 1'
        }, {
          id: 'item2',
          name: 'Item 2'
        }]
      };
    },
    computed: {
      showItem1: function() {
        return this.$store.state.showItem1;
      },
      showItem2: function() {
        return this.$store.state.showItem2;
      }
    }
  }
</script>

2 种可能的解决方案

到目前为止,这是我考虑过的两条路线,但我不确定哪一条路线效率更高,或者是否首选其他路线:

1。为计算属性返回单个对象

在此选项中,上面的两个计算属性将合并为一个属性:

computed: {
  showItem: function() {
    return {
      item1: this.$store.state.showItem1,
      item2: this.$store.state.showItem2
    }
  }
}

然后 v-if 将被设置为 showItem[item.id]:

<li v-for="item in myArr" v-if="showItem[item.id]">
  {{ item.name }}
</li>

这里的缺点是,似乎每次其中一个依赖项发生变化时,整个对象都会重新计算。

2。使用方法获取对应的计算属性

在这里,我尝试将 item.id 传递给一个方法,作为访问相应计算属性的一种方式:

computed: {
  item1Show: function() {
    return this.$store.state.showItem1;
  },
  item2Show: function() {
    return this.$store.state.showItem2;
  }
},
methods: {
  showItem: function(id) {
    return this[id + 'Show']
  }
}

在模板中:

<li v-for="item in myArr" v-if="showItem(item.id)">
  {{ item.name }}
</li>

同样,在此示例中,我不确定我是否充分利用了计算属性。


这些选项中的一个是否应该优于另一个,或者是否有更好的方法来实现我所缺少的?

最佳答案

Vue 和 JavaScript 的优点在于您可以使用适合您需要的任何方法,但是,顺便说一句,我可能会发现类似下面的方法最容易理解

<li v-for="item in myArr" v-if="showItem(item)">
    {{ item.name }}
</li>

然后定义showItem方法,例如

showItem(item) {
    return item.id === "item1" ?
        this.$store.state.showItem1 :
        this.$store.state.showItem2;
}

假设您没有在帖子中未显示的其他任何地方使用计算属性

关于vue.js - 我可以动态地将计算属性插入到 Vue 组件中吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52583399/

相关文章:

javascript - 在方法对象的函数内发出自定义事件

vue.js - 如何正确禁用 eslint?

css - 如何在 Bootstrap vue 上制作按钮减号和加号?

vue.js - 当 vue 路由器更改查询参数时防止滚动到顶部

vue.js - 可以在 vue.js 应用程序中排除 `this` 关键字吗?

javascript - vue-router 不会在嵌套路由上渲染模板

vue.js - 组件复选框未设置(vue、vee 验证)

npm - Vue 模块,moment-timezone - 如何正确加载 moment-timezone 以及如何使用 2012-2022 数据

javascript - Vuex 如何在安装时访问组件上的状态数据?

vue.js - 我有一个 Electron 项目,我想与它一起使用vueJS