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
留言分享你的想法!
avatar-img
卡關的人生
2會員
73內容數
分享生活趣事~
卡關的人生的其他內容
2024/11/10
Vue 提供了多種動畫技術來提升應用程式的互動性,包括基於 CSS 類別的動畫、基於狀態的動畫,以及使用監視器來動畫化數值。基於類別的動畫可通過動態添加 CSS 類別來觸發,像是觸發按鈕搖動效果。基於狀態的動畫則是透過樣式綁定,根據互動動態調整元素的外觀,例如根據滑鼠位置改變背景顏色。
Thumbnail
2024/11/10
Vue 提供了多種動畫技術來提升應用程式的互動性,包括基於 CSS 類別的動畫、基於狀態的動畫,以及使用監視器來動畫化數值。基於類別的動畫可通過動態添加 CSS 類別來觸發,像是觸發按鈕搖動效果。基於狀態的動畫則是透過樣式綁定,根據互動動態調整元素的外觀,例如根據滑鼠位置改變背景顏色。
Thumbnail
2024/11/09
Web Components 是一組網頁原生 API,允許開發者創建可重複使用的自訂元素。Vue 與 Web Components 是互補的技術,Vue 支援整合和創建自訂元素。
Thumbnail
2024/11/09
Web Components 是一組網頁原生 API,允許開發者創建可重複使用的自訂元素。Vue 與 Web Components 是互補的技術,Vue 支援整合和創建自訂元素。
Thumbnail
2024/11/08
Vue 建議使用模板構建應用程式,但在需要 JavaScript 的全程式化功能時,渲染函數可派上用場。渲染函數通過 h() 函數創建 vnode,h 是 hyperscript 的簡寫,能生成 HTML 的 JavaScript。
Thumbnail
2024/11/08
Vue 建議使用模板構建應用程式,但在需要 JavaScript 的全程式化功能時,渲染函數可派上用場。渲染函數通過 h() 函數創建 vnode,h 是 hyperscript 的簡寫,能生成 HTML 的 JavaScript。
Thumbnail
看更多
你可能也想看
Thumbnail
蝦皮分潤計畫讓我在分享旅遊文章時,也能透過推薦好物累積被動收入,貼補旅行基金。這篇文章,除了介紹計畫的操作亮點與心得,也分享我最常應用的案例:「旅行必備小物 TOP5」,包含行李鎖、免洗內衣褲、分裝瓶、折疊衣架與真空壓縮袋,幫助出國打包更輕鬆。想同時記錄旅行、分享好物又創造額外收入的你,千萬別錯過!
Thumbnail
蝦皮分潤計畫讓我在分享旅遊文章時,也能透過推薦好物累積被動收入,貼補旅行基金。這篇文章,除了介紹計畫的操作亮點與心得,也分享我最常應用的案例:「旅行必備小物 TOP5」,包含行李鎖、免洗內衣褲、分裝瓶、折疊衣架與真空壓縮袋,幫助出國打包更輕鬆。想同時記錄旅行、分享好物又創造額外收入的你,千萬別錯過!
Thumbnail
想增加被動收入?加入蝦皮分潤計畫是輕鬆上手的好方法!本文提供完整教學,包含申請流程、賺取分潤技巧,以及實際使用心得分享,助你輕鬆獲得額外收入。
Thumbnail
想增加被動收入?加入蝦皮分潤計畫是輕鬆上手的好方法!本文提供完整教學,包含申請流程、賺取分潤技巧,以及實際使用心得分享,助你輕鬆獲得額外收入。
Thumbnail
在這個範例中,我們展示了如何使用 Vue 的 v-model 來實現各種表單元件的雙向綁定。範例包括文字輸入框、單選框、多選框、單選按鈕、下拉選單和多選下拉選單。使用 ref 創建響應式變數,並在 template 中使用 v-model 進行雙向綁定。這使得表單元件能夠即時反映和更新數據。
Thumbnail
在這個範例中,我們展示了如何使用 Vue 的 v-model 來實現各種表單元件的雙向綁定。範例包括文字輸入框、單選框、多選框、單選按鈕、下拉選單和多選下拉選單。使用 ref 創建響應式變數,並在 template 中使用 v-model 進行雙向綁定。這使得表單元件能夠即時反映和更新數據。
Thumbnail
先前提到 Quasar 的 Dialog Plugin 很好用,再讓我補充一個用法。
Thumbnail
先前提到 Quasar 的 Dialog Plugin 很好用,再讓我補充一個用法。
Thumbnail
各位使用 Vue.js 開發的小夥伴們,你們都怎麼實作父子層組件資料的雙向綁定呢?如果你還在寫 prop + emit 的話,不妨進來看看吧。
Thumbnail
各位使用 Vue.js 開發的小夥伴們,你們都怎麼實作父子層組件資料的雙向綁定呢?如果你還在寫 prop + emit 的話,不妨進來看看吧。
Thumbnail
平常我們在 html 上常看到的例如 v-for、v-model 等等... 也是VUE已經幫我們定義好的指令,而這次我們可以依這自己的需求來建立。 此功能屬於較進階的功能,因此實戰中會比較少見,市面上還是有不少完善的套件能達到同樣效果,建議可以先往這方面察找
Thumbnail
平常我們在 html 上常看到的例如 v-for、v-model 等等... 也是VUE已經幫我們定義好的指令,而這次我們可以依這自己的需求來建立。 此功能屬於較進階的功能,因此實戰中會比較少見,市面上還是有不少完善的套件能達到同樣效果,建議可以先往這方面察找
Thumbnail
自訂元件生成位置顧名思義就是可以指定部分HTML區塊渲染在特定的畫面上,即使在不同組件也能把A組件內的部分畫面,展現在B組件上,以下方程式舉例。
Thumbnail
自訂元件生成位置顧名思義就是可以指定部分HTML區塊渲染在特定的畫面上,即使在不同組件也能把A組件內的部分畫面,展現在B組件上,以下方程式舉例。
Thumbnail
Vue.js是一種基於MVVM的前端JavaScript框架,類似的框架有React、Angular等。 架設環境 安裝Visual Studio Code(https://code.visualstudio.com/) 安裝Node.js(https://nodejs.org/en/
Thumbnail
Vue.js是一種基於MVVM的前端JavaScript框架,類似的框架有React、Angular等。 架設環境 安裝Visual Studio Code(https://code.visualstudio.com/) 安裝Node.js(https://nodejs.org/en/
Thumbnail
樣板模式的定義極為簡單,卻是大型系統程式、WEB/APP應用框架的設計核心,完美展現設計模式的價值: 簡單、高效、強大。
Thumbnail
樣板模式的定義極為簡單,卻是大型系統程式、WEB/APP應用框架的設計核心,完美展現設計模式的價值: 簡單、高效、強大。
Thumbnail
2023 Vue直播班筆記 - 動態路由Props,接續之前的一般動態路由。分為 "寫死" 及 "彈性" 兩種。
Thumbnail
2023 Vue直播班筆記 - 動態路由Props,接續之前的一般動態路由。分為 "寫死" 及 "彈性" 兩種。
Thumbnail
Vue Router 及 具名視圖,擺脫以往切換依賴 CSS display:none 跟 display:block 互相配合,有時還得搭配 z-index 來調整層級跟 opacity 透明度的麻煩,而 Vue Router 完美的解決了這棘手的問題,且能客製頁面想要呈現的擺飾。
Thumbnail
Vue Router 及 具名視圖,擺脫以往切換依賴 CSS display:none 跟 display:block 互相配合,有時還得搭配 z-index 來調整層級跟 opacity 透明度的麻煩,而 Vue Router 完美的解決了這棘手的問題,且能客製頁面想要呈現的擺飾。
Thumbnail
這系列是我在 2023 六角學院 Vue作品實戰班的筆記,筆記以本人理解的方式記錄。此篇主題為 Slot Props 進階應用 ,其中包含單筆資料、多筆資料。
Thumbnail
這系列是我在 2023 六角學院 Vue作品實戰班的筆記,筆記以本人理解的方式記錄。此篇主題為 Slot Props 進階應用 ,其中包含單筆資料、多筆資料。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News