首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Vue.js模板中定义临时变量

如何在Vue.js模板中定义临时变量
EN

Stack Overflow用户
提问于 2017-05-16 11:00:18
回答 7查看 68K关注 0票数 59

下面是我当前的模板:

代码语言:javascript
复制
<a-droppable v-for="n in curSize" :key="n - 1" :style="{width: `${99.99 / rowLenMap[orderList[n - 1]]}%`, order: orderList[n - 1]}">
  <a-draggable :class="{thin: rowLenMap[orderList[n - 1]] > 10}">
    <some-inner-element>{{rowLenMap[orderList[n - 1]]}}</some-inner-element>
  </a-draggable>
</a-droppable>

问题是我必须多次编写rowLenMap[orderList[n - 1]],而且恐怕vue.js引擎也会多次计算它。

我想要的是这样的:

代码语言:javascript
复制
<a-droppable v-for="n in curSize" :key="n - 1" v-define="rowLenMap[orderList[n - 1]] as rowLen" :style="{width: `${99.99 / rowLen}%`, order: orderList[n - 1]}">
  <a-draggable :class="{thin: rowLen > 10}">
    <some-inner-element>{{rowLen}}</some-inner-element>
  </a-draggable>
</a-droppable>

我认为在技术上实现它并不困难,因为它可以通过使用类似v-for="rowLen in [rowLenMap[orderList[n - 1]]]"之类的东西笨拙地解决。那么,是否有任何简洁和正式的解决办法?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2017-05-16 12:37:00

curSize是一个数组。临时值包含相应的隐含数组sizedOrderList = curSize.map(n => orderList[n-1])。如果将其定义为计算值,则HTML将变为

代码语言:javascript
复制
<a-droppable v-for="n, index in sizedOrderList" :key="curSize[index]" :style="{width: `${99.99 / rowLenMap[n]}%`, order: n}">
  <a-draggable :class="{thin: rowLenMap[n] > 10}">
    <some-inner-element>{{rowLenMap[n]}}</some-inner-element>
  </a-draggable>
</a-droppable>
票数 -4
EN

Stack Overflow用户

发布于 2019-05-22 04:13:26

我找到了一种非常简单(几乎神奇的)方法来实现这一点,它所做的就是定义一个内联(本地)变量,并使用您想要多次使用的值:

代码语言:javascript
复制
<li v-for="id in users" :key="id" :set="user = getUser(id)">
  <img :src="user.avatar" />
  {{ user.name }}
  {{ user.homepage }}
</li>

注意:set不是Vuejs中的特殊支柱,它只是用作变量定义的占位符。

Sourcehttps://dev.to/pbastowski/comment/7fc9

CodePenhttps://codepen.io/mmghv/pen/dBqGjM

更新:基于@vir us的评论

这不适用于事件,例如,@click="showUser(user)"将不会传递正确的用户,而是始终是最后一个评估用户,这是因为user临时变量将在循环的每个循环中得到重用和替换。

因此,这个解决方案只适合于模板渲染,因为如果组件需要重新呈现,它将重新评估变量。

但是如果您确实需要在事件中使用它(尽管不可取),您需要定义一个外部数组来同时保存多个变量:

代码语言:javascript
复制
<ul :set="tmpUsers = []">
  <li v-for="(id, i) in users" :key="id" :set="tmpUsers[i] = getUser(id)" @click="showUser(tmpUsers[i])">
    <img :src="tmpUsers[i].avatar" />
    {{ tmpUsers[i].name }}
    {{ tmpUsers[i].homepage }}
  </li>
</ul>

https://codepen.io/mmghv/pen/zYvbPKv

信用:@vir us

虽然在这里基本上复制users数组是没有意义的,但在其他需要调用昂贵函数来获取数据的情况下,这是很方便的,但我认为最好使用computed属性来构建数组。

票数 163
EN

Stack Overflow用户

发布于 2018-12-05 16:15:05

从您的模板判断,您可能最好使用计算属性,就像接受的答案中所建议的那样。

但是,由于问题标题的范围更广(在Google上出现了“Vue模板中的变量”),我将尝试提供一个更通用的答案。

特别是当您不需要转换数组中的所有项时,计算的属性可能是一种浪费。一个子组件也可能是过度的,特别是如果它真的很小(这将使它成为20%的模板,20%的逻辑和60%的道具定义样板)。

我喜欢使用的一个非常简单的方法是一个小助手组件(让我们称之为<Pass>):

代码语言:javascript
复制
const Pass = {
  render() {
    return this.$scopedSlots.default(this.$attrs)
  }
}

现在我们可以这样编写您的组件:

代码语言:javascript
复制
<Pass v-for="n in curSize" :key="n - 1" :rowLen="rowLenMap[orderList[n - 1]]" v-slot="{ rowLen }">
  <a-droppable :style="{width: `${99.99 / rowLen}%`, order: orderList[n - 1]}">
    <a-draggable :class="{thin: rowLen > 10}">
      <some-inner-element>{{rowLen}}</some-inner-element>
    </a-draggable>
  </a-droppable>
</Pass>

<Pass>通过创建一个作用域槽来工作。阅读更多关于Vue.js文档上的作用域插槽的内容,或者了解我就这个主题编写的dev.to文章中的上述方法。

附录: Vue 3

Vue 3对插槽的方法略有不同。首先,需要对<Pass>组件源代码进行如下调整:

代码语言:javascript
复制
const Pass = {
  render() {
    return this.$slots.default(this.$attrs)
  }
}
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43999618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档