【问题标题】:VueJS - List Array and Show/Hide IndependentlyVueJS - 列表数组和独立显示/隐藏
【发布时间】:2020-01-10 18:48:29
【问题描述】:

我正试图弄清楚如何让我的每一个项目都被列出,独立地隐藏和显示,目前当你打开一个时,另一个也会打开。我需要使用某种索引吗?我使用 v-show 是因为我需要事先渲染内容并在加载时隐藏但在点击时显示。

<template>
    <div>
        <div v-for="item in items" :key="item">
            {{ item.title }}

            <div v-if="item.examples != null">
                <a v-on:click="visibleExample = !visibleExample">Example</a>
                <transition name="fade">
                    <div v-show="visibleExample">
                        <div v-for="example in item.examples" :key="example">
                            {{ example }}
                        </div>
                    </div>
                </transition>
            </div>
        </div>
    </div>
</template>

<script>
    export default {
        data() {
            return {
                visibleExample: false,
                items: [{
                        title: 'Title',
                        examples: [
                            'Question',
                            'Answer'
                        ]
                    },
                    {
                        title: 'ABC',
                        examples: [
                            '1',
                            '2',
                            '3',
                            '4',
                            '5'
                        ]
                    }
                ]
            }
        }
    }
</script>

请注意:为简单起见,这是我原始代码的精简版。

【问题讨论】:

    标签: javascript vue.js vue-cli


    【解决方案1】:

    您可以使用新的辅助项目列表,并且可以为项目列表的每个对象附加一个新的boolean 属性。然后你可以在你的v-for 上使用auxItems,如下所示:

    Vue.config.devtools = false
    Vue.config.productionTip = false
    new Vue({
      el: "#app",
      data() {
        return {
          items: [
            {
              title: 'Title',
              examples: [
                'Question',
                'Answer'
              ]
            },
            {
              title: 'ABC',
              examples: [
                '1',
                '2',
                '3',
                '4',
                '5'
              ]
            }
        	],
          auxItems: []
        }
      },
      mounted () {
        this.auxItems = this.items.map(i => ({ ...i, isVisible: false }))
      }
    })
    .item {
      border: 1px solid black
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
    <div id="app">
      <div v-for="item in auxItems" :key="item.title" class="item">
        {{ item.title }}
        <div v-if="item.examples !== null">
          <a v-on:click="item.isVisible = !item.isVisible">Example</a>
          <transition name="fade">
            <div v-show="item.isVisible">
              <div v-for="example in item.examples" :key="example">
                {{ example }}
              </div>
            </div>
          </transition>
        </div>
      </div>
    </div>

    【讨论】:

    • 我喜欢你的想法,我试过这样做:jsfiddle.net/MrCarrasco/doqfbts6 但在两者之间迷路了。 Jsfiddle 目前仅显示项目但不独立显示。我的目标是尽可能保持清洁。如果以后可以使用,我会将其更改为 vue 组件形式并与 webpack 捆绑。
    • 看起来不错,但您应该在子组件内部使用 v-for 迭代属性 item.examples
    【解决方案2】:

    您有三个主要选择:

    1. visibleExample 使用布尔数组,并按索引与items 配对。配对可以使用来自v-for 的索引在模板中执行,也可以使用计算属性“合并”两个数组。
    2. 为您的每个items 添加一个布尔属性,用于保存是否应为该特定项目显示示例。
    3. 提取一个单独的组件来表示一个项目。这可能包括v-for 中的所有内容或仅包括示例部分。无论哪种方式,data 中都会有一个visibleExample 属性,每个组件都拥有自己的状态。这通常是最好的解决方案,但如果您需要组件外部的visibleExample 状态,它可能会变得很繁琐。对于问题中的代码,这不是问题,但这取决于完整代码的外观。

    【讨论】:

    • 哪个是最简单的实现选项? 3、单独的组件?
    • @Charles 问题中没有足够的信息来回答这个问题。其中任何一个都可以在 5 分钟内实施。如果您不清楚每种方法的具体含义,我建议您尝试所有方法。考虑到问题中的代码,选项 2 可能是最简单的,但在实践中,它可能涉及将服务器端数据和 UI 状态组合在一个数据结构中,这可能会使它变得繁琐。选项 3 引入的组件边界对于解决此问题很有用,但如果数据随后需要通过它,它可能会成为障碍。
    【解决方案3】:

    正如您所建议的,解决此问题的一种方法是跟踪当前选定的项目。

    这可以通过这样做来实现:

    <div v-if="item.examples != null">
       <a v-on:click="visibleExample = !visibleExample; crtSelectedItem = item">Example</a>
       <transition name="fade">
        <div v-show="visibleExample && item.id === crtSelectedItem.id">
            <div v-for="example in item.examples" :key="example">
               {{ example }}
            </div>
         </div>
       </transition>
     </div>
    

    【讨论】:

    • 我逐字逐句尝试,没有达到我需要的结果。
    猜你喜欢
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2016-09-10
    相关资源
    最近更新 更多