Day 26:v-if 才做选择,v-show 全都秀

目前的版面配置是基本的瀑布流效果,而此模式较着重在显示书本封面图片,一列只能出现三本书单,RWD 的情况下又会再压缩显示空间,相对在浏览资讯上的速度会较慢,因此延伸出了新的需求:切换检视模式。这个算是相当常见的功能,例如 Google Drive 云端硬碟,一键切换清单检视或格状检视,同时顾及因应不同情境需要切换检视需求的使用者体验。

在处理切换模式之前,我们先做好前置作业,新增一个以表格方式呈现的资料列表。

<div class="booktable">
  <table>
    <thead>
      <tr>
        <th>ISBN</th>
        <th>书名</th>
        <th>原价</th>
        <th>特价</th>
        <th>连结</th>
        <th>图片</th>
      </tr>
    </thead>
    <tbody>
      <tr v-for="book in bookList" :key="book.id">
        <td>{{ book.ISBN }}</td>
        <td>{{ book.name }}</td>
        <td>{{ book.originPrice }}</td>
        <td class="bargain">{{ book.sellPrice }}</td>
        <td><a :href="book.link" target="_blank">连结</a></td>
        <td><img :src="book.image" alt="book image" /></td>
      </tr>
    </tbody>
  </table>
</div>

排版样式就因人而异进行处理了,例如可以设置表格固定高度并处理纵向 overflow 问题,同时固定表头位置,就像 Excel 冻结首列的功能。
table

截至目前在 BookList.vue 元件内会同时存在两种检视模式,因此需要再新增切换按钮,我们先简单设置两个 <button>,并在其上监听 click 事件以及检视状态。

预设 isShelf: true,因此一开始会以图表模式呈现,希望达到的效果是当点击「显示表格」的按钮时,会因为变成 isShelf: false 而改为呈现表格模式。

<button class="image_mode" @click="isShelf = true">显示图表</button>
<button class="table_mode" @click="isShelf = false">显示表格</button>
data() {
  return {
    isShelf: true,
  };
},

v-ifv-else

接下来剩下关键设置,在两种检视模式的资料最外层,加上 v-ifv-else 进行条件式渲染。其判断方式就是当条件为 true 时,才会显示隶属於设定条件层级之内的所有程序码,意即在父层设定条件之後,符合条件的子层内容才会显示在画面上,因此当 v-if 为 true 时,才会显示 v-else 的子层内容。

<div class="bookshelf" v-if="isShelf">
    <!-- 略 -->
</div>

<div class="booktable" v-else>
	<!-- 略 -->
</div>
data() {
  return {
    isShelf: true,
  };
},

了解切换过程之後,可以再进一步将两个按钮合而为一,只需点击同一个按钮就能进行切换检视模式。

v-if on <template>

一般在 .vue 单一元件档案内,最外层的 <template> 内只能包含一个根元素,若超过一个元素会报错。(此为 Vue 2 的限制规则,但在 Vue 3 已改为可支援同时存在多个根元素,详见 Fragments 说明版本差异)

<template>
  <h1>BookList</h1>
  <div class="BookList">
</template>

template

<template> 其实还可以作为一个不会被渲染到画面中的包装元素(Conditional Groups with v-if on <template>),只负责处理逻辑判断,并且能在一个 .vue 档案内使用多个 <template>。

因此利用 <template> 的包装特性,再加上条件运算子绑定样式以区分不同检视模式,便能整合按钮功能。

<button
  :class="[isShelf ? 'image_mode' : '']"
  @click="isShelf = !isShelf"
>
  <template v-if="isShelf">显示图表</template>
  <template v-else>显示表格</template>
</button>

image mode
table mode

v-if 条件渲染 VS v-show 条件显示

条件式渲染还有另一个判断方式,就是控制元素 display 属性的 v-show,其内容无论如何都会被保留在 DOM 中,显示与否是透过 display: none 开关而定。

  • v-ifv-else:只有表达式回传 truthy 值的元素才会被渲染到画面上。
    https://ithelp.ithome.com.tw/upload/images/20211011/201412715VvuHlHUDv.png

    https://ithelp.ithome.com.tw/upload/images/20211011/20141271WEq1jM8RJG.png

  • v-show:即使表达式回传 falsy 值的元素也会被保留在 DOM 中,只是因为 display: none 才未显示在画面上。
    https://ithelp.ithome.com.tw/upload/images/20211011/20141271u1ZO0COhLK.png

参考资料


<<:  [Day26] Micro Services

>>:  Day 28:Diffie–Hellman演算法

Day.5 「我的样式失灵啦!你有头绪吗?」 —— CSS 选择器 与 权重

了解盒模型後,就要为标签套上各种花样了,上一篇介绍了简单的套用方法,但这个套用方法其实不太好用! ...

[DAY 24]Embed功能

今天主要是来介绍一下文字嵌入(Embed)这功能 如果想要在讯息里使用mark down功能的话需要...

Time Machine 的备份提案

一般来说,资料的备份策略从规模的小到大,我们可以有几种选择,如果只是小规模的、轻量的,通常是烧成备...

【Day 20】深度学习(Deep Learning)--- Tip(五)

今天要介绍的是,假设你已经在训练资料上得到很好的结果,但是在测试资料上却得到不好的结果的3种解决方法...

进击的软件工程师之路-软件战斗营 第二周

学习进度 第一周的练习小考与检讨 课後练习与习题检讨 继承、多型与介面 继承(extends)原则与...