EP19 - ex5. Form Bindings

閱讀時間約 1 分鐘
終於來到第五個範例表格綁定摟!
表格的所有應用都可以綁定~
這次範例可以看到很多表單元件摟!
<script setup>
import { ref } from 'vue'

const text = ref('Edit me')
const checked = ref(true)
const checkedNames = ref(['Jack'])
const picked = ref('One')
const selected = ref('A')
const multiSelected = ref(['A'])
</script>

<template>
<p>Example 5:</p>
<h2>Text Input</h2>
<input v-model="text">
<p>{{ text }}</p>

<h2>Checkbox</h2>
<input type="checkbox" id="checkbox" v-model="checked">
<label for="checkbox">Checked: {{ checked }}</label>

<!--
multiple checkboxes can bind to the same
array v-model value
-->
<h2>Multi Checkbox</h2>
<input type="checkbox" id="jack" value="Jack" v-model="checkedNames">
<label for="jack">Jack</label>
<input type="checkbox" id="john" value="John" v-model="checkedNames">
<label for="john">John</label>
<input type="checkbox" id="mike" value="Mike" v-model="checkedNames">
<label for="mike">Mike</label>
<p>Checked names: {{ checkedNames }}</p>

<h2>Radio</h2>
<input type="radio" id="one" value="One" v-model="picked">
<label for="one">One</label>
<br>
<input type="radio" id="two" value="Two" v-model="picked">
<label for="two">Two</label>
<p>Picked: {{ picked }}</p>

<h2>Select</h2>
<select v-model="selected">
<option disabled value="">Please select one</option>
<option>A</option>
<option>B</option>
<option>C</option>
</select>
<p>Selected: {{ selected }}</p>

<h2>Multi Select</h2>
<select v-model="multiSelected" multiple style="width:100px">
<option>A</option>
<option>B</option>
<option>C</option>
</select>
<p>Selected: {{ multiSelected }}</p>
</template>

<script setup>

  • script setup 是 Vue 3 的組件語法糖,可以更簡潔地撰寫組件的邏輯。
  • vue 導入 ref 函數,ref 用於創建響應式的變數。

使用 ref 創建響應式變數:

<script setup>
import { ref } from 'vue'
const text = ref('Edit me')
const checked = ref(true)
const checkedNames = ref(['Jack'])
const picked = ref('One')
const selected = ref('A')
const multiSelected = ref(['A'])
</script>
  1. text 初始化為 'Edit me'
  2. checked 初始化為 true
  3. checkedNames 初始化為包含 'Jack' 的陣列。
  4. picked 初始化為 'One'
  5. selected 初始化為 'A'
  6. multiSelected 初始化為包含 'A' 的陣列。

<template>

  • template 區塊內是組件的 HTML 結構。

Text Input

<h2>Text Input</h2>
<input v-model="text">
<p>{{ text }}</p>
  1. 使用 <h2> 標籤顯示 "Text Input" 標題。
  2. 使用 <input> 標籤與 v-model 雙向綁定 text 變數,使其成為可編輯的輸入框。
  3. 使用 <p> 標籤顯示 text 變數的當前值。

Checkbox

<h2>Checkbox</h2>
<input type="checkbox" id="checkbox" v-model="checked">
<label for="checkbox">Checked: {{ checked }}</label>
  1. 使用 <h2> 標籤顯示 "Checkbox" 標題。
  2. 使用 <input> 標籤創建一個 checkbox,v-model 雙向綁定 checked 變數。
  3. 使用 <label> 標籤顯示 checked 變數的當前值。

Multi Checkbox

