vue.js 是否可以通过任何方式将html元素添加到计算属性?

ru9i0ody  于 2023-05-01  发布在  Vue.js
关注(0)|答案(2)|浏览(187)

我有一个导航,它使用计算属性来填充li元素。

<ul v-for="link" in links">
    <li>
      {{ link.name }}
     </li>
</ul>

computed: {
  links(){
    return [
      {
        name: 'Link1',
      },
      {
        name: 'Link2',
      },
      {
        name: 'Link3',
      },
    ]
  }
 }

现在,如果我想其中一个链接有额外的html元素呢?例如,让我们说link2链接到一个邮箱,我想有一个跨度旁边的名称,计数电子邮件的数量。
例如:

<span class="email-counter">{{ messageCount ? `${messageCount.length}` : '' }}</span>

我怎样才能只对link2应用这个方法而不影响其他的链接呢?如果我把它放在li标记中,它当然会显示在所有列表元素中。

omhiaaxx

omhiaaxx1#

你可以使用v-if来检查是否有正确的链接:

new Vue({
  el: '#demo',
  data() {
    return {
      messageCount: {length: 999}
    }
  },
  computed: {
    links(){
      return [{ name: 'Link1', }, { name: 'Link2', }, { name: 'Link3', },]
    }
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="demo">
  <ul v-for="link in links" :key="link.name">
    <li>
      {{ link.name }}
      <span  v-if="link.name === 'Link2'" class="email-counter">{{ messageCount ? `${messageCount.length}` : '' }}</span>
    </li>
  </ul>
</div>
yjghlzjz

yjghlzjz2#

当我遇到这样的事情时,我总是发现把事情抽象一点,让父母保持整洁会更好。因此,不要在模板中添加大量逻辑,而是尽量将尽可能多的逻辑添加到原始列表中,并添加其他组件。
在这种情况下,我可能会创建一个组件来显示单个链接,并执行类似于下面的操作。它使一切都更干净,并使未来更容易做出进一步的更改。
在这个例子中,我使用了Vue 3和脚本设置,因为这是我的默认设置,但在Vue 2中的想法是一样的。

// navigation-menu.vue
<template>
    <nav>
        <ul>
            <navigation-item v-for="link in links" v-bind="link" />
        </ul>
    </nav>
</template>

<script setup>
// ... Import navigation-item

const links = [
    {
        label: 'Link 1',
    },
    {
        label: 'Link 2',
        count: 5,
    },
    {
        label: 'Link 3',
    },
];
</script>
// navigation-item.vue
<template>
    <li>
        {{ label }}

        <span v-if="count">{{ count }}</span>
    </li>
</template>

<script setup>
defineProps({
    /**
     * The label to display on the menu item.
     */
    label: {
        type: String,
        required: true,
    },

    /**
     * A notification-style count to display beside the menu item.
     */
    count: {
        type: Number,
        default: null,
    },
});
</script>

相关问题