此为历史版本和 IPFS 入口查阅区,回到作品页
Sokiraon
IPFS 指纹 这是什么

作品指纹

使用JSFiddle在文章中添加表格(下)

Sokiraon
·
·

上一篇文章中,我們談到了如何使用HTML創建一個表格,並通過CSS對其進行簡單美化。先溫習一下:

上一次的表格

對於一個兩行兩列的表格而言,上面的代碼就已足夠。但是,倘若我們要處理一個規模很大的表格,又該如何呢?按照上面的方法,我們可能不得不在HTML裏寫上一大堆的<th>和<td>,不僅觀感不好,而且還容易出錯。

有一種想法是,我們可以把表格的「排版」與其中的「數據」分離。在這種情況下,「排版」只處理「數據」的表現形式,而不關心後者具體是什麼——後者的改變不會對前者產生影響。

這裏,隆重請出我們今天的主角——Vue!

Vue

Vue是所謂的「前端開發框架」。它擴展了JS代碼的功能,並爲開發者提供了許多便於使用的「語法糖」。Vue的渲染是「響應式」的,這意味着它可以追蹤數據的變化,並實時做出改變——你也許已經注意到了,這十分貼合我們之前提出的應用場景。


在JSFiddle中引入Vue相當簡單,只需在JS選單中選擇Vue擴展:

在JSFiddle引入Vue

...好吧,其實這並不是全部。在使用Vue之前,我們需要先將其「實例化」。首先是HTML的部分:

<!--HTML-->
<div id='app'>
</div>

我們聲明了一個<div>元素。<div>是所謂「內容劃分元素」(Content Division Element),它是一個「容器」,用於承載別的元素,從而將HTML代碼邏輯上地劃分爲多個「塊」,方便開發者管理。這裏,我們就是要把Vue「掛載」到這個<div>元素。注意我們給<div>設置了一個id,這是爲了我們在JS代碼中可以「索引到」它。

下面,我們在JS中寫入以下代碼:

new Vue({
	el: '#app',
})

我們用new Vue()函數來創建一個實例,並傳入了一個參數“#app”給el屬性,也就是指定了Vue所要掛載的對象。“#app”是CSS選擇器語法,其中“#”表示要索引的是id屬性。

到此爲止,我們已經完成了Vue的實例化,現在,可以開始使用了!


Vue提供給我們將數據和HTML分離的功能,方法是在JS中定義數據,並在HTML中使用「模板語法」進行調用。定義數據十分簡單,只需傳給data參數即可:

new Vue({
	el: '#app',
	data: {
		name: 'John',
	},
})

數據採用「鍵-值」對的形式進行存儲。這裏,我們就是聲明了一個值爲“John”,以”name“爲鍵的數據。該數據可以這樣在HTML中被調用:

<!--HTML-->
<div id='app'>
	<h1>{{ name }}</h1>
</div>

注意到h1標籤的內容是{{ name }},而不是我們通常會傳入的純文本值。這就是「模板語法」,它以一組雙大括號爲外殼,中間則是你想要顯示的內容。這裏,模板會查找到Vue實例中定義的數據,並進行替換。渲染後的效果爲:

模板語法的渲染效果

模板語法不僅支持傳入鍵,還支持JavaScript表達式。因此,我們可以把數據稍微定義得複雜一點:

data: {
	name: {
		firstName: 'John',
		lastName: 'Wester',
	},
}

這裏,我們把name定義爲了一個對象(object),這是JS中的一種數據類型。firstName和lastName叫做對象的屬性(property),它可以被理解爲附加到對象上的變量。屬性通過{變量名}.{屬性名}的方式索引。所以,我們可以在模板中這樣寫:

<p>First Name: {{ name.firstName }}</p>
<p>Last Name: {{ name.lastName }}</p>

渲染效果爲:

稍微複雜一點的模板語法

有了這些知識,你大概知道要怎麼改造我們之前那個表格了:

初步改造後的表格

但是,這個方案依然不完美。一個顯而易見的問題就是,我們必須提前知道表頭有兩個、表格數據有name和sex兩個屬性,否則就無從下手。有沒有方法可以解決呢?

這裏,祭出第二個殺器——Vue的「列表渲染」。它允許我們以類似編程語言中循環語句的形式,來將一個數組渲染爲一組列表。例如,在上面的例子裏,我們是將headers聲明爲了一個數組,並用取下標的形式來獲取表頭數據。改用列表渲染後就可以這樣:

<tr>
	<th v-for='header in headers'>
		{{ header }}
	</th>
</tr>

v-for指定了我們獲取數據的方式,需要使用“item in items”形式的特殊語法。如同它的形式所顯示的那樣,v-for會遍歷items數組中的每一個元素,並把每一次遍歷到的元素標記爲item;然後,你就可以像引用普通的數據那樣在模板裏引用item。

想當然地,我們也可以對表格的數據部分做同樣的操作。首先,我們把JS中定義的數據進一步地規範化:

data: {
	headers: ['Name', 'Sex'],
	content: [
		{
			Name: 'John',
			Sex: 'Male',
		},
                {
			Name: 'Nancy',
			Sex: 'Female',
		},
	],
}

這裏,我們把content也定義爲了數組,因爲在真實的使用場景中,表格肯定會有很多行;並且,我們要確保content中的對象的屬性名與headers中的相匹配。爲了體現出列表渲染的能力,我們多添加了一行數據。

相應地,HTML中這樣寫:

<tr v-for='item in content'>
	<td v-for="key in headers">
		{{ item[key] }}
	</td>
</tr>

這裏,我們用了兩個v-for。第一個用於遍歷content,第二個用於遍歷content中的每個屬性;出於抽象的目的,我們假設自己預先並不知道數據中會有哪些鍵,因此便採取了用headers中的值來索引的方法。

完整的代碼爲:

引入了列表渲染和模板語法後的表格代碼

在這篇文章中,我們通過引入Vue,基本實現了表格的「排版」與「數據」的分離。當然,由於篇幅的原因,還有很多有趣的地方沒有講到(比如,現在這個表格還是太醜...),還請大家原諒。

敬請期待下一篇!

CC BY-NC-ND 2.0 授权