<h2>Multi Checkbox</h2>
<input type="checkbox" id="jack" value="Jack" v-model="checkedNames">
<label for="jack">Jack</label>
<input type="checkbox" id="john" value="John" v-model="checkedNames">
<label for="john">John</label>
<input type="checkbox" id="mike" value="Mike" v-model="checkedNames">
<label for="mike">Mike</label>
<p>Checked names: {{ checkedNames }}</p>
  1. 使用 <h2> 標籤顯示 "Multi Checkbox" 標題。
  2. 使用多個 <input> 標籤創建多個 checkbox,每個 checkbox 的 value 屬性設定不同的名字,並且 v-model 雙向綁定 checkedNames 陣列。這允許多個 checkbox 共享同一個數組。
  3. 使用多個 <label> 標籤顯示對應 checkbox 的名稱。
  4. 使用 <p> 標籤顯示 checkedNames 陣列的當前值。

Radio

<h2>Radio</h2>
<input type="radio" id="one" value="One" v-model="picked">
<label for="one">One</label>
<br>
<input type="radio" id="two" value="Two" v-model="picked">
<label for="two">Two</label>
<p>Picked: {{ picked }}</p>
  1. 使用 <h2> 標籤
  2. 顯示 "Radio" 標題。
  3. 使用多個 <input> 標籤創建多個 radio 按鈕,每個 radio 按鈕的 value 屬性設定不同的值,並且 v-model 雙向綁定 picked 變數。這允許在多個 radio 按鈕中選擇一個。
  4. 使用多個 <label> 標籤顯示對應 radio 按鈕的選項。
  5. 使用 <br> 標籤換行。
  6. 使用 <p> 標籤顯示 picked 變數的當前值。

Select

<h2>Select</h2>
<select v-model="selected">
<option disabled value="">Please select one</option>
<option>A</option>
<option>B</option>
<option>C</option>
</select>
<p>Selected: {{ selected }}</p>
  1. 使用 <h2> 標籤顯示 "Select" 標題。
  2. 使用 <select> 標籤創建一個下拉選單,v-model 雙向綁定 selected 變數。
  3. 使用多個 <option> 標籤定義選項,包括一個禁用的提示選項和三個有效選項 ABC
  4. 使用 <p> 標籤顯示 selected 變數的當前值。

Multi Select

<h2>Multi Select</h2>
<select v-model="multiSelected" multiple style="width:100px">
<option>A</option>
<option>B</option>
<option>C</option>
</select>
<p>Selected: {{ multiSelected }}</p>
  1. 使用 <h2> 標籤顯示 "Multi Select" 標題。
  2. 使用 <select> 標籤創建一個多選下拉選單,v-model 雙向綁定 multiSelected 陣列,multiple 屬性允許多選,並設置樣式使其寬度為 100px。
  3. 使用多個 <option> 標籤定義選項 ABC
  4. 使用 <p> 標籤顯示 multiSelected 陣列的當前值。
看過表單的綁定之後,更有感覺了!
好像真的不難~只是一開始的不習慣而已www
至少v-model好像比較懂了www

[補充] v-model還有什麼用處?修飾符

除了基本的雙向綁定功能,v-model 還有一些特別的特性和用法:

  • .lazy:只在 change 事件後同步數據,而不是在每次 input 事件後立即同步。
  • .number:將輸入值自動轉換為數字。
  • .trim:自動過濾輸入值兩端的空格。
<input v-model.lazy="text">
<input v-model.number="age">
<input v-model.trim="name">

[補充] 自定義組件上的 v-model

在 Vue 3 中,v-model 不僅可以用在原生表單元素上,還可以用在自定義組件上。當你使用 v-model 綁定一個自定義組件時,實際上是綁定了組件的一個特殊的 modelValue 屬性,並且該組件需要觸發一個 update:modelValue 事件來通知父組件值的變化。

父組件的使用方式

在父組件中,我們可以這樣使用 v-model 綁定自定義組件:

<MyComponent v-model="myData"></MyComponent>

這樣 v-model 會綁定 MyComponent 組件的 modelValue 屬性,並且父組件中的 myData 變數將與子組件中的值進行雙向綁定。

子組件的實現方式

在子組件中,我們需要做以下幾件事:

  1. 聲明 modelValue 屬性:這是用來接收父組件傳遞過來的值。
  2. 監聽輸入變化並觸發 update:modelValue 事件:當輸入值改變時,觸發該事件來通知父組件更新值。

