VUE從入門到入坑—04.v-model指令 / 事件綁定指令 / 修飾符 / 深度響應式


上篇:VUE從入門到入坑—03.樣式綁定 / 計算屬性 / 監聽|偵聽器 / 局部|全局過濾器

一、v-model指令

Vue中經常使用到<input>和<textarea>等元素,使用v-model實現這些標簽數據的雙向綁定,它會根據控件類型自動選取正確的方法來更新元素。

1.綁定文本框的內容,實現雙向數據綁定。

    <div id="app">
        <div>
            姓名:<input type="text" v-model="name">{{name}}
        </div>
    </div>
        new Vue({
            el:'#app',
            data:{
                name:"萌新"
            }
        })

2.v-model指令,綁定多行文本框的內容,實現雙向數據綁定。

    <div id="app">
        <div>
            地址:<textarea v-model="address" cols="30" rows="10" ></textarea>{{address}}
        </div>
    </div>

new Vue({
            el:'#app',
            data:{
                addrsess:'江蘇省,南京市,雨花臺區'
            }
        })

3.綁定一組單選按鈕,每個單選按鈕通過v-model綁定相同的屬性。

    <div id="app">
        <div>
            性別:
            <input v-model="sex" type="radio" value="g" name="sex">男
            <input v-model="sex" type="radio" value="m" name="sex">女
            <span style="color: red">{{sex}}</span>
        </div>
    </div>
        new Vue({
            el:'#app',
            data:{
                sex:'g'
            }
        })

4.單個復選框,通過v-model綁定一個布爾值。

    <div id="app">
        <div>
            是否同意:<input type="checkbox" v-model="isOk">{{isOk}}
        </div>
    </div>
        new Vue({
            el:'#app',
            data:{
                isOk: false
            }
        })

5.多個復選框,通過v-model綁定到同一個數組。

    <div id="app">
        <div>
          喜好:
            <input v-model="hobbies" type="checkbox" value="吃飯">吃飯
            <input v-model="hobbies" type="checkbox" value="睡覺">睡覺
            <input v-model="hobbies" type="checkbox" value="打泡泡">打泡泡
            <input v-model="hobbies" type="checkbox" value="唱歌">唱歌
            <input v-model="hobbies" type="checkbox" value="喝酒">喝酒
            <span style="color: red">{{hobbies}}</span>
        </div>
    </div>
        new Vue({
            el:'#app',
            data:{
                hobbies:['吃飯','睡覺','打泡泡']
            }
        })

6.單選擇下拉框時,下拉框綁定一個屬性。

    <div id="app">
        <div>
            城市:
            <select v-model="city">
                <option value="北京">北京</option>
                <option value="南京">南京</option>
                <option value="上海">上海</option>
                <option value="深圳">深圳</option>
            </select>
            <span style="color: red;">{{city}}</span>
        </div>
    </div>
        new Vue({
            el:'#app',
            data:{
                 city: '南京'
            }
        })

7.多選擇下拉框時,給下拉框綁定一個數組,下拉框設置multiple屬性后,選擇多個項。

    <div id="app">
        <div>
            喜歡的食物:
             下拉框設置multiple屬性后,就可以選擇多個項。
            <select multiple v-model="foods">
                  多選時,通過v-mode給下拉框綁定一個數組。
                <option value="蘋果">蘋果</option>
                <option value="菠蘿">菠蘿</option>
                <option value="草莓">草莓</option>
                <option value="蛋糕">蛋糕</option>
                <option value="火龍果">火龍果</option>
            </select>
            {{foods}}
        </div>
    </div>
        new Vue({
            el:'#app',
            data:{
                 foods:['蘋果','草莓','蛋糕']
            }
        })

二、v-model修飾符

1..lazy修飾符
添加了.lazy修飾符,可以將input事件轉為change事件,在文本框失去焦點后再更新數據。

    <div id="app">
        <div>
            姓名:<input type="text" v-model.lazy="name">{{name}}
        </div>
    </div>
        new Vue({
            el:'#app',
            data:{
                name:"萌新"
            }
        })

2..number修飾符
.number修飾符,在修改文本框內容時,會將修改后的內容轉為number類型。

    <div id="app">
        <div>
            年齡:<input type="text" v-model.number="age">{{age+20}}
        </div>
    </div>
        new Vue({
            el:'#app',
            data:{
                age: 18
            }
        })

3..trim修飾符
trim修飾符,在修改文本框內容時,會自動過濾內容的首尾空格。

   <div id="app">
      <div>
         姓名:<input type="text" v-model.trim="name">開始{{name}}結束
      </div>
  </div>
        new Vue({
            el:'#app',
            data:{
                name:"萌新"
            }
        })

