【问题标题】:Vue v-once equivalentVue v-once 等效
【发布时间】:2017-11-08 18:53:55
【问题描述】:

有没有办法告诉 Vue 在用作表达式时只调用一次方法

这是我的代码:

<div v-for="i in a.b.c.items">
   <div :id="foo(i.value)"></div>
</div>

现在的方式是,foo() 方法将在模型上的任何内容发生更改时执行,而不仅仅是项目。 Vue 中有什么东西我可以告诉它只评估一次吗?

像这样:&lt;div :id.only-once="foo(i.value)"

【问题讨论】:

  • 为什么不直接在与v-for 相同的元素上添加v-oncejsfiddle.net/kr2gpq9L
  • 上述注释对静态内容完全有效(即您的数组在任何时候都不会更改),但会导致更改不会在您的v-for 循环中呈现。如果您的数据永远不会被更改,请考虑此v-once 建议,否则您将希望避免使用它。
  • 我想我不清楚要问什么。您是否希望 foo 方法对每个项目只触发一次?或者您是否希望在 a.b.c.items 数组更新时触发 foo 方法,而不是在 a 属性中的其他任何内容更改时触发?

标签: vue.js vuejs2


【解决方案1】:

不幸的是,这仅适用于某些事件,例如在this question here。您可能要考虑的是computed property,您可以在其中计算所有这些值并返回数组。这个结果数组将被 Vue 缓存,并且在你的 items 数组被修改(并且以 Vue 检测到变化的方式修改)之前不会被重新评估。

一个例子:

Vue 设置

<script>
    new Vue({
        el: '. . .',
        data: {
            a: {b: {c: {items: [. . .]}}}
        },
        methods: {
            foo: function(val) {
                . . .
            }
        },
        computed: {
            itemsAfterFoo: function() {
                var this_vue_instance = this;
                var computed_items = [];
                this_vue_instance.items.forEach(function(item) {
                    computed_items.push(this_vue_instance.foo(item.value));
                });
                return computed_items;
            }
        }
    });
</script>

模板

<div v-for="(i, index) in a.b.c.items">
    <div :id="itemsAfterFoo[index]"></div>
</div>

或类似的东西。

更多关于计算属性的信息:https://vuejs.org/v2/guide/computed.html

【讨论】:

  • 可组合计算属性似乎是许多 Vue 作为框架想要去的地方。过滤器/管道与 Vue 中表达式中的方法存在相同的问题,它会在每次模型更新时进行评估???计算属性是我不得不承认的一个非常聪明的 JS(getters/setters/dependency tracker)。只是我不得不倒过来推理。
猜你喜欢
  • 1970-01-01
  • 2021-01-19
  • 2020-05-05
  • 2018-10-27
  • 1970-01-01
  • 1970-01-01
  • 2020-02-11
  • 2021-04-27
  • 2021-09-20
相关资源
最近更新 更多