這是子組件的具體實現:

<template>
<input :value="modelValue" @input="$emit('update:modelValue', $event.target.value)">
</template>

<script>
export default {
props: {
modelValue: {
type: String,
required: true
}
}
}
</script>


父組件:

<MyComponent v-model="myData"></MyComponent>

子組件:

<template>
<input :value="modelValue" @input="$emit('update:modelValue', $event.target.value)">
</template>

<script>
export default {
props: {
modelValue: String
}
}
</script>

完整示例

父組件

<template>
<div>
<h1>父組件</h1>
<p>父組件中的值: {{ parentData }}</p>
<MyComponent v-model="parentData"></MyComponent>
</div>
</template>

<script>
import { ref } from 'vue'
import MyComponent from './MyComponent.vue'

export default {
components: {
MyComponent
},
setup() {
const parentData = ref('')

return {
parentData
}
}
}
</script>

子組件 (MyComponent.vue)

<template>
<div>
<h2>子組件</h2>
<input :value="modelValue" @input="$emit('update:modelValue', $event.target.value)">
<p>子組件中的值: {{ modelValue }}</p>
</div>
</template>

<script>
export default {
props: {
modelValue: {
type: String,
required: true
}
}
}
</script>
  1. 父組件
    • parentData 是一個響應式變數,用於存儲父組件中的數據。
    • 使用 v-modelparentData 綁定到 MyComponent 組件。
  2. 子組件
    • 定義了一個 modelValue 屬性,這是 v-model 自動綁定的屬性。
    • <input> 標籤中,使用 :value="modelValue"modelValue 的值綁定到輸入框。
    • 當輸入框的值變化時,觸發 @input="$emit('update:modelValue', $event.target.value)",這將 input 事件的值發送給父組件,更新 parentData 的值。

這樣,父組件中的 parentData 和子組件中的 modelValue 就實現了雙向綁定。當子組件的輸入框中的值發生變化時,父組件中的 parentData 會自動更新,反之亦然。

啥咪父子?霧煞煞

在 Vue 中使用 v-model 時,是父組件控制和使用子組件的資料。具體來說,父組件將資料傳遞給子組件,子組件通過 v-model 的雙向綁定機制,將資料變動反饋給父組件。這樣就實現了父子組件之間的數據同步。

父組件使用子組件的資料

父組件傳遞初始資料給子組件,然後監聽子組件的變動,這是一個自上而下的資料流。

總結:

  • 父組件 負責傳遞資料給 子組件
  • 子組件 通過 v-model 將資料的變動反饋給 父組件