三、事件處理

@是v-on:的簡寫,通過v-on:指令綁定事件。

1.事件綁定方法不傳參

通過v-on:指令綁定事件,指定一個methods選項里面的定義的方法,調用方法時,不傳參數,默認會將事件對象作為參數傳遞。

    <div id="app">
        <button @click="sayHi">sayHi</button>
    </div>
        new Vue({
            el:'#app',
            methods: {
                sayHi(e){
                    console.log(e);     ??打印事件對象
                    alert('Hi!')
                }
            }
        })

2.事件綁定方法傳參
調用方法時,傳的是什么參數,接的就是什么參數。

    <div id="app">
        <button @click="sayHello('hello')">sayHello</button>
    </div>
    new Vue({
        el:'#app',
        methods: {
            sayHello(e){
                console.log(e);     ??打印‘hello’
                alert('Hello!')
            }
        }
    })

3.事件綁定方法既傳參又傳遞事件對象
如果傳遞了一個參數,又想再傳遞事件對象參數,就要通過$event關鍵字設置參數,該參數就是事件對象。

    <div id="app">
        <button @click="sayNice('Nice',$event)">sayNice</button>
    </div>
        new Vue({
            el:'#app',
            methods: {
                sayNice(msg,e){
                    console.log(e);     ??打印事件對象
                    alert(msg)      ??彈出消息‘Nice’
                }
            }
        })

4.行內方法
當事件梳理的代碼比較簡單時,可以將代碼直接寫在行內,注意:只能操作vue管理的數據。

    <div id="app">
        <button @click="age++">年齡++</button>
    </div>
        new Vue({
            el:'#app',
            data:{
                age:18
            }
        })

四、事件修飾符

1..prevent修飾符,在事件處理程序中調用 event.preventDefault() 阻止默認行為,可以通過.prevent事件修飾符,阻止默認行為。

<div id="app">
        <div @contextmenu.prevent='showbox' class="box"></div>
        <!-- <div @contextmenu='showbox' class="box"></div> -->
    </div>
new Vue({
            el:'#app',
            methods: {
                showbox(e){
                    // e.preventDefault() 阻止默認行為
                    console.log('你好,我是box');
                }
            },
        })

2..stop修飾符,在事件處理程序中調用 event.stopPropagation() 阻止事件冒泡,可以通過.stop事件修飾符綁定給子元素,阻止事件冒泡。

    <div id="app">
        <div class="one" @click='one'>
            <!-- <div class="two" @click='two'></div> -->
            <div class="two" @click.stop='two'></div>
        </div>
        
    </div>
new Vue({
            el:'#app',
            methods: {
                one(){
                    console.log('你好,我是one');
                },
                two(e){
                   //  e.stopPropagation() 阻止事件冒泡
                    console.log('你好,我是two');
                }
            },
        })

3.once修飾符,讓事件方法只執行一次。

<div id="app">
        <div class="one" @click.once='one'>
            <!-- <div class="two" @click='two'></div> -->
            <div class="two" @click.stop='two'></div>
        </div>
        
    </div>
  new Vue({
            el:'#app',
            methods: {
                one(){
                    console.log('你好,我是once');
                },
                two(e){
                    // e.stopPropagation() 阻止事件冒泡;
                    console.log('你好,我是two');
                }
            },
        })

4..self修飾符,控制事件在當前元素自身觸發,不在內部元素身上觸發,和.stop修飾符有點相像,區別就是self是綁定給父元素的。

<div id="app">
        <div class="one" @click.self='one'>
            <div class="two" @click='two'></div>
        </div>
 new Vue({
            el:'#app',
            methods: {
                one(){
                    console.log('你好,我是self');
                },
                two(){
                    console.log('你好,我是two');
                }
            },
        })

五、按鍵修飾符

Vue針對鍵盤事件,提供了按鍵修飾符。按鍵修飾符也可以用按鍵碼(keyCode)代替,例如:enter可以用.13代替。注意:Vue3中取消了按鍵碼。

一共有9個按鍵修飾符,分別是:.enter 是回車鍵,.tab 是tab鍵,.delete 是刪除鍵和退格鍵,.esc 是退出鍵,.space 是空格鍵,.up 是上箭頭,.down 是下箭頭,.left 是左箭頭,.right 是右箭頭

    <div id="app">        
        <div>
            <!-- 每次鍵盤彈起都會調用事件方法 -->
            請輸入搜索關鍵字:<input type="text" @keyup="keyup">
        </div>
        <div>
            <!-- 只在回車時,才會調用事件方法 -->
            請輸入搜索關鍵字:<input type="text" @keyup.enter="keyup1">
            <!-- 請輸入搜索關鍵字:<input type="text" @keyup.13="keyup1"> -->
        </div>
    </div>
        new Vue({
            el:'#app',
            methods: {
                keyup(e){
                    let {keyCode} = e
                    if(keyCode===13){
                        alert('搜索指定的商品')
                    }
                },
                keyup1(){
                    alert('搜索指定的商品')
                }
            }
        })

