如何在Vue的v-for迭代中只调用一次方法?

Posted

技术标签:

【中文标题】如何在Vue的v-for迭代中只调用一次方法?【英文标题】:How to call a method only once in v-for iteration in Vue? 【发布时间】:2021-07-13 04:39:50 【问题描述】:

我有一种情况,“v-for”为每次迭代调用 2 个方法。当用户按下按钮时调用它们。

用户告诉组件 v-for 将运行的迭代次数(itemsDrawn 属性)。

"itemsDrawn" 属性可以在 0 到 4 之间变化。 v-for 在每次迭代中抽取引导卡(可以是 0 到 4)

这些方法(方法 A 和 B)返回一个整数/代码或字符串(我可以决定),并且在模板内我需要根据为每个函数提供的代码(数据类型)显示一些消息。

因此,根据这些代码,我可以选择要在 UI 中显示的文本。

截取的代码是这样的:

<div
  class="card text-center mt-5"
  style="width: 18rem"
  v-for="(item, index) in itemsDrawn"
  :key="index"
>
  <div class="card-header">Item:  item  -  methodA() </div>
  <div class="card-body">
    <h5 class="card-title"> methodB() </h5>
    <p class="card-text">
      'This is the message based on both methodA() and methodB()'
      'I NEED TO CALL A METHOD HERE 
    </p>
  </div>
</div>

方法

  methods: 
    methodA()
      return this.workItemsTypes[this.randomNumber(0,9)];
    ,
    methodB() 
      return this.classesOfServices[this.randomNumber(0,7)];
    ,
  ,

输出是这样的:

查看输出的第一列,卡片标题中的“Melhoria”和卡片正文中的“Padrão”应该显示个性化消息;每张卡都会发生同样的情况。

如果我在 p-card-text 中调用这些方法,它们会给我其他值。因此,这将是 4 次调用,每个方法 2 次。

那么,我怎样才能只调用它们一次,保留它们的输出并根据它们的数据显示一条消息?

如何在每个调用的方法中保留这两个值并在以后使用它们?

【问题讨论】:

Vue 的快速经验法则...不要使用方法来渲染模板的某些部分。请改用计算属性。见Method vs Computed in Vue “基于用户操作”是什么意思。您的伪代码模板示例没有传达您要执行的操作。你认为你可以改进它以使其更清晰吗? 将随机值存储在data状态,不要在渲染中使用随机性。 【参考方案1】:

我不确定这是否是最好的设计,但根据 cmets 我可以找到答案。

classOfServiceItemworkItemTypeItem 都是状态变量,我在通过对应的数据数组检索之前保存数据。

保存状态中的随机数

  state: 
    classOfServiceItem: 0,
    workItemTypeItem: 0,
  ,
  methods: 
    classOfService() 
      // here I save the state
      this.classOfServiceItem = this.randomNumber(0, 7);
      return this.classesOfServices[this.classOfServiceItem];
    ,
    workItemType() 
      // here I save the state
      this.workItemTypeItem  = this.randomNumber(0, 0);
      return this.workItemsTypes[this.workItemTypeItem];
    ,


  ,

使用每次迭代的状态

 
        <div class="card-body mycard-body">
          <h5 class="card-title"> classOfService() </h5>
          <p class="card-text">
            'Here I use the random    
            'This is the message based on both 
 classesOfServices[classOfServiceItem]   and 
 workItemsTypes[workItemTypeItem] '
          </p>
          <button type="button" @click="pullItem" class="btn btn-primary">
            Puxar
          </button>
        </div>

【讨论】:

以上是关于如何在Vue的v-for迭代中只调用一次方法?的主要内容,如果未能解决你的问题,请参考以下文章

Vue 使用 v-for 迭代 API 响应的嵌套数组

如何在 Vue.js 中使用 v-for 遍历对象数组?

如何在嵌套数组(数组中的数组)上使用 v-for 指令进行迭代

Vue Js 中的 Key 和 value 如何迭代

检测bootstrap-vue日期选择器中v-for中每个元素的目标

在与 v-for @click 方法不同的 vue 组件中调用函数