由於物件導向觀念是會先有父類別才會有子類別,
而這邊的父子跟那邊是不一樣的唷www
父組件和子組件之間的關係更像是一種組合(Composition),而不是繼承(Inheritance)。
avatar-img
2會員
70內容數
分享生活趣事~
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
卡關的人生 的其他內容
這個範例包含六個基礎範例,接下來的實用範例將會更有趣。第四個範例關於條件與迴圈,實作起來也不難。在介紹這個範例之前,注意到如果組件的 <style> 標籤中缺少 scoped 屬性,樣式會全局生效,影響到其他組件的按鈕樣式。因此,請確保每個組件的樣式都加上 scoped。
範例中,message 用於顯示動態標題,isRed 控制段落顏色的切換,color 用於設定文本顏色。透過點擊事件,使用者可以切換 isRed 和 color 的值。具體來說,當滑鼠懸停在 <span> 上時,會顯示 "Hello World!" 的標題;點擊段落則會改變其顏色。
這次可以將範例內容轉移到components資料夾中,並在App.vue中引用它們。在App.vue中使用import引入其他組件。新範例中定義了兩個函數:一個用於反轉字串,另一個用於彈出警告框。透過按鈕點擊可觸發這些功能。這些範例簡單易懂,實作會比閱讀文件更有效率!
透過 npm run dev 啟動開發伺服器,並可使用 VSCode 的簡單瀏覽器即時預覽。開始實作一個簡單的 "Hello World" 範例,透過 <script setup> 簡化元件定義,並理解響應式變數的運作。實作後能加深對 Vue 的理解,實踐是學習的最佳方式。
組件組成一棵樹狀結構,類似於嵌套的 HTML 元素,但 Vue 提供了自定義內容和邏輯的封裝。通常我們會在專用的 .vue 文件中定義組件,並使用 <script setup> 來輕鬆管理狀態和事件。組件可以重複使用,並透過 props 傳遞數據,使用插槽實現內容分發。
介紹如何使用 ref 屬性來獲取 DOM 元素或子組件的引用,並展示了在模板中使用 <template> 標籤來定義 HTML 結構。講解了在 Composition API 中透過 useTemplateRef 獲取引用。在 v-for 內使用 ref 生成引用陣列和綁定函數作為 ref 的方式。
這個範例包含六個基礎範例,接下來的實用範例將會更有趣。第四個範例關於條件與迴圈,實作起來也不難。在介紹這個範例之前,注意到如果組件的 <style> 標籤中缺少 scoped 屬性,樣式會全局生效,影響到其他組件的按鈕樣式。因此,請確保每個組件的樣式都加上 scoped。
範例中,message 用於顯示動態標題,isRed 控制段落顏色的切換,color 用於設定文本顏色。透過點擊事件,使用者可以切換 isRed 和 color 的值。具體來說,當滑鼠懸停在 <span> 上時,會顯示 "Hello World!" 的標題;點擊段落則會改變其顏色。
這次可以將範例內容轉移到components資料夾中,並在App.vue中引用它們。在App.vue中使用import引入其他組件。新範例中定義了兩個函數:一個用於反轉字串,另一個用於彈出警告框。透過按鈕點擊可觸發這些功能。這些範例簡單易懂,實作會比閱讀文件更有效率!
透過 npm run dev 啟動開發伺服器,並可使用 VSCode 的簡單瀏覽器即時預覽。開始實作一個簡單的 "Hello World" 範例,透過 <script setup> 簡化元件定義,並理解響應式變數的運作。實作後能加深對 Vue 的理解,實踐是學習的最佳方式。
組件組成一棵樹狀結構,類似於嵌套的 HTML 元素,但 Vue 提供了自定義內容和邏輯的封裝。通常我們會在專用的 .vue 文件中定義組件,並使用 <script setup> 來輕鬆管理狀態和事件。組件可以重複使用,並透過 props 傳遞數據,使用插槽實現內容分發。
介紹如何使用 ref 屬性來獲取 DOM 元素或子組件的引用,並展示了在模板中使用 <template> 標籤來定義 HTML 結構。講解了在 Composition API 中透過 useTemplateRef 獲取引用。在 v-for 內使用 ref 生成引用陣列和綁定函數作為 ref 的方式。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
各位使用 Vue.js 開發的小夥伴們,你們都怎麼實作父子層組件資料的雙向綁定呢?如果你還在寫 prop + emit 的話,不妨進來看看吧。
Thumbnail
切換頁面卡卡有很多種原因,這裡舉的例子只針對元件太大的情境。 除了想辦法拆分外,還有一個方法就是利用 Vue 的 Async Component。
Thumbnail
一開始你先把你的專案push上去後,修改vite.config.ts ,要在裡面新增  base: "/Cart/" (/放自己的專案名稱/) build: {outDir: "docs"}, 接下來你要去你的github setting 裡面 -> Page ->選Deploy fro
Thumbnail
※ 視圖模板 視圖模板(View Templates) 是在 MVC 架構中負責展示數據的 HTML 文件,包含模板語法,用於在渲染時插入實際數據。它們的主要目的是分離數據與展示邏輯,讓代碼更加模塊化和易於維護。 視圖模板設計和使用的核心理念,就是「重複的事情不要重複做、效益最大化、有效利用資源
Thumbnail
前言 從零開始構建一個 DateTimePicker 可能看起來令人畏懼,但試想一下你將獲得的靈活性和控制力。在這個系列中,我們將逐步揭開構建過程的神秘面紗,讓您能夠創建一個完全符合需求的自定義 DateTimePicker。 本文章,屬於付費系列的文章,這篇文章,我會希望讀者可以得到的
MVVM(Model View ViewModel),特點是View跟ViewModel之間做資料綁定。 Model 負責儲存應用程式的資料。 View 負責顯示資料。 ViewModel 負責處理View和Model之間的狀態關係。
Thumbnail
因為最近想嘗試編碼風格,於是就選了一套比較"不嚴格"的輔助工具來摸索。 編輯器 VS CODE 框架 VUE3 打包工具 VITE 編碼風格 Standard 環境 version { "nodejs":"v18.18.0", "npm":"9.8.1" }
Thumbnail
平常我們在 html 上常看到的例如 v-for、v-model 等等... 也是VUE已經幫我們定義好的指令,而這次我們可以依這自己的需求來建立。 此功能屬於較進階的功能,因此實戰中會比較少見,市面上還是有不少完善的套件能達到同樣效果,建議可以先往這方面察找
Thumbnail
我們在實作中,難免會遇到在不同組件中,卻有需求相同的資料格式,因此 mixins 可以達到我們的需求,除了 data 以外也包含了 methods 可以共用,舉例來說,學生資料可能會在,班級跟社團內被使用,當我們要撰寫元件時,就可以省略多餘的 data 定義。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
Thumbnail
各位使用 Vue.js 開發的小夥伴們,你們都怎麼實作父子層組件資料的雙向綁定呢?如果你還在寫 prop + emit 的話,不妨進來看看吧。
Thumbnail
切換頁面卡卡有很多種原因,這裡舉的例子只針對元件太大的情境。 除了想辦法拆分外,還有一個方法就是利用 Vue 的 Async Component。
Thumbnail
一開始你先把你的專案push上去後,修改vite.config.ts ,要在裡面新增  base: "/Cart/" (/放自己的專案名稱/) build: {outDir: "docs"}, 接下來你要去你的github setting 裡面 -> Page ->選Deploy fro
Thumbnail
※ 視圖模板 視圖模板(View Templates) 是在 MVC 架構中負責展示數據的 HTML 文件,包含模板語法,用於在渲染時插入實際數據。它們的主要目的是分離數據與展示邏輯,讓代碼更加模塊化和易於維護。 視圖模板設計和使用的核心理念,就是「重複的事情不要重複做、效益最大化、有效利用資源
Thumbnail
前言 從零開始構建一個 DateTimePicker 可能看起來令人畏懼,但試想一下你將獲得的靈活性和控制力。在這個系列中,我們將逐步揭開構建過程的神秘面紗,讓您能夠創建一個完全符合需求的自定義 DateTimePicker。 本文章,屬於付費系列的文章,這篇文章,我會希望讀者可以得到的
MVVM(Model View ViewModel),特點是View跟ViewModel之間做資料綁定。 Model 負責儲存應用程式的資料。 View 負責顯示資料。 ViewModel 負責處理View和Model之間的狀態關係。
Thumbnail
因為最近想嘗試編碼風格,於是就選了一套比較"不嚴格"的輔助工具來摸索。 編輯器 VS CODE 框架 VUE3 打包工具 VITE 編碼風格 Standard 環境 version { "nodejs":"v18.18.0", "npm":"9.8.1" }
Thumbnail
平常我們在 html 上常看到的例如 v-for、v-model 等等... 也是VUE已經幫我們定義好的指令,而這次我們可以依這自己的需求來建立。 此功能屬於較進階的功能,因此實戰中會比較少見,市面上還是有不少完善的套件能達到同樣效果,建議可以先往這方面察找
Thumbnail
我們在實作中,難免會遇到在不同組件中,卻有需求相同的資料格式,因此 mixins 可以達到我們的需求,除了 data 以外也包含了 methods 可以共用,舉例來說,學生資料可能會在,班級跟社團內被使用,當我們要撰寫元件時,就可以省略多餘的 data 定義。