【问题标题】:Showing a container in a v-for based on outcome of method that is called each iteration根据每次迭代调用的方法的结果在 v-for 中显示容器
【发布时间】:2020-03-11 15:30:42
【问题描述】:

我对 Vue 很陌生,遇到了一个我无法解决的问题。

我在 Vue 中有一个 for 循环。对于每次迭代,我想调用一个方法来检查属于迭代的项目是否在数组中。如果不是:我将其添加到数组中。如果它已经存在,则该方法返回 false。

对我来说似乎很简单,但是。似乎每次迭代只显示该方法的最后一个结果。

该方法本身似乎工作正常:console.log 返回正确的值。我认为不可能像我一样在每个 for 循环上调用该方法,但我不知道为什么,也不知道该怎么做。

Vue 代码

<div v-for="item in this.assertions" v-bind:key="item.assertion">
     <div v-if="showHeader(item.categoryName)">Some text or containers</div>
</div>

Vue方法

showHeader(category) {
            if (this.shownHeaders.indexOf(category) === -1) {
                this.shownHeaders.push(category);
                return true;
            }

            return false;
        },

数据属性

shownHeaders: []

我真的很想了解它是如何工作的!

编辑: 让我稍微调整一下我的主要问题:是否可以在 for 循环中的每次迭代中调用一个方法并让该方法(每次)返回 true 或 false? 如果有,怎么做?

【问题讨论】:

    标签: vue.js vuejs2 vue-component v-for


    【解决方案1】:

    这是由所谓的reactivity 引起的。每次data 属性更改时,都会触发 DOM 更新。因为您不断地将新元素添加到 shownHeaders 属性中(如果它们不存在),您正在导致这些更新。这些更新只有在所有元素都已经在数组中之后才会停止,并且最终状态也会最终反映在您的 DOM 中。

    如果您真的想了解发生了什么,您可以阅读以下来源:https://codingexplained.com/coding/front-end/vue-js/understanding-vue-js-reactivity

    【讨论】:

    • 这实际上很清楚,谢谢!但是,如果更新的源代码总是显示(也就是最后一次更新),我将如何为每次迭代进行这样的检查?
    • 告诉我你想要的行为是什么,我们可以想办法;-)
    • 应该根据类别名称是否已经在 shownHeaders 数组中(或不在)显示标题。然后应该在 for 循环中的每次迭代中进行此检查。例如: Header1 在第一次迭代中,所以该方法将 Header1 添加到数组中并返回 true(应该显示标题)。 Header1 也在第二次迭代中。该方法发现 Header1 已经在数组中,因此返回 false(不应显示标题)。我希望这可以解决问题。
    • 嗯.. 它实际上对我来说仍然没有完全的意义。这个迭代应该在哪里/如何进行?你能试着从用户的角度解释一下吗?
    • 当然!用户会看到一个向导(带有插槽)。在每个插槽上,都会显示问题。只有第一个问题应该显示类别的标题,否则它将显示每个问题。我不能通过简单的索引检查来做到这一点,因为插槽上第一个问题的索引并不总是 0。对于第二个插槽,它可以是任何其他数字(基于第一个插槽上显示的问题数量。这个随时间和每个时隙变化)。这有意义吗?
    【解决方案2】:

    是否可以在 for 循环中的每次迭代中调用一个方法并让该方法返回 true 或 false(每次)?

    是的,完全有可能

    如果有,怎么做?

    你是怎么做到的……


    您的问题不包含您对代码的期望的准确描述和当前行为的准确描述,所以接下来的内容只是猜测

    如果它没有按预期工作,那不是因为方法调用本身,而是因为方法中的代码在组件的上下文中做了什么......

    我看到的最大问题是您对 Vue 中的模板如何工作的误解。主要是模板每次使用的某些数据发生变化时都会渲染

    很明显,您的代码是以您期望模板仅呈现一次的方式编写的。感谢shownHeaders 数组,类别标头将仅在第一次呈现并在下次组件重新呈现时隐藏...

    【讨论】:

    • 感谢您的努力,但您似乎错误地解释了我的问题。我已经调整了我的问题,也许这可以澄清我真正想知道的事情。 :-)
    【解决方案3】:

    如果您的目标是获得showHeaders,则不能在templates 上尝试您的方法,如下所示。

    <template>
        <div>
            <button @click.prevent="showHeader()">Click to show Headers</button>
        </div>
    </template>
    
    <script>
    export default {
        data(){
            return {
                assertions: [],            
                shownHeaders: []
            }
        },
        methods: {
            showHeader() {
                assertions.forEach((item) => {
                    if (this.shownHeaders.indexOf(item.categoryName) === -1) {
                        this.shownHeaders.push(item.categoryName)
                    }
                })
            }
        }   
    }
    </script>

    【讨论】:

    • 谢谢,但我不希望访问者必须先单击按钮。应根据类别名称是否已在 shownHeaders 数组中(或不在)显示标题。然后应该在 for 循环中的每次迭代中完成此检查。
    猜你喜欢
    • 2015-02-10
    • 2021-07-13
    • 2019-07-30
    • 2018-11-21
    • 2015-03-19
    • 2020-05-09
    • 2021-10-02
    • 2021-10-05
    • 2019-05-22
    相关资源
    最近更新 更多