02 . Vue入門基礎之條件渲染,列表渲染,事件處理器,表單控件綁定
小編:管理員 73閱讀 2022.08.18
將數據填充到HTML標簽中

/* 作用:會將綁定的數據實時的顯示出來: 通過任何方式修改所綁定的數據,所顯示的數據都會被實時替換 {{js表達式、三目運算符、方法調用等}} 不能寫 var a = 10; 分支語句 循環語句 */復制
Example1
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Examples</title> <meta name="description" content=""> <meta name="keywords" content=""> <link href="" rel="stylesheet"> <script type="text/javascript" src="lib/vue.js"></script> </head> <body> <div id="app"> <!-- 插值表達式 --> {{ count }} <!-- 三目運算符 --> <p>{{ age > 18 ?'成年' :'未成年' }}</p> </div> <script> var vm = new Vue({ el: '#app', data: { count: 100, age: 15 }, methods: { } }) </script> </body> </html>復制指令
指令 (Directives) 是帶有v-前綴的特殊特性。 指令特性的值預期是單個 JavaScript 表達式(v-for是例外情況,稍后我們再討論)。 指令的職責是,當表達式的值改變時,將其產生的連帶影響,響應式地作用于 DOM。 指令的本質就是自定義屬性
/* 1. Vue框架提供的語法 2. 擴展了HTML的能力 3. 減少DOM操作 */復制
Example1
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Examples</title> <meta name="description" content=""> <meta name="keywords" content=""> <link href="" rel="stylesheet"> <script type="text/javascript" src="lib/vue.js"></script> </head> <body> <!-- 指令 作用: 增強了html標簽功能 所有指令都是v-開頭 所有指令代碼位置,標簽的開始標簽位置 所有指令都是取代之前的DOM操作 --> <div id="app"> <!-- 插值表達式 --> {{ count }} <button v-on:click="fn1()">點我</button> <!-- 三目運算符 --> <p>{{ age > 18 ?'成年' :'未成年' }}</p> </div> <script> var vm = new Vue({ el: '#app', data: { count: 100, age: 15 }, methods: { fn1(){ console.log(this.count) } } }) </script> </body> </html>復制v-clock
/* 1. 插值表達式存在的問題: "閃動" 2. 如何解決該問題: 使用v-cloak指令 3. 解決該問題的原理: 先隱藏,替換好值之后再顯示最終的值 */復制
Example
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Examples</title> <meta name="description" content=""> <meta name="keywords" content=""> <link href="" rel="stylesheet"> <script type="text/javascript" src="lib/vue.js"></script> </head> <body> <div id="app"> <div v-cloak>{{ msg }}</div> </div> <script> /* v-clock指令用法 1. 提供樣式 [v-cloak]{ display: none; } 2. 在插值表達式所在的標簽中添加v-cloak指令 背后的原理: 先通過樣式隱藏內容,然后在內存中進行值的替換,替換好之后再顯示最終的結果. */ var vm = new Vue({ el: '#app', data: { msg: 'hello vue12' } }); </script> </body> </html>復制數據綁定指令V-text,v-html,v-pre
很像innerText和innerHTML
/* v-text 填充純文本 相比插值表達式更加簡潔 v-html 填充HTML片段 1. 存在安全問題 2. 本網站內部數據可以使用,來自第三方網站數據不可以用 v-pre 填充原始信息 1. 顯示原始信息,跳過編譯過程 */復制
x-html
更新元素的innerHTML。注意:內容按普通 HTML 插入 - 不會作為 Vue 模板進行編譯。如果試圖使用v-html組合模板,可以重新考慮是否通過使用組件來替代。 在網站上動態渲染任意 HTML 是非常危險的,因為容易導致 XSS 攻擊。只在可信內容上使用v-html,永不用在用戶提交的內容上。 在單文件組件里,scoped的樣式不會應用在v-html內部,因為那部分 HTML 沒有被 Vue 的模板編譯器處理。如果你希望針對v-html的內容設置帶作用域的 CSS,你可以替換為 CSS Modules 或用一個額外的全局<style>元素手動設置類似 BEM 的作用域策略。
Example
復制自定義指令內置指令不滿足要求
Vue.directive('focus' { inserted: function(el) { // 獲取元素的焦點 el.focus(); } })復制
Example
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div id="app"> <input type="text" v-focus /> </div> <script type="text/javascript" src="js/vue.js"></script> <script type="text/javascript"> /* 自定義指令 */ Vue.directive('focus',{ inserted: function(el){ // el表示指令所綁定的元素 el.focus() } }) var vm = new Vue({ el: '#app', data: { }, methods: { } }) </script> </body> </html>復制
帶參數的自定義指令
改變元素背景色
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div id="app"> <input type="text" v-color='msg'> </div> <script type="text/javascript" src="js/vue.js"></script> <script type="text/javascript"> /* 自定義指令 - 帶參數 */ Vue.directive('color', { bind: function(el, binding) { // 根據指令的參數設置背景色 // console.log(binding.value.color) el.style.backgroundColor = binding.value.color } }) var vm = new Vue({ el: '#app', data: { msg: { color: 'blue' } }, methods: { handle: function() { } } }) </script> </body> </html>復制
局部指令
如果想注冊局部指令,組件中接受一個directives的選項,位于vue實例參數里面,局部指令只能在本組件使用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div id="app"> <input type="text" v-color='msg'> <input type="text" v-focus /> </div> <script type="text/javascript" src="js/vue.js"></script> <script type="text/javascript"> /* 自定義指令 - 帶參數 */ Vue.directive('color', { bind: function(el, binding) { // 根據指令的參數設置背景色 // console.log(binding.value.color) el.style.backgroundColor = binding.value.color } }) var vm = new Vue({ el: '#app', data: { msg: { color: 'blue' } }, methods: { handle: function() { } }, directives: { color: { bind: function(el,binding){ el.style.backgroundColor = binding.value.color } }, focus: { inserted: function(el){ el.focus() } } } }) </script> </body> </html>復制聲明式渲染
Vue.js 的核心是一個允許采用簡潔的模板語法來聲明式地將數據渲染進 DOM 的系統
Example1
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Examples</title> <meta name="description" content=""> <meta name="keywords" content=""> <link href="" rel="stylesheet"> <script type="text/javascript" src="lib/vue.js"></script> </head> <body> <div id="box"> {{ 10+203 }} <p>{{ myname }}</p> </div> <div> {{ 10+20 }} </div> <script> var vm = new Vue({ el:"#box", // vue 渲染開始的地方 data:{ myname:"kerwin" } // 狀態 }) </script> </body> </html>復制
我們已經成功創建了第一個 Vue 應用!看起來這跟渲染一個字符串模板非常類似,但是 Vue 在背后做了大量工作?,F在數據和 DOM 已經被建立了關聯,所有東西都是響應式的。我們要怎么確認呢?打開你的瀏覽器的 JavaScript 控制臺 (就在這個頁面打開),并修改app.message的值,你將看到上例相應地更新。 注意我們不再和 HTML 直接交互了。一個 Vue 應用會將其掛載到一個 DOM 元素上 (對于這個例子是#app) 然后對其進行完全控制。那個 HTML 是我們的入口,但其余都會發生在新創建的 Vue 實例內部。
除了文本插值,我們還可以像這樣來綁定元素 attribute:
<div id="app-2"> <span v-bind:title="message"> 鼠標懸停幾秒鐘查看此處動態綁定的提示信息! </span> </div> var app2 = new Vue({ el: '#app-2', data: { message: '頁面加載于 ' + new Date().toLocaleString() } })復制
這里我們遇到了一點新東西。你看到的v-bindattribute 被稱為指令。指令帶有前綴v-,以表示它們是 Vue 提供的特殊 attribute??赡苣阋呀洸碌搅?,它們會在渲染的 DOM 上應用特殊的響應式行為。在這里,該指令的意思是:“將這個元素節點的titleattribute 和 Vue 實例的messageproperty 保持一致”。 如果你再次打開瀏覽器的 JavaScript 控制臺,輸入app2.message = '新消息',就會再一次看到這個綁定了titleattribute 的 HTML 已經進行了更新。

/* 如何理解響應式 1.html5中的響應式(屏幕尺寸的變化導致樣式的變化) 2.數據的響應式(數據的變化導致頁面內容的變化) 什么是數據綁定 1.數據綁定: 將數據填充到標簽中 v-once 只編譯一次 顯示之后不再具有響應式功能 應用場景: 如果顯示的信息后續不需要再修改,可以使用v-once,這樣可以提高性能 */復制條件與循環
Example1
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div id="app"> <div v-if="score>=90">優秀</div> <div v-else-if="score<90&&score>=80">良好</div> <div v-else-if="score<80&&score>60">一般</div> <div v-else>差</div> <div v-show="flag">測試v-show</div> <button v-on:click="handle">按鈕</button> </div> <script type="text/javascript" src="js/vue.js"></script> <script type="text/javascript"> /* 分支結構 v-show的原理: 控制元素樣式是否顯示 display: none */ var vm = new Vue({ el: '#app', data: { score: 9, flag: false }, methods: { handle: function() { this.flag = !this.flag } } }) </script> </body> </html>復制
Example2
<div id="app-3"> <p v-if="seen">現在你看到我了</p> </div> var app3 = new Vue({ el: '#app-3', data: { seen: true } })復制
繼續在控制臺輸入app3.seen = false,你會發現之前顯示的消息消失了。 這個例子演示了我們不僅可以把數據綁定到 DOM 文本或 attribute,還可以綁定到 DOM 結構。此外,Vue 也提供一個強大的過渡效果系統,可以在 Vue 插入/更新/移除元素時自動應用過渡效果。 還有其它很多指令,每個都有特殊的功能。例如,v-for指令可以綁定數組的數據來渲染一個項目列表:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Examples</title> <meta name="description" content=""> <meta name="keywords" content=""> <link href="" rel="stylesheet"> <script type="text/javascript" src="lib/vue.js"></script> </head> <body> <div id=app-4> <ol> <li v-for="todo in todos"> {{ todo.text }} </li> </ol> </div> <script> var app4 = new Vue({ el: '#app-4', data: { todos: [{ text: '學習js' }, { text: '學習vue' }, { text: '整個厲害項目' } ] } }) </script> </body> </html>復制

/* v-for 遍歷數組 <li v-for='item in list'>{{ item }}</li> <li v-for='{item,index} in list'>{{ item }}+ '---' + {{ index }}</li> v-for 遍歷對象 <div v-for='(value,key,index) in '> key的作用: 幫助vue區分不同的元素,從而提高性能 <li :key='item.id' v-for='{ item,index } in list'>{{item}}+'----'{{index}}</li> */復制
Example1
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div id="app"> <div>水果列表</div> <ul> <li v-for='item in fruits'>{{ item }}</li> <li v-for='(item,index) in fruits'>{{ item + '---'+index }}</li> <li :key='item.id' v-for="(item,index) in myFruits"> <span>{{ item.ename }}</span> --- <span>{{ item.cname }}</span> </li> </ul> </div> <script type="text/javascript" src="js/vue.js"></script> <script type="text/javascript"> var vm = new Vue({ el: '#app', data: { fruits: ['apple', 'oragen', 'banana'], myFruits: [{ id: 1, ename: 'apple', cname: '蘋果' }, { id: 2, ename: 'orange', cname: '橘子' }, { id: 3, ename: 'banner', cname: '香蕉' }], }, methods: { } }) </script> </body> </html>復制
v-if和v-for結合使用
<div v-if> </div>復制
Example2
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div id="app"> <div v-if='v==13' v-for='(v,k,i) in obj'>{{v + '---' + k + '---' + i}}</div> </div> <script type="text/javascript" src="js/vue.js"></script> <script type="text/javascript"> // 使用原生js遍歷對象 var obj = { uname: 'lisi', age: 12, gender: 'male' } for (var key in obj) { console.log(key, obj[key]) } /* 循環結構 */ var vm = new Vue({ el: '#app', data: { obj: { uname: 'zhangsan', age: 13, gender: 'female' } } }); </script> </body> </html>復制處理用戶輸入
為了讓用戶和你的應用進行交互,我們可以用v-on指令添加一個事件監聽器,通過它調用在 Vue 實例中定義的方法:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Examples</title> <meta name="description" content=""> <meta name="keywords" content=""> <link href="" rel="stylesheet"> <script type="text/javascript" src="lib/vue.js"></script> </head> <body> <div id="app-5"> <p>{{ message}}</p> <button v-on:click="reverseMessage">反轉消息</button> </div> <script> var app5 = new Vue({ el: '#app-5', data: { message: 'Hello Vue.js!' }, methods: { reverseMessage: function() { this.message = this.message.split('').reverse().join('') } } }) </script> </body> </html>復制雙向數據綁定
/* 什么是雙向數據綁定? 1.當數據發生變化的時候,視圖也就發生變化 2.當視圖發生變化的是后,數據也會跟著同步變化 雙向綁定的使用場景? v-model實現的雙向綁定 v-model是一個指令,限制在<input>,<select>,<textarea>,components(組件中使用) */復制

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div id="app"> <div>{{ msg }}</div> <input type="text" v-bind:value="msg" v-on:input="handle" /> <input type="text" v-bind:value="msg" v-on:input="msg=$event.target.value" /> <!-- 通過v-bind綁定value值,v-on綁定input事件,監聽輸入域有變化就將變化的值傳給msg -> <input type="text" v-model="msg" /> </div> <script type="text/javascript" src="js/vue.js"></script> <script type="text/javascript"> /* v-model的本質 */ var vm = new Vue({ el: '#app', data: { msg: 'hello' }, methods: { // 使用輸入域中的最新的數據覆蓋原來的數據 handle: function(event) { this.msg = event.target.value } } }) </script> </body> </html>復制模板語法vue插值(v-if和v-show)
/* 文本{{}} 純HTML v-html, 防止XSS,csrf ( (1)前端過濾 (2)后臺轉義(<> < >) (3)給cookie加上屬性http ) 指令 v-html v-show v-if與v-show區別 v-if控制元素是否渲染到頁面 v-show控制元素是否顯示(已經渲染到了頁面) */復制
Example1
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Examples</title> <meta name="description" content=""> <meta name="keywords" content=""> <link href="" rel="stylesheet"> <script type="text/javascript" src="lib/vue.js"></script> </head> <body> <div id="box"> {{ 10+20 }} {{ 10>20? 'aaa':'bbb' }} {{ myname}} <!-- 指令 --> {{ myhtml }} <div v-html="myhtml"></div> </div> <script type="text/javascript"> // console 中可以 vm.isShow=false隱藏 new Vue({ el: "#box", data: { myname: "youmen", myhtml: "<b>11111</b>" } }) </script> </body> </html>復制vue如何動態處理屬性
/* v-bind指令用法 <a v-bind:href='url'>跳轉</a> 縮寫形式 <a :href='url'>跳轉</a> */復制
Example1
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div id="app"> <a :href="url">百度</a> <button v-on:click="handle">切換</button> </div> <script type="text/javascript" src="js/vue.js"></script> <script type="text/javascript"> var vm = new Vue({ el: '#app', data: { url: 'http://www.baidu.com' }, methods: { handle: function() { // 修改url地址 this.url = 'http://www.zcj.net.cn' } } }) </script> </body> </html>復制條件渲染Vue-class綁定
/* 對象語法 <div v-bind:class="{ active: isActive }"></div> 數組語法 <div v-bind:class="[activeClass,errorClass]"></div> */復制
Example1
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style type="text/css"> .active { border: 1px solid red; width: 100px; height: 100px; } .error { background-color: orange; } </style> </head> <body> <div id="app"> <div v-bind:class="{active: isActive,error: isError}">123</div> <button v-on:click="handle">切換</button> </div> <script type="text/javascript" src="js/vue.js"></script> <script type="text/javascript"> var vm = new Vue({ el: '#app', data: { isActive: true, isError: true }, methods: { handle: function() { // 控制isActive的值在true和false進行切換 this.isActive = !this.isActive; this.isError = !this.isError; } } }) </script> </body> </html>復制
Example2
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style type="text/css"> .active { border: 1px solid red; width: 100px; height: 100px; } .error { background-color: orange; } </style> </head> <body> <div id="app"> <div v-bind:class="[activeClass,errorClass]">測試樣式</div> <button v-on:click="handle">切換</button> </div> <script type="text/javascript" src="js/vue.js"></script> <script type="text/javascript"> var vm = new Vue({ el: '#app', data: { activeClass: 'active', errorClass: 'error' }, methods: { handle: function() { this.activeClass = ''; this.errorClass = ''; } } }) </script> </body> </html>復制Vue-style綁定
Example2
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Examples</title> <meta name="description" content=""> <meta name="keywords" content=""> <link href="" rel="stylesheet"> <script type="text/javascript" src="lib/vue.js"></script> <style> .red { background-color: red; } .yellow{ background-color: yellow; } .aaa{ } .bbb{ } </style> </head> <body> <div id="box"> <button @click="handleClick()">click</button> <div :class="isActive?'red':'yellow'">我是動態綁定class-三目寫法</div> <div :class="classobj">我是動態綁定class-對象寫法</div> <div :class="classarr">我是動態綁定class-數組寫法</div> <div :style="'background:'+(isActive?'red':'yellow')">我是動態綁定style-三目寫法</div> <div :style="styleobj">我是動態綁定style-對象寫法</div> <div :style="stylearr">我是動態綁定style-數組寫法</div> </div> <script type="text/javascript"> var vm = new Vue({ el: "#box", data: { isActive: true, classobj: { a: true, b: true // a b, class名字 }, classarr: ["a", "b"], styleobj: { backgroundColor: "red" }, stylearr: [] }, methods: { handleClick() { this.isActive = !this.isActive } } }) </script> </body> </html>復制樣式綁定相關語法細節
/* 1. 對象綁定和數組綁定可以結合使用 2. class綁定的值可以簡化操作 3. 默認的class如何處理? 默認的class可以保留 */復制
Example1
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style type="text/css"> .active { border: 1px solid red; width: 100px; height: 100px; } .error { background-color: orange; } .base { font-size: 28px; } </style> </head> <body> <div id="app"> <div v-bind:class="[activeClass,errorClass,{test: isTest}]">測試樣式</div> <div v-bind:class="arrClasses"></div> <div v-bind:class="objClasses"></div> <div class="base" v-bind:class="objClasses"></div> <button v-on:click="handle">切換</button> </div> <script type="text/javascript" src="js/vue.js"></script> <script type="text/javascript"> var vm = new Vue({ el: '#app', data: { activeClass: 'active', errorClass: 'error', isTest: true, arrClasses: ['active','error'], objClasses: { active: true, error: true } }, methods: { handle: function() { // this.isTest = false this.objClasses.error = false } } }) </script> </body> </html>復制條件渲染
Example1
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Examples</title> <meta name="description" content=""> <meta name="keywords" content=""> <link href="" rel="stylesheet"> <script type="text/javascript" src="lib/vue.js"></script> </head> <body> <div id="box"> <button @click="handleClick()">click</button> <div v-if="isCreated">動態創建和刪除-1</div> <div v-else>動態創建和刪除-2</div> <ul v-if="datalist.length"> <li v-for="data in datalist"> {{ data }} </li> </ul> <div v-else> 購物車空空如也 </div> <div v-if="which==1"> 111 </div> <div v-else-if="which==2"> 2222 </div> <div v-else> 3333 </div> </div> <script type="text/javascript"> var vm = new Vue({ el:"#box", data:{ isCreated:false, datalist:[], which:1, }, methods: { handleClick(){ this.isCreated = !this.isCreated this.datalist = ["111","222","333"] } } }) </script> </body> </html>復制列表渲染
我們可以用v-for指令基于一個數組來渲染一個列表。v-for指令需要使用item in items形式的特殊語法,其中items是源數據數組,而item則是被迭代的數組元素的別名。v-for還支持一個可選的第二個參數,即當前項的索引。 也可以用of代替in作為分隔符,因為她更接近javascript迭代器的語法
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Examples</title> <meta name="description" content=""> <meta name="keywords" content=""> <link href="" rel="stylesheet"> <script type="text/javascript" src="lib/vue.js"></script> <style> .active{ background-color: red; } </style> </head> <body> <div id="box"> <ul> <li v-for="(data,index) in datalist"> {{ data }}--{{ index }} </li> </ul> <ul> <li v-for="(data,key) of obj"> {{ data }}--{{key}} </li> </ul> </div> <script type="text/javascript"> var vm = new Vue({ el: "#box", data:{ datalist:["111","222","333"], obj:{ name:"youmen", age:100, location:"youmen" } } }) </script> </body> </html>復制列表key值設置和列表數組檢測
/* 1. v-for(特殊v-for="n in 10") a.in b.of 2. key *跟蹤每個節點的身份,從而復用和重新排序現有元素 *理想的key值是每項都有且唯一的id,data.id 3. 數組更新檢測 a. 使用以下方法操作數組,可以檢測變動 push() pop() shift() unshift() splice() sort() reverse() b. filter(),concat()和slice(),map(),新數組替換舊數組,并不會導致原數組受到影響并更新 vm.datalist.concat(["666","777"]) c. 不能檢測以下變動的數組 vm.items[indexOfitem] = newValue "解決" 1. Vue.set(example1.items,index()fltem,newValue) 2. splice vm.datalist.splice(0,1,"youmen") */復制vue列表過濾應用
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Examples</title> <meta name="description" content=""> <meta name="keywords" content=""> <link href="" rel="stylesheet"> <script type="text/javascript" src="lib/vue.js"></script> </head> <body> <div id="box"> <input type="text" @input="handleInput()" v-model="mytext" /> <ul> <li v-for="data in datalist"> {{ data }} </li> </ul> </div> <script type="text/javascript"> var vm = new Vue({ el: "#box", data: { mytext: "", datalist: ["aaa", "bbb", "ccc", "ddd", "eee", ], list: ["aaa", "bbb", "ccc", "ddd", "eee", ] }, methods: { handleInput() { // console.log(this.mytext) // console.log("只要value改變,就會觸發") // 利用輸入框的字符,過濾包含字符的元素 // filter 過濾 var newlist = this.list.filter(item => item.indexOf(this.mytext) > -1) this.datalist = newlist; // 計算屬性 } } }) var arr = [1, 2, 3, 4, 5] var newlist = arr.filter(item => item >= 3) console.log(newlist) console.log(newlist) </script> </body> </html>復制事件處理vue如何處理事件
/* v-on指令用法 <input> type= 'button' v-on:click='num++'/> v-on簡寫形式 <input type='button'@click='num++'/> */復制事件傳參
Example1
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div id="app"> <div>{{ num }}</div> <button v-on:click='num++'>點擊1</button> <button @click='num++'>點擊2</button> <!-- 參數傳遞 1. 如果事件直接綁定函數名稱,那么默認會傳遞對象作為事件函數第一個參數 2. 如果事件綁定函數調用,那么事件對象必須作為最后一個參數 --> <button @click='handle(1,2,$event)'>點擊2</button> </div> <script type="text/javascript" src="js/vue.js"></script> <script type="text/javascript"> /* 事件綁定 */ var vm = new Vue({ el: '#app', data: { num: 0 }, methods: { handle: function(p1, p2, event) { console.log(p1, p2, event.target.innerHTML) this.num++; } } }) </script> </body> </html>復制事件處理器
可以用v-on指令監聽 DOM 事件,并在觸發時運行一些 JavaScript 代碼
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Examples</title> <meta name="description" content=""> <meta name="keywords" content=""> <link href="" rel="stylesheet"> <script type="text/javascript" src="lib/vue.js"></script> </head> <body> <div id="box"> <button @click="handleClick">click1</button> <button @click="handleClick()">click2</button> <button @click="isShow=!isShow">click3</button> <div v-show="isShow">111</div> </div> <script type="text/javascript"> new Vue({ el: "#box", data:{ isShow:false }, methods:{ handleClick(){ this.isShow=!this.isShow } } }) </script> </body> </html>復制事件修飾符
/* 1. 監聽事件-直接出發代碼 2. 方法事件處理器-寫函數名 handleClick 3. 內聯處理器方法-執行函數表達式 handleClick($event) $event 事件對象 .stop 阻止冒泡 <a v-on:click.stop="handle">跳轉</a> .prevent阻止默認行為 <a v-on:click.prevent="handle>跳轉</a> */復制
修飾符
/* .stop - 調用 event.stopPropagation()。 .prevent - 調用 event.preventDefault()。 .capture - 添加事件偵聽器時使用 capture 模式。 .self - 只當事件是從偵聽器綁定的元素本身觸發時才觸發回調。 .{keyCode | keyAlias} - 只當事件是從特定鍵觸發時才觸發回調。 .native - 監聽組件根元素的原生事件。 .once - 只觸發一次回調。 .left - (2.2.0) 只當點擊鼠標左鍵時觸發。 .right - (2.2.0) 只當點擊鼠標右鍵時觸發。 .middle - (2.2.0) 只當點擊鼠標中鍵時觸發。 .passive - (2.3.0) 以 { passive: true } 模式添加偵聽器 */復制
Example1
阻止冒泡,默認行為
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Examples</title> <meta name="description" content=""> <meta name="keywords" content=""> <link href="" rel="stylesheet"> <script type="text/javascript" src="lib/vue.js"></script> </head> <body> <div id="box"> <button @click="handleClick">click1</button> <button @click="handleClick($event)">click2</button> <button @click="isShow=!isShow">click3</button> <div v-show="isShow">111</div> <ul @click.self="handleClick()"> <li @click.stop="handleClick($event)">111</li> <li @click.stop="handleClick()">222</li> <li @click.once="handleClick()">333</li> </ul> <a @click.prevent="handleChangePage()">changepage</a> </div> <script type="text/javascript"> new Vue({ el: "#box", data: { isShow: false }, methods: { handleClick(ev) { console.log(ev.target); // ev就是事件對象 this.isShow = !this.isShow }, handleClick(ev) { // ev.stopPropagation(); console.log("li click") }, handleClick() { console.log("ul click") }, handleChangePage() { console.log("handleChangePage") } } }) </script> </body> </html>復制
Example2
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div id="app"> <div>{{ num }}</div> <div v-on:click="handle0"> <button @click.stop="handle1">點擊1</button> </div> <div> <a @click.prevent="handle2">百度</a> </div> </div> <script type="text/javascript" src="js/vue.js"></script> <script type="text/javascript"> var vm = new Vue({ el: '#app', data: { num: 0 }, methods: { handle0: function() { this.num++; }, handle1: function(event) { // 阻止冒泡 // event.stopPropagation() this.num++; }, handle2: function(event) { // 阻止默認行為 // event.preventDefault(); } } }) </script> </body> </html>復制按鍵修飾符
/* .enter回車鍵 <input v-on:keyup.enter='submit'> .delete刪除鍵 <input v-on:keyup.delete='handle'> */復制
Example1
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Examples</title> <meta name="description" content=""> <meta name="keywords" content=""> <link href="" rel="stylesheet"> <script type="text/javascript" src="lib/vue.js"></script> </head> <body> <div id="box"> <input type="text" @keyup.enter="handleKeyup($event)" /> </div> <script type="text/javascript"> new Vue({ el: "#box", methods: { handleKeyup(ev) { console.log("執行todolist 添加成功") // if(ev.keyCode==13){ // console.log("執行todolist添加成功") // 可以自定義按鍵修飾符,找到每個按鍵對應的數字即可 // } } } }) </script> </body> </html>復制
Example2
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div id="app"> <form action=""> <div> 用戶名: <input type="text" v-on:keyup.delete='clearContent' v-model="uname" /> </div> <div> 密碼: <input type="text" v-model="pwd" /> </div> <div> <input type="button" v-on:click="handleSubmit" value="提交" /> </div> </form> </div> <script type="text/javascript" src="js/vue.js"></script> <script type="text/javascript"> var vm = new Vue({ el: '#app', data: { uname: '', pwd: '' }, methods: { handleSubmit: function() { console.log(this.uname, this.pwd) }, clearContent: function() { this.uname = '' } } }) </script> </body> </html>復制案例
計算器
/* 1. 通過v-model指令實現數值a和數值b的綁定 2. 給計算按鈕綁定事件,實現計算邏輯 3. 將計算結果綁定到對應位置 */復制
Example1
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div id="app"> <h1>計算器</h1> <div> <span>數值A:</span> <span> <input type="text" v-model="a" /> </span> </div> <div> <span>數值B:</span> <span> <input type="text" v-model="b" /> </span> </div> <div> <button v-on:click="handle">計算</button> </div> <div> <span>計算結果</span> <span>{{ result }}</span> </div> </div> <script type="text/javascript" src="js/vue.js"></script> <script type="text/javascript"> var vm = new Vue({ el: '#app', data: { a: '', b: '', result: '' }, methods: { handle: function() { // 實現計算邏輯 this.result = parseInt(this.a) + parseInt(this.b) } } }) </script> </body> </html>復制
Tab選項卡
/* 1. 實現靜態UI效果 用傳統方式實現標簽結構和樣式 2. 基于數據重構UI效果 將靜態的結構和樣式重構為基于Vue模板語法的樣式 處理事件綁定和js控制邏輯 */復制

Example
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style type="text/css"> .tab ul { overflow: hidden; padding: 0; margin: 0; } .tab ul li { box-sizing: border-box; padding: 0; float: left; width: 100px; height: 45px; line-height: 45px; list-style: none; text-align: center; border-top: 1px solid blue; border-right: 1px solid blue; cursor: pointer; } .tab ul li:first-child { border-left: 1px solid blue; } .tab ul li.active { background-color: orange; } .tab div { width: 500px; height: 300px; display: none; text-align: center; font-size: 30px; line-height: 300px; border: 1px solid blue; border-top: 0px; } .tab div.current { display: block; } </style> </head> <body> <div id="app"> <div class="tab"> <ul> <li v-on:click="change(index)" :class='currentIndex==index?"active":""' :key='item.id' v-for="(item,index) in list">{{ item.title }}</li> </ul> <div :class='currentIndex==index?"current":""' :key='item.id' v-for="(item,index) in list"> <img :src="item.path" /> </div> </div> </div> <script type="text/javascript" src="js/vue.js"></script> <script type="text/javascript"> var vm = new Vue({ el: '#app', data: { currentIndex: 0, // 選項卡當前的索引 list: [{ id: 1, title: 'apple', path: 'img/apple.png' }, { id: 2, title: 'orange', path: 'img/orange.png' }, { id: 3, title: 'lemon', path: 'img/lemon.png' }, ] }, methods: { change: function(index) { // 在這里實現選項卡切換操作,本質就是操作類名 // 如何操作類名: 通過currentIndex this.currentIndex = index; } } }) </script> </body> </html>復制表單控件綁定

表單操作

/* 基于vue的表單操作 1. input 單行文本 2. textarea 多行文本 3. select 下拉多選 4. radio 單選框 5. checkbox 多選框 */復制基礎用法-文本
你可以用v-model指令在表單<input>、<textarea>及<select>元素上創建雙向數據綁定。它會根據控件類型自動選取正確的方法來更新元素。盡管有些神奇,但v-model本質上不過是語法糖。它負責監聽用戶的輸入事件以更新數據,并對一些極端場景進行一些特殊處理。v-model會忽略所有表單元素的value、checked、selectedattribute 的初始值而總是將 Vue 實例的數據作為數據來源。你應該通過 JavaScript 在組件的data選項中聲明初始值。v-model在內部為不同的輸入元素使用不同的 property 并拋出不同的事件:
/* text 和 textarea 元素使用 value property 和 input 事件; checkbox 和 radio 使用 checked property 和 change 事件; select 字段將 value 作為 prop 并將 change 作為事件。 */復制
對于需要使用輸入法 (如中文、日文、韓文等) 的語言,你會發現v-model不會在輸入法組合文字過程中得到更新。如果你也想處理這個過程,請使用input事件。
文本 Example1
<input v-model="message" placeholder="edit me"> <p>Message is: {{ message }}</p>復制
多行文本
<span>Multiline message is:</span> <p style="white-space: pre-line;">{{ message }}</p> <br> <textarea v-model="message" placeholder="add multiple lines"></textarea>復制
在文本區域插值 ({{text}}) 并不會生效,應用v-model來代替。
基礎用法-復選框單個復選框,綁定到布爾值:
<input type="checkbox" id="checkbox" v-model="checked"> <label for="checkbox">{{ checked }}</label>復制案例
Example1
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Examples</title> <meta name="description" content=""> <meta name="keywords" content=""> <link href="" rel="stylesheet"> <script type="text/javascript" src="lib/vue.js"></script> </head> <body> <div id="box"> <input type="text" v-model="mytext" /> {{mytext}} <textarea v-model="mytext"></textarea> <input type="checkbox" v-model="isChecked" />記錄用戶名 <p>你喜歡的運動? <input type="checkbox" v-model="checkgroup" value="游泳" />游泳 <input type="checkbox" v-model="checkgroup" value="滑冰" />滑冰 <input type="checkbox" v-model="checkgroup" value="長跑" />長跑 </p> {{ checkgroup }} <p>你喜歡的開發語言? <input type="radio" v-model="picked" value="Python" />Python <input type="radio" v-model="picked" value="Go" />Go <input type="radio" v-model="picked" value="js" />js </p> {{ picked }} </div> <script type="text/javascript"> var vm = new Vue({ el: "#box", data: { mytext: "", isChecked: true, checkgroup: [], picked: "js", } }) </script> </body> </html>復制
Example2-購物車
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Examples</title> <meta name="description" content=""> <meta name="keywords" content=""> <link href="" rel="stylesheet"> <script type="text/javascript" src="lib/vue.js"></script> </head> <body> <div id="box"> <input type="checkbox" @change="handleChange" v-model="isAllChecked" /> <ul> <li v-for="data in datalist"> <!-- 此處的:value是動態綁定,data后面.是什么就會去取列表里面對應值 --> <input type="checkbox" v-model="checkgroup" :value="data" @change="handleLiChange" /> {{data}} <button @click="handleDelClick(data)">del</button> {{ data.nuber }} <button @click="data.number++">add</button> </li> </ul> {{ checkgroup }} <!-- 函數表達式 --> <p>總金額計算: {{ getSum() }}</p> </div> <script type="text/javascript"> var vm = new Vue({ el: "#box", data: { checkgroup: [], isAllChecked: false, datalist: [{ name: "商品1", price: 10, number: 1, id: "1", }, { name: "商品2", price: 20, number: 2, id: "2", }, { name: "商品3", price: 30, number: 3, id: "3", } ] }, methods: { getSum() { // 函數計算中的狀態改變后,函數會自動執行一次 var sum = 0; for (var i in this.checkgroup) { sum += this.checkgroup[i].number * this.checkgroup[i].price } return sum }, handleChange() { console.log("改變了", this.isAllChecked) if (this.isAllChecked) { this.checkgroup = this.datalist } else { this.checkgroup = [] } }, handleLiChange() { console.log("handleLiChange-判斷是不是都勾選") if (this.checkgroup.length === this.datalist.length) { this.isAllChecked = true } else { this.isAllChecked = false } }, handleDelClick(data) { // console.log(data) var number = data.number--; if (number == 1) { data.number = 1; } } } }) </script> </body> </html>復制
Example3
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style type="text/css"> form div { height: 40px; line-height: 40px; } form div:nth-child(4) { height: auto; } form div span:first-child { display: inline-block; width: 100px; } </style> </head> <body> <div id="app"> <form action="http://www.zcj.net.cn"> <div> <span>姓名:</span> <span> <input type="text" v-model="uname" /> </span> </div> <div> <span>性別:</span> <span> <input type="radio" id="male" value="1" v-model="gender" /> <label for="male">男</label> <input type="radio" id="female" value="2" v-model="gender" /> <label for="female">女</label> </span> </div> <div> <span>愛好</span> <input type="checkbox" id=ball value="1" v-model="hobby" /> <label for="ball">籃球</label> <input type="checkbox" id=sing value="2" v-model="hobby" /> <label for="sing">唱歌</label> <input type="checkbox" id="code" value="3" v-model="hobby" /> <label for="code">寫代碼</label> </div> <div> <span>職業</span> <!-- multiple加上就是支持多選, 但注意在樣式加入form div:nth-child(4) --> <select v-model="occupation" multiple="true"> <option value="0">請選擇職業</option> <option value="1">教師</option> <option value="2">軟件工程師</option> <option value="3">律師</option> </select> </div> <div> <span>個人簡介:</span> <textarea v-model="desc"></textarea> </div> <div> <input type="submit" value="提交" @click.prevent="handle" /> </div> </form> </div> <script type="text/javascript" src="js/vue.js"></script> <script type="text/javascript"> var vm = new Vue({ el: '#app', data: { uname: 'list', gender: 2, hobby: ["2", "3"], occupation: ["1"], desc: "nihao" }, methods: { handle: function() { // console.log(this.uname) // console.log(this.gender) // console.log(this.hobby) console.log(this.occupation) } } }) </script> </body> </html>復制表單修飾符
表單域修飾符
/* number: 轉化為數值 trim: 去掉開始和結尾的空格 lazy: 將input事件轉化為change事件 <input v-model.number="age" type="number"> */復制
Example1
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>Examples</title> <meta name="description" content=""> <meta name="keywords" content=""> <link href="" rel="stylesheet"> <script type="text/javascript" src="lib/vue.js"></script> </head> <body> <div id="box"> <!-- v-model.lazy 不會讓瀏覽器實時更新,只有失去焦點才會更新 --> <input type="text" v-model.lazy="mytext" /> {{ mytext }} <!-- 限制用戶輸入出去數字外的其他字符 --> <input type="number" v-model.number="mynumber" /> {{ mynumber }} <!-- 去除首,尾空格 --> <input type="text" v-model.trim="myusername"/> | {{ myusername }} | </div> <script> new Vue({ el: "#box", data: { mytext: "", mynumber: 0, myusername: "" } }) </script> </body> </html>復制
Example2
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div id="app"> <input type="text" v-model.number="age" />number <input type="text" v-model.trim="info" />info <input type="text" v-model.lazy="msg" />change <div>{{ msg}}</div> <button @click="handle">點擊</button> </div> <script type="text/javascript" src="js/vue.js"></script> <script type="text/javascript"> /* 表單域修飾符 */ var vm = new Vue({ el: '#app', data: { age: "", info: '', msg: '' }, methods: { handle: function() { console.log(this.age + 13) console.log(this.info.length) } } }) </script> </body> </html>復制
相關推薦
- Vue3(二)工程化開發方式做項目 工程化的開發方式這是開發中、大型項目的必備技能,網上資料也很多,這里只是一個簡單的綜合性的介紹。包括vue的全家桶、建立項目的幾種方式、UI庫的簡單使用等??梢院蜕弦黄腸nd方式做項目做一下對比。node.js,npm、cnpm、yarnnode.js執行 npm run serve ,…
- Hibernate Criterion 在查詢方法設計上能夠靈活的依據Criteria的特點來方便地進行查詢條件的組裝.Hibernate設計了CriteriaSpecification作為Criteria的父接口,以下提供了Criteria和DetachedCriteria.Criteria和DetachedCriteria的主要差別在于創建的形式不一樣,Criteria是在線的,所…