# Emmet
:::success
:bookmark: 目錄
[TOC]
:::
## Emmet介紹 [影片](https://www.youtube.com/watch?v=EOFL8NJUlf8&ab_channel=WeiWei)
當我們於程式碼編輯器輸入我們的程式碼後,有時會看到該編輯器提醒我們有哪些語法可以使用,這就是Emmet,Emmet對於開發人員來說是個非常便利的外掛工具,如以下所示

現在打開VS CODE一起來使用Emmet吧,可以先在html的檔案內輸入!後按下Tab看看結果哦!
### Element Emmet
最基礎的就是使用Tag名稱觸發Emmet,以下範例都可以直接在VS CODE中使用
```htmlembedded=
<!-- 按下tab即可看到結果 -->
h1 -> <h1></h1>
p -> <p></p>
btn -> <Button></Button>
form -> <form action=""></form>
```
我們也可以幫這些Tag加上class或id
```htmlembedded=
h1#h1 -> <h1 id="h1"></h1>
div.box -> <div class="box"></div>
.box -> <div class="box"></div>
```
### Attribute Emmet
接著我們可以幫我們的Tag加上一些屬性
```htmlembedded=
<!-- 按下tab即可看到結果 -->
input:text -> <input type="text" name="" id="">
form:get -> <form action="" method="get"></form>
p[color="#fff"] -> <p color="#fff"></p>
div[name='box' id='box'] -> <div name="box" id="box"></div>
```
### Text Emmet
剛剛使用的Emmet都沒有幫Tag加上文字,我們也可以使用Emmet補上文字,只要加上 **{}** 即可
```htmlembedded=
<!-- 按下tab即可看到結果 -->
h1{Hello World} -> <h1>Hello World</h1>
p{This is Test} -> <p>This is Test</p>
btn{Click Me} -> <button>Click me</button>
```
### Nesting Emmet
我們也可以直接使用階層式的Emmet,上面都是使用單一Tag而已。
```htmlembedded=
<!-- 按下tab即可看到結果 -->
.parentBox>.childBox>h1{Inside Text} ->
<div class="parentBox">
<div class="childBox">
<h1>Inside Text</h1>
</div>
</div>
```
也可以利用運算式來使用Emmet
#### 運算式 + (同階層)
```htmlembedded=
.box1+.box2+.box3 ->
<div class="box1"></div>
<div class="box2"></div>
<div class="box3"></div>
```
#### 運算式 * (數量)
```htmlembedded=
.box*2 ->
<div class="box"></div>
<div class="box"></div>
```
## 客制化自己的Emmet 以VS CODE為例 [影片](https://youtu.be/ymiX3x9Hjrg)
我們其實是可以客制化自己的Emmet的,透過客制化Emmet可以增進我們的開發速度。
在VS CODE中我們點選左上角**File**->**Preferences**->**User Snippets**之後會跳出以下視窗

這時候我們只要打上我們想要客製化的程式語言,就會出現對應語言的json檔,以下先以JavaScript為例

打開json檔案後我們先介紹一下該json的結構
***javascript.json***
```json=
{
// Place your snippets for javascript here. Each snippet is defined under a snippet name and has a prefix, body and
// description. The prefix is what is used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
// $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders. Placeholders with the
// same ids are connected.
// Example:
"Print to console": {
"prefix": "log",
"body": [
"console.log('$1');",
"$2"
],
"description": "Log output to console"
}
}
```
prefix
: prefix內要輸入的是你要觸發Emmet提示的文字
body
: body內要輸入的是觸發Emmet後要輸出的程式碼
description
: description內要輸入的是該段Emmet的敘述,在提示時會出現。
$1,$2, $n....
: 在body的地方加上 **$1(or $2)** 可以讓設定多重選項,如果有設定到 **$2** 以上按下**Tab**後即可從 **$1跳至設定$2** 的地方並再次觸發Emmet,如下所示:

## Bonus
這邊將簡單設定Axios的Snippets
***javascript.json***
```json=
{
"Axios Request": {
"prefix": "ar",
"body": [
"axios.${1|get,post,put,delete|}('${2:url}')",
".then(res => res.json())",
".then(data => {",
" $3",
"})",
".catch(err => console.log(err))"
],
"description": "Axios Request"
}
}
```
成果如下
