VueJS:绑定具有 3 个潜在值的变量?

Posted

技术标签:

【中文标题】VueJS:绑定具有 3 个潜在值的变量?【英文标题】:VueJS: Binding a variable with 3 potential values? 【发布时间】:2021-05-13 08:09:36 【问题描述】:

我正在开发一个基本的 <CardButton> 组件,并且有 3 个可变卡片大小与是否存在 <img> 相关。如果imgPosition 变量在左侧,则该框如下所示:

如果它在顶部,那么它应该如下所示:

如果没有图像,文本应该像这样居中:

'left' 和 'top' 都可以正常工作,但是如何实现第三个条件 'none'?现在它保持其他两个的样式和对齐方式,我不希望这样。

我有 imgPosition 的默认值为 left 的 prop,但即使我将其设为 type: String 并使用默认值,我仍然无法在模板中实现它。三元代替v-if,但我不能在那里使用3个条件对吗?

<div imgPosition === 'left' ? 'img-left' : 'img-top' : 'img-none'>

不起作用(或对此没有意义。)如何实现这 3 个条件?

如果您需要更多信息,请告诉我!干杯!我已经在下面发布了我的组件的简化版本,没有任何其他边框、样式等。

CardButton.vue

<template>
  <div
    :class="[
      imgPosition === 'left' ? 'img-left' : 'img-top',
      'card-button-wrapper',
    ]"
  >
    <img :src="imgURL"/>
    <div class="labels">
      <div> label </div>
      <div> subLabel </div>
    </div>
  </div>
</template>

<style lang="sass" scoped>
.card-button-wrapper
  display: flex
  position: relative
  border-radius: 10px
  width: max-content
  max-width: 630px
  max-height: 340px
  box-shadow: 0 5px 15px rgba(0,0,0,0.2)

.img-left
  width: 100%
  height: 160px
  img
    margin: 24px 40px

.img-top
  flex-direction: column
  align-items: center
  text-align: center
  .labels
    margin-bottom: 50px
  img
    width: 138px
    height: 138px
    margin: 50px 75px
    margin-right: 72px
    margin-bottom: 50px

.labels
  flex: 1
  display: flex
  justify-content: center
  flex-direction: column
  white-space: pre-line

</style>

<script>
export default 
  name: 'CardButton',
  props: 
    imgURL: 
      type: String,
    ,
    imgPosition: 
      type: String,
      default: 'left',
    ,
    label: 
      type: String,
    ,
    subLabel: 
      type: String,
    ,

  ,

</script>

例子.vue

   <CardButton
      imgURL="/woman-panel-station.svg"
      imgPosition="left"
      label="Top Text"
      subLabel="Bottom Text That is longer"
    />
    <br />
    <CardButton imgURL="/woman.svg" imgPosition="top" :label="`Top Text\nBottom Text" />
    <br />
    <CardButton label="Some Random Text" />

【问题讨论】:

【参考方案1】:

您可以使用imgPosition 变量作为类名的一部分。例如,使用模板文字:

`img-$imgPosition`

这将产生一个名为“img-left”、“img-top”或“img-none”的类。

<div :class="[`img-$imgPosition`, 'card-button-wrapper']">

演示:

new Vue(
  el: "#app",
  data() 
    return 
      imgPosition: '',
      positions: ['top', 'left', 'none']
    
  
);
.img-top 
  background: yellow;

.img-left 
  background: limegreen;

.img-none 
  background: #358293;
<div id="app">
  <div :class="[`img-$imgPosition`, 'card-button-wrapper']">
   I'm a <code>&lt;div&gt;</code>!
  </div>
  <button v-for="pos in positions" @click="imgPosition = pos"> pos </button>
</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>

【讨论】:

以上是关于VueJS:绑定具有 3 个潜在值的变量?的主要内容,如果未能解决你的问题,请参考以下文章

在 WAN 上具有许多绑定变量的 oracle 插入非常慢

如何使用 Access VBA 将具有默认值的未绑定文本框的值设置为空字符串

删除具有绑定布尔值的列表项 - SwiftUI

在 vue 道具上绑定 sass 变量

SQLDeveloper支持绑定变量的IN条件

vuejs methods中的方法互相调用时变量的作用域是