当vue.js中的特定卡片上出现单击功能时,如何应用基于图书id或卡片id的样式?

eivnm1vs  于 2021-09-23  发布在  Java
关注(0)|答案(2)|浏览(317)

我开发了一个页面,负责显示书籍,响应来自后端api,基于它显示为卡片的响应数据。
每个图书卡包含两个按钮部分,第一部分包含“添加到书包”和“愿望列表”按钮(默认情况下应可见),第二部分包含一个名为“添加到书包”的按钮(默认情况下应隐藏)。
如果用户单击任何卡的“添加到袋子”按钮,则该按钮应隐藏(添加到袋子和愿望列表),并仅显示特定已单击卡的“添加到袋子”按钮。请帮助我限制其余卡的样式(已单击的卡除外)。
这是单击“添加到行李”按钮之前的默认页面

这就是我在点击任何卡片添加到袋子按钮后获得输出的方式,但我只需要在特定的点击卡片上应用样式
DisplayBooks.vue ```

              <button type="button"  @click="toggle(book.id);toggleClass(book.id);" v-bind:class="[storeBooks.indexOf(book.id) >-1 ? 'red' : 'blue']" class="AddBag">Add to Bag</button>

              <button  class="wishlist">wishlist</button>
          </div>
          <!-- v-if="state==false" -->
          <div v-bind:class="[!(storeBooks.indexOf(book.id)) >-1 ? 'blue':'red']" @click="toggle(book.id)" class="AddedBag">
              <button class="big-btn">Added to Bag</button>
          </div>
      </div>
  </div>
更改组件代码后,我如何获得输出
![](https://i.stack.imgur.com/Goc5L.png)
但实际上我所期待的是[我需要的是]3 `DisplayBooks.scss` ```
@import "colors";
.carddisplay-section {
    display: flex;
    align-items: flex-start;
    flex-wrap: wrap;
    align-content: space-around;
    gap: 10px;
}
.card:hover{
    box-shadow:0.6px 0.6px 0.6px 0.6px rgb(173, 206, 206);
}
.card {
    margin-top: 55px;
    margin-left: 110px;
    background:$pink;
    // width: 235px;
    // height: 275px;
    width: 235px;
height: 315px;
    background: $pale_white 0% 0% no-repeat padding-box;
    border: 1px solid $border_clr;
    border-radius: 3px;
    opacity: 1;
}

.image-section {
    width: 233px;
    height: 172px;
    background: #F5F5F5 0% 0% no-repeat padding-box;
    border-radius: 2px 2px 0px 0px;
    opacity: 1;
}

img{
    margin-left: 67px;
    margin-top: 17px;
    width: 105px;
    height: 135px;
    opacity: 1;
    border:none;
}

.title-section {
    text-align: left;
    font: normal normal normal 14px/19px Roboto;
    letter-spacing: 0.2px;
    color: $light_black;
    opacity: 1;
    margin-left: 20px;
    margin-top: 3px;
    width: 130px;
    height: 19px;
    text-transform: capitalize;
}

.author-section {
    text-align: left;
    font: normal normal normal 13px/13px Roboto;
    letter-spacing: 0px;
    color: $light_grey;
    opacity: 1;
    width: 123px;
    height: 13px;
    margin-left: 20px;
    margin-top: 7px;
}

.price-section {
    text-align: left;
    font: normal normal bold 12px/16px Roboto;
    letter-spacing: 0px;
    color: $light_black;
    opacity: 1;
    margin-left: 20px;
    height: 16px;
    margin-top: 26px;
    display: flex;
    justify-content: flex-start;

}

label {
    text-decoration-line: line-through;
    font: normal normal normal 10px/13px Roboto;
    letter-spacing: 0px;
    color: $light_grey;
    opacity: 1;
    width: 36px;
    height: 13px;
    margin-top: 2.5px;
    margin-left: 1em;
}

button[type="submit"] {
    border: none;
    padding-left: 65px;
    background: none;
    font-size: 15;
}
.button-groups{
    display:flex;
    margin-top:8px;
}
.AddBag{
    background: #A03037 0% 0% no-repeat padding-box;
    border-radius: 2px;
    opacity: 1;
    width: 93px;
    height: 29px;
    margin-left:20px;
    color: #FFFFFF;
    text-transform: uppercase;
    opacity: 1;
    font-size: small;
}
.wishlist{
    margin-left:4px;
    color: #FFFFFF;
    text-transform: uppercase;
    opacity: 1;
    font-size: small;
    border: 1px solid #7c7a7a;
    border-radius: 2px;
    opacity: 1;
    color: #0A0102;
    width:93px;
}
.big-btn{
    width: 191px;
height: 29px;
margin-left:20px;
background: #3371B5 0% 0% no-repeat padding-box;
border-radius: 2px;
opacity: 1;
color:#FFFFFF;
}
.red{
    background: red;

}   
.blue{
    background: yellow;
    display:none;
}
wmvff8tz

wmvff8tz1#

您可以在中定义一个数组来存储在组件数据函数中添加的卡,如storebooks storeBooks=[] ```
toggle = (id) => {
const index = this.storeBooks.indexOf(id);
if(index > -1) {this.storeBooks = this.storeBooks.splice(index,1)}
else{
this.storeBooks.add(id)
}}

在图书卡中,你可以 `isActive = storeBooks.indexOf(book.id) > -1` 定级
这样地
              <button type="button"  @click="toggle(book.id);toggleClass(book.id);" v-bind:class="[storeBooks.indexOf(book.id) >-1 ? 'red' : 'blue']" class="AddBag">Add to Bag</button>

              <button  class="wishlist">wishlist</button>
          </div>
          <!-- v-if="state==false" -->
          <div v-bind:class="[storeBooks.indexOf(book.id) >-1 ? 'blue':'red']" @click="toggle(book.id)" class="AddedBag">
              <button class="big-btn">Added to Bag</button>
          </div>
      </div>
  </div>
2j4z5cfb

2j4z5cfb2#

您当前只有一个布尔值可用于检查图书是否添加到购物车,如果您添加了其中任何一个,则会自动触发该类,它将影响所有其他图书。
您可以通过向书本数据添加额外的键来解决此问题,这样您就可以使用数组附带的spread运算符和map函数检查是否添加了单独的书本:

data  = data.map(item => ({...item, isActive: false}))

这段代码所做的就是获取每个book对象,并将带有false值的isactive键添加到其中。您只需在html和v-show中使用此键即可显示您喜欢的按钮:

<div class="button-groups" v-show="!book.isActive">
  <button type="button" @click="book.isActive=!book.isActive;" class="AddBag red">Add to Bag</button>
  <button  class="wishlist">wishlist</button>
</div>

<div @click="book.isActive=!book.isActive" class="AddedBag blue" v-show="book.isActive">
  <button class="big-btn">Added to Bag</button>
</div>

通过这种方式,您可以控制要显示的按钮,我建议您更改isactive变量的名称,因为理解什么是活动的很容易混淆。

相关问题