Vue v-model實(shí)現(xiàn)案例介紹
1. 概述
v-model 是 Vue 提供的一個語法糖,它是 value 值和事件的結(jié)合體,它會根據(jù)不同的表單項(xiàng),來選擇執(zhí)行不同的事件。它的作用是,通過和表單元素綁定,實(shí)現(xiàn)雙向數(shù)據(jù)綁定,通過表單項(xiàng)可以更改數(shù)據(jù)。
另外,v-model
還可以用于各種不同類型的輸入,<textarea>
、<select>
元素。它會根據(jù)所使用的元素自動使用對應(yīng)的 DOM 屬性和事件組合:
- 文本類型的
<input>
和<textarea>
元素會綁定value
property 并偵聽input
事件; <input type="checkbox">
和<input type="radio">
會綁定checked
property 并偵聽change
事件;<select>
會綁定value
property 并偵聽change
事件
v-model 會忽略所有表單元素的 value、checked、selected 特性的初始值,而總是將 Vue 實(shí)例的數(shù)據(jù)作為數(shù)據(jù)來源,應(yīng)該在 data 選項(xiàng)中聲明初始值。
語法糖:這種語法對語言的功能并沒有影響,但是更方便程序員使用
2. 使用方法
在沒有使用v-model指令時,我們通過data數(shù)據(jù)控制表單項(xiàng)中的值,還是麻煩的,需要綁定屬性和事件來完成。
<div id="app"> <div> <input type="text" :value="username" @input="setUsername"> </div> </div> <script> const vm = new Vue({ el: '#app', data: { username: '' }, methods: { setUsername(evt) { this.username = evt.target.value.trim() } } }) </script>
使用 v-model 指令實(shí)現(xiàn)上述效果:
<div id="app"> <div> <input type="text" v-model="username"> </div> </div> <script> const vm = new Vue({ el: '#app', data: { username: '' } }) </script>
3. 案例
3.1 用戶登錄
使用 v-model 指令,可以很輕松的獲取表單中的數(shù)據(jù),也可以很輕松地對數(shù)據(jù)進(jìn)行修改。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>vue學(xué)習(xí)使用</title> <script src="./js/vue.js"></script> </head> <body> <div id="app"> <div> <label> 賬號: <input type="text" v-model="username"> </label> </div> <div> <label> 密碼: <input type="text" v-model="password"> </label> </div> <div> <textarea v-model="intro"></textarea> </div> <div> <button @click="dologin">登錄系統(tǒng)</button> </div> </div> <script> const vm = new Vue({ el: '#app', data: { username: '', password: '', intro: 'hahaha' }, methods: { dologin() { console.log(this.username, this.password, this.intro); } } }) </script> </body> </html>
注意:多行文本框中使用插值表達(dá)式 無效
3.2 todolist
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>vue學(xué)習(xí)使用</title> <script src="./js/vue.js"></script> </head> <body> <div id="app"> <input placeholder="請輸入內(nèi)容" type="text" v-model="title" @keyup.enter="onEnter"> <hr> <ul> <!-- 條件渲染 --> <li v-if="todos.length===0">無任務(wù)</li> <li v-else v-for="item,index in todos" :key="item.id"> <span>{{item.title}}</span> <span @click="del(index)">刪除</span> </li> </ul> </div> <script> const vm = new Vue({ el: '#app', data: { todos: [], title: '' }, methods: { onEnter() { this.todos.push({ id: Date.now(), title: this.title }) this.title = '' }, del(index) { // 刪除 它可以使用 vue中提供的變異方法splice來完成,用此方法它會觸發(fā)視圖更新 this.todos.splice(index, 1) } } }) </script> </body> </html>
3.3 實(shí)現(xiàn)單個復(fù)選框
當(dāng)單個復(fù)選框被選中或者被取消選中時,我們?nèi)绾潍@取到該復(fù)選框是否被選中的信息?
我們可以通過綁定事件來獲?。?/p>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>vue學(xué)習(xí)使用</title> <!-- 第1步: 引入vue庫文件 --> <script src="./js/vue.js"></script> </head> <body> <!-- 第2步:掛載點(diǎn) --> <div id="app"> <div> <!-- click事件可以用,但它是的狀態(tài)會太過提前,用onchange事件,改變后來獲取 --> <input type="checkbox" @click="clickFn"> <input type="checkbox" @change="clickFn"> </div> </div> <!-- 第3步:實(shí)例化vue --> <script> const vm = new Vue({ el: '#app', data: { // 單個復(fù)選框一定要用布爾類型 checked: false }, methods: { clickFn(evt) { console.log(evt.target.checked); } } }) </script> </body> </html>
注意:在綁定事件時,click事件可以用,但它是的狀態(tài)會太過提前,所以用onchange事件,改變后再來獲取。
更簡單的方式是,通過 v-model 指令來獲?。?/p>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>vue學(xué)習(xí)使用</title> <!-- 第1步: 引入vue庫文件 --> <script src="./js/vue.js"></script> </head> <body> <!-- 第2步:掛載點(diǎn) --> <div id="app"> <div> <!-- 單個復(fù)選框,在數(shù)據(jù)源中定義的數(shù)據(jù)類型為布爾類型 true選中,false未選中 --> <input type="checkbox" v-model="checked"> </div> </div> <!-- 第3步:實(shí)例化vue --> <script> const vm = new Vue({ el: '#app', data: { // 單個復(fù)選框一定要用布爾類型 checked: false }, methods: { } }) </script> </body> </html>
注意:單個復(fù)選框,在數(shù)據(jù)源中定義的數(shù)據(jù)類型為布爾類型:true 選中,false未選中
3.4 實(shí)現(xiàn)多個復(fù)選框
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>vue學(xué)習(xí)使用</title> <!-- 第1步: 引入vue庫文件 --> <script src="./js/vue.js"></script> </head> <body> <!-- 第2步:掛載點(diǎn) --> <div id="app"> <div> <!-- --> <ul> <li> <input type="checkbox" value="html" v-model="lessons">html </li> <li> <input type="checkbox" value="css" v-model="lessons">css </li> <li> <input type="checkbox" value="js" v-model="lessons">js </li> </ul> <hr> <div>{{lessons}}</div> </div> </div> <!-- 第3步:實(shí)例化vue --> <script> const vm = new Vue({ el: '#app', data: { // 默認(rèn)選中 lessons: ["js",'css'] }, methods: { } }) </script> </body> </html>
注意:多個復(fù)選框,數(shù)據(jù)源中定義的數(shù)據(jù)類型為數(shù)組,標(biāo)簽中需要指定它的value值。
3.5 實(shí)現(xiàn)復(fù)選框全選
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>vue學(xué)習(xí)使用</title> <!-- 第1步: 引入vue庫文件 --> <script src="./js/vue.js"></script> </head> <body> <!-- 第2步:掛載點(diǎn) --> <div id="app"> <div> <input type="checkbox" v-model="checked" @change="onSelected"> <hr> <ul> <li> <input type="checkbox" value="html" @change="selectlesson" v-model="lessons">html </li> <li> <input type="checkbox" value="css" @change="selectlesson" v-model="lessons">css </li> <li> <input type="checkbox" value="js" @change="selectlesson" v-model="lessons">js </li> </ul> <hr> <div>{{lessons}}</div> </div> </div> <!-- 第3步:實(shí)例化vue --> <script> const vm = new Vue({ el: '#app', data: { lessons: [], checked: false }, methods: { onSelected(evt) { // 選中了 if (evt.target.checked) { this.lessons = ["js", 'html', 'css'] } else { this.lessons = [] } }, selectlesson() { // 只要來操作數(shù)據(jù)源就可以改變視圖 this.checked = this.lessons.length == 3 } } }) </script> </body> </html>
3.6 單選和下拉
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>vue學(xué)習(xí)使用</title> <!-- 第1步: 引入vue庫文件 --> <script src="./js/vue.js"></script> </head> <body> <!-- 第2步:掛載點(diǎn) --> <div id="app"> <div> <h3>{{sex}} -- {{city}}</h3> <!-- 定義的數(shù)據(jù)類型為字符串 --> <label> <input type="radio" value="先生" v-model="sex">建行 </label> <label> <input type="radio" value="女神" v-model="sex">招行 </label> </div> <hr> <div> <select v-model="city"> <option value="0">==選擇==</option> <option value="wh">蕪湖</option> <option value="bj">北京</option> </select> </div> </div> <!-- 第3步:實(shí)例化vue --> <script> const vm = new Vue({ el: '#app', data: { sex: '先生', city: '0' } }) </script> </body> </html>
注意:單選框和復(fù)選框都需要 input 標(biāo)簽提供 value 屬性。
4. v-model修飾符
4.1 lazy
作用:延時更新數(shù)據(jù)源中的數(shù)據(jù),失去焦點(diǎn)時觸發(fā)更新。
<div id="app"> <!-- v-model修飾符 --> <!-- 延時更新數(shù)據(jù)源中的數(shù)據(jù) 光標(biāo)移開才會改變數(shù)據(jù) --> <input v-model.lazy="title"> </div> <script> const vm = new Vue({ el: '#app', data: { title: '' } }) </script>
4.2 trim
作用:自動過濾用戶輸入的首尾空白字符。
<div id="app"> <!-- 去空格 trim --> <input v-model.trim="title"> </div> <script> const vm = new Vue({ el: '#app', data: { title: '' } }) </script>
4.3 number
作用:輸入值轉(zhuǎn)為數(shù)值類型。
<div id="app"> <!-- 轉(zhuǎn)為數(shù)值 number --> <input type="number" v-model.number="n1"> + <input type="number" v-model.number="n2"> = {{n1+n2}} </div> <script> const vm = new Vue({ el: '#app', data: { n1: 1, n2: 2 } }) </script>
5. 案例
5.1 購物車
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>vue學(xué)習(xí)使用</title> <!-- 第1步: 引入vue庫文件 --> <script src="./js/vue.js"></script> </head> <body> <!-- 第2步:掛載點(diǎn) --> <div id="app"> <table border="1" width="600"> <tr> <th>序號</th> <th>名稱</th> <th>單價</th> <th>數(shù)量</th> <th>操作</th> </tr> <tr v-for="item,index in carts"> <td>{{index+1}}</td> <td>{{item.name}}</td> <td>{{item.price}}</td> <td> <button @click="setNum(1,index)">+++</button> <input type="number" v-model="item.num"> <button @click="setNum(-1,index)">---</button> </td> <td> <button @click="del(index)">刪除</button> </td> </tr> </table> <hr> <h3> 合計(jì): {{totalPrice()}} </h3> </div> <!-- 第3步:實(shí)例化vue --> <script> const vm = new Vue({ el: '#app', data: { carts: [ { id: 1, name: '小米12pro', price: 1, num: 1 }, { id: 2, name: '華為手機(jī)', price: 2, num: 1 }, { id: 3, name: '水果手機(jī)', price: 3, num: 1 }, ] }, methods: { setNum(n, index) { this.carts[index].num += n if (this.carts[index].num <= 1) this.carts[index].num = 1 if (this.carts[index].num >= 3) this.carts[index].num = 3 // 用最大值和最小值來限制它的范圍,可以了解一下這種寫法 // this.carts[index].num = Math.min(3, Math.max(1, this.carts[index].num)) }, totalPrice() { // 聚合運(yùn)算 return this.carts.reduce((prev, { price, num }) => { prev += price * num return prev }, 0) }, del(index) { // 彈出確認(rèn)框 confirm('確定刪除') && this.carts.splice(index, 1) } } }) </script> </body> </html>
5.2 購物車持久化
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>vue學(xué)習(xí)使用</title> <!-- 第1步: 引入vue庫文件 --> <script src="./js/vue.js"></script> </head> <body> <!-- 第2步:掛載點(diǎn) --> <div id="app"> <table border="1" width="600"> <tr> <th>序號</th> <th>名稱</th> <th>單價</th> <th>數(shù)量</th> <th>操作</th> </tr> <tr v-for="item,index in carts"> <td>{{index+1}}</td> <td>{{item.name}}</td> <td>{{item.price}}</td> <td> <button @click="setNum(1,index)">+++</button> <input type="number" v-model="item.num"> <!-- <button @click="setNum(-1,item)">---</button> --> <button @click="setNum(-1,index)">---</button> </td> <td> <button @click="del(index)">刪除</button> </td> </tr> </table> <hr> <h3> 合計(jì): {{totalPrice()}} </h3> </div> <!-- 第3步:實(shí)例化vue --> <script> // 初始數(shù)據(jù)應(yīng)該從本地存儲中讀取 function getCarts() { return !window.localStorage.getItem('carts') ? [{ id: 1, name: '小米12pro', price: 1, num: 1 }, { id: 2, name: '華為手機(jī)', price: 2, num: 1 }, { id: 3, name: '水果手機(jī)', price: 3, num: 1 }] : JSON.parse(window.localStorage.getItem('carts')) } function setCarts(carts) { window.localStorage.setItem('carts', JSON.stringify(carts)) } const vm = new Vue({ el: '#app', data: { carts: getCarts() }, methods: { setNum(n, index) { this.carts[index].num += n if (this.carts[index].num <= 1) this.carts[index].num = 1 if (this.carts[index].num >= 3) this.carts[index].num = 3 // 用最大值和最小值來限制它的范圍,可以了解一下 // this.carts[index].num = Math.min(3, Math.max(1, this.carts[index].num)) setCarts(this.carts) }, totalPrice() { return this.carts.reduce((prev, { price, num }) => { prev += price * num return prev }, 0) }, del(index) { if(confirm('確定刪除')){ this.carts.splice(index, 1) setCarts(this.carts) } } } }) </script> </body> </html>
到此這篇關(guān)于Vue v-model實(shí)現(xiàn)案例介紹的文章就介紹到這了,更多相關(guān)Vue v-model內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
v-for循環(huán)中使用require/import關(guān)鍵字引入本地圖片的幾種方式
在做項(xiàng)目的過程中,模版相同,可是不標(biāo)題和圖片不同,循環(huán)標(biāo)題我們知道可以用v-for循環(huán),可是該怎么引入本地圖片呢?下面這篇文章主要給大家介紹了v-for循環(huán)中使用require/import關(guān)鍵字引入本地圖片的幾種方式,需要的朋友可以參考下2021-09-09Vue實(shí)現(xiàn)點(diǎn)擊按鈕下載文件的操作代碼(后端Java)
最近項(xiàng)目中需要實(shí)現(xiàn)點(diǎn)擊按鈕下載文件的需求,前端用的vue后端使用的java代碼,今天通過本文給大家分享vue點(diǎn)擊按鈕下載文件的實(shí)現(xiàn)代碼,需要的朋友參考下吧2021-08-08詳解vue-Resource(與后端數(shù)據(jù)交互)
本篇文章主要介紹了vue-Resource(與后端數(shù)據(jù)交互),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01vue.js中父組件調(diào)用子組件的內(nèi)部方法示例
這篇文章主要給大家介紹了關(guān)于vue.js中父組件調(diào)用子組件內(nèi)部方法的相關(guān)資料,文中給出來了詳細(xì)的示例代碼供大家參考學(xué)習(xí),對大家的學(xué)習(xí)或者工作具有一定的參考價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10vue中響應(yīng)式布局如何將字體大小改成自適應(yīng)
這篇文章主要介紹了vue中響應(yīng)式布局如何將字體大小改成自適應(yīng),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09教你如何開發(fā)Vite3插件構(gòu)建Electron開發(fā)環(huán)境
這篇文章主要介紹了如何開發(fā)Vite3插件構(gòu)建Electron開發(fā)環(huán)境,文中給大家提到了如何讓 Vite 加載 Electron 的內(nèi)置模塊和 Node.js 的內(nèi)置模塊,需要的朋友可以參考下2022-11-11vue實(shí)現(xiàn)大文件分片上傳與斷點(diǎn)續(xù)傳到七牛云
這篇文章介紹了vue實(shí)現(xiàn)大文件分片上傳與斷點(diǎn)續(xù)傳到七牛云的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06antd vue 刷新保留當(dāng)前頁面路由,保留選中菜單,保留menu選中操作
這篇文章主要介紹了antd vue 刷新保留當(dāng)前頁面路由,保留選中菜單,保留menu選中操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08