六、深度響應式

1.Vue實例在初始化的時候,會將obj對象身上的所有數據,采用Object.defineProperty去封裝,做響應式處理。所謂響應式,指的是數據發生變化后,頁面自動更新。

2.但是給對象后添加的數據不會采用Object.defineProperty去封裝,所以就不再具備響應式能力了。

3.實現后添加的數據也具備響應式能力,有以下兩種方式:
(1)通過Vue的set方法,更新指定的對象屬性或數組成員;delete方法,刪除指定對象的屬性或數組的成員。
(2)通過Vue實例的$set方法,更新指定的對象屬性或數組成員,$delete方法,刪除指定對象的屬性或數組的成員。

4.更新對象例子
set方法的參數分別是:指定的對象,對象的屬性,屬性值。
delete方法的參數分別是:指定的對象,對象的屬性。

    <div id="app">
        <div>
            學生信息:
            <input type="text" v-model="obj.name">
            <input type="text" v-model.number="obj.age">
            <button @click="addSex">添加性別</button>
            <button @click="delAge">刪除年齡</button>
            <br>
            {{obj}}
        </div>
    </div>
        let vm = new Vue({
            el:'#app',
            data:{
                obj:{
                    name:'張三',
                    age:20,
                }
            },
            methods: {
                // 添加性別
                addSex(){
                    // 使用普通方法給對象后添加的屬性,失去了響應式
                    // this.obj.sex = '男'

                    // vue通過set方法,給對象添加響應式屬性
                    // Vue.set(this.obj,'sex','男')

                    // vue實例通過$set方法,給對象添加響應式屬性
                    this.$set(this.obj,'sex','男')
                },
                // 刪除年齡
                delAge(){
                    // 采用delete關鍵字刪除對象的屬性后,沒有觸發頁面更新
                    // delete this.obj.age

                    // Vue的delete方法,刪除對象的屬性,并觸發響應式
                    // Vue.delete(this.obj,'age')

                    // vue實例通過$delete方法,刪除對象的屬性,并觸發響應式
                    this.$delete(this.obj,'age')
                }
            },
        })

5.更新數組例子
(1)在Vue中,操作數組只能通過以下方法,才能實現響應式:push()、pop()、unshift() 、shift()、splice()、reverse()、sort()。
(2)如果想通過下標直接操作數組,也必須要使用Vue的sett和delete方法或者Vue實例的$set和$delete方法。
set方法的參數分別是:指定的數組,數組的下標,對應的數據。
delete方法的參數分別是:指定的數組,數組的下標。

    <div id="app">
        <div>
            數組:{{arr}}
            <button @click="updateArr">修改數據</button>
            <button @click="addArr">添加數據</button>
            <button @click="delArr">刪除數據</button>
        </div>
    </div>
        let vm = new Vue({
            el:'#app',
            data:{
                arr:[11,22,33,44,55]
            },
            methods: {
                // 修改數組身上的成員
                updateArr(){
                    // 注意:直接利用索引設置數組項,不會觸發頁面更新
                    // this.arr[1] = 32

                    // vue通過set方法,可以利用索引直接設置一個數組項
                    // Vue.set(this.arr,1,32)

                    // vue實例通過$set方法,可以利用索引直接設置一個數組項
                    this.$set(this.arr,1,32)
                },
                // 添加數組的數據
                addArr(){
                    // this.arr[5] = 66    // 注意:采用這種方式,不會觸發頁面更新

                    // vue通過set方法,給數組添加響應式數據
                    // Vue.set(this.arr,5,66)

                    // vue實例通過$set方法,給數組添加響應式數據
                    this.$set(this.arr,5,66)
                },
                // 刪除數組的數據
                delArr(){
                    // 采用delete關鍵字刪除數組下標為2的元素后,沒有觸發頁面更新
                    // delete this.arr[2]

                    // vue通過delete方法,給數組刪除數據,并觸發響應式
                    // Vue.delete(this.arr,2)

                    // vue實例通過$delete方法,給數組刪除數據,并觸發響應式
                    this.$delete(this.arr,2)
                }
            },
        })
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內容