Vue.js - 从方法计算的值不会显示在循环列表中

Posted

技术标签:

【中文标题】Vue.js - 从方法计算的值不会显示在循环列表中【英文标题】:Vue.js - calculated value from method doesn't display in looped list 【发布时间】:2020-11-18 10:56:53 【问题描述】:

我觉得这是一个计时的事情,但不一定是异步的事情。我正在循环一个对象并显示一个项目列表。对于其中一个值,我需要用一种方法来计算。

直接在项目对象上显示的值很好,但计算出来的值永远不会显示,即使我可以 console.log 它并且它就在那里。

我正在尝试更改键顶部以重新呈现列表,但没有运气。我尝试将其设为计算属性,但遇到了“不是函数”的问题。

<ul>
  <li
    v-for="(item, index) in list"
    :key="index"
    class="list-wrap"
  >
    <span> 
       item.name  <---- this value shows every time.
    </span>
      <span class="location">
         getLocation(item.Location[0])  <---- this "calculated" value returns only sometimes.
      </span>
  </li>
</ul>

getLocation 方法:

methods: 
  getLocation(loc)  // id coming from item in loop
    this.locations.forEach((location) =>  // loop through locations obj, match id, return location name.
      let match;
      if (location.id === loc) 
        match = location.name;
        console.log(match); <---- present / correct on every refresh
        return match; <--- not rendering
      
    );
  ,
,

// 列表是在异步 api 调用中创建的

async getCurUserTransfers() 
  await airtableQuery
    .getTableAsync("Transfers", 100, "Grid view")
    .then((data) => 
      this.list = data.filter( // list is a filtered table.
        (transfer) =>
          transfer.fields.User === this.curUserNicename ||
          transfer.fields.User === this.curUserDisplayName
      );
    );
,

【问题讨论】:

【参考方案1】:

计算字段的最佳做法是使用计算属性,因此您应该添加一个名为 listWithLocation 的计算属性,然后循环遍历它:

computed:
     listWithLocation()

     return this.list.map( item=>
        item.itemLocation=this.getLocation(item.Location[0]);// add field itemLocation and use the method already defined
         return item;
    ) 


模板:

<ul>
  <li
    v-for="(item, index) in listWithLocation"
    :key="index"
    class="list-wrap"
  >
    <span> 
       item.name  
    </span>
      <span class="location">
        item.itemLocation
      </span>
  </li>
</ul>

方法:

methods: 
  getLocation(loc)  
    return this.locations.find((location) =>  // this returns the matched location
     
     return location.id === loc;
      
    );
  ,
,

【讨论】:

问题是,v-for 循环的对象与我循环查找匹配的对象不同。我会看看我是否可以让它工作。模板 v-for 循环需要是“列表”对象,而要检查的对象需要是“位置”对象。 我认为问题出在方法上 我的代码比我给出的示例要复杂一些,所以我正在使用您的代码,看看我是否可以让它工作。主 v-for 列表(代码中的 listWithLocation)在异步 api 调用中的 created() 处生成。因此,在计算的道具列表中最初是未定义的,然后出现在 updated() 上。我收到"TypeError: this.list.map is not a function" 错误。我不确定如何让计算的道具等到更新。 list 是一个对象吗?如果是,请提供一个 sn-p 我在原始问题的底部添加了 api 调用方法(称为 created())。【参考方案2】:

您在方法中嵌套的匿名函数中的 return 语句。所以,主函数没有返回值。

如果您需要计算域,则必须在称为computed 的特定数组中声明计算域。 https://vuejs.org/v2/guide/computed.html

【讨论】:

以上是关于Vue.js - 从方法计算的值不会显示在循环列表中的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js:通过循环遍历数组值来绑定文本字段的值

vue.js中的Watcher不会收到值

Vue JS - 遍历计算属性以显示年份列表

Vue.js:根据方法对列表进行排序

在循环中渲染复选框并在 Vue JS 中绑定它们的值

使用 Vue JS 和 for 循环设置活动状态