V-model指令的详细用法、绑定事件、深度响应式

    <div id="app">

        <div class="item">

            <span>姓名:</span>

            <!-- v-model指令,绑定文本框的内容,实现双向数据绑定 -->

            <input type="text" v-model="name">{{name}}

        </div>

        <div class="item">

            <span>地址:</span>

            <!-- v-model指令,绑定多行文本框的内容,实现双向数据绑定 -->

            <textarea cols="80" rows="4" v-model="address"></textarea>{{address}}

        </div>

        <div class="item">

            <span>是否同意:</span>

            <!-- 单个复选框,通过v-model绑定一个布尔值 -->

            <input type="checkbox" v-model="isOK">{{isOK}}

        </div>

        <div class="item">

            <span>爱好:</span>

            <!-- 多个复选框,通过v-model绑定到同一个数组 -->

            <input type="checkbox" value="抽烟" v-model="hobbies">抽烟

            <input type="checkbox" value="喝酒" v-model="hobbies">喝酒

            <input type="checkbox" value="烫头" v-model="hobbies">烫头

            <input type="checkbox" value="唱" v-model="hobbies">唱

            <input type="checkbox" value="跳" v-model="hobbies">跳

            <input type="checkbox" value="篮球" v-model="hobbies">篮球

            {{hobbies}}

        </div>

        <div class="item">

            <span>性别:</span>

            <!-- 多个单选框,通过v-model绑定同一个数据 -->

            <input type="radio" value="男" name="sex" v-model="sex">男

            <input type="radio" value="女" name="sex" v-model="sex">女

            {{sex}}

        </div>

        <div class="item">

            <span>学历:</span>

            <!-- 通过v-model可以给下拉框绑定一个属性 -->

            <select v-model="xueli">

                <option value="小学">小学</option>

                <option value="硕士">硕士</option>

                <option value="博士">博士</option>

                <option value="博士后">博士后</option>

            </select>

            {{xueli}}

        </div>

        <div class="item">

            <span>美食:</span>

            <!-- 下拉框设置multiple属性后,就可以选择多个项 -->

            <!-- 通过v-model可以给下拉框绑定一个数组 -->

            <select v-model="meishi" multiple>

                <option value="螃蟹">螃蟹</option>

                <option value="龙虾">龙虾</option>

                <option value="鸡腿">鸡腿</option>

                <option value="牛排">牛排</option>

                <option value="海鲜">海鲜</option>

            </select>

            {{meishi}}

        </div>

        <div class="item">

            <span>修饰符lazy</span>

            <!-- v-model指令,添加.lazy修饰符,在文本框失去焦点后在更新数据  -->

            <input type="text" v-model.lazy="msg">{{msg}}

        </div>

        <div class="item">

            <span>修饰符number</span>

            <!-- v-model指令,添加.number修饰符,在修改文本框内容时,会将修改后的内容转为number类型 -->

            <input type="text" v-model.number="age">{{age+10}}

        </div>

        <div class="item">

            <span>修饰符trim</span>

            <!-- v-model指令,添加.trim修饰符,在修改文本框内容时,会忽略前后的空格 -->

            <input type="text" v-model.trim="city">

            <span>长度:{{city.length}}</span>

        </div>

    </div>

    let vm = new Vue({

    el:'#app',

    data:{

    name:'张三',

    address:'北京市朝阳区',

    // 用于表示是否同意

    isOK:true,

    // 爱好数组

    hobbies:["烫头","跳"],

    // 性别

    sex:'女',

    // 学历

    xueli:'博士',

    // 美食

    meishi:[],

    // 消息

    msg:'',

    //年龄

    age:20,

    city:'北京'

    },

    })

绑定事件

 <div id="app">

        <!-- v-on:指令绑定事件,可以指定一个事件方法,事件方法要在methods里面定义。

    指定事件方法时,如果没有给方法传递参数,默认会传递一个事件对象参数 -->

        <button v-on:click="sayHi">Say Hi</button>

        <br><br>

        <!-- 如果我们传递了一个参数,还想再传递事件对象参数,就要通过$event关键字设置。 -->

        <button v-on:click="sayHello('你好',$event)">Say Hello</button>

        <br>

        <br>

        <!-- 如果事件处理的逻辑比较简单,可以直接在行内编写。 -->

        <button v-on:click="name+='*'">修改name</button>{{name}}

        <hr>

        <!-- @是v-on:的简写 -->

        <!-- 通过.prevent事件修饰符,阻止默认行为 -->

        <div class="a" @click="a" @contextmenu.prevent="cm">

            <!-- 通过.stop事件修饰符,阻止事件冒泡 -->

            <div class="b" @click.stop="b"></div>

        </div>

        <br>

        <!-- 通过.once事件修饰符,让事件方法只执行一次 -->

        <button @click.once="once">只触发一次</button>

        <br><br>

        <!-- 通过.self事件修饰符,控制事件在当前元素自身触发,不在内部元素身上触发 -->

        <div class="c" @click.self="c">

            <div class="d"></div>

        </div>

        <br>

        <!-- 默认情况下,手机的捕获模式是,从内部往外部挨个执行。

    如果外部事件添加.capture修饰符,此时事件的不会模式就变成了,从外部外内部挨个执行。 -->

        <div class="e" @click.capture="e">

            <div class="f" @click="f"></div>

        </div>

        <br>

        <!-- passive就是为了告诉浏览器,不用查询了,我们没用preventDefault阻止默认动作 -->

        <div class="g" @scroll.passive="g">

            <div class="h"></div>

        </div>

    </div>

    new Vue({

    el:'#app',

    data() {

    return {

    name:'张三'

    }

    },

    methods: {

    sayHi(e){

    console.log(e);

    console.log('Hi');

    },

    sayHello(val,e){

    console.log(val);

    console.log(e);

    },

    a(){

    alert('大家好!我是a')

    },

    b(){

    // 通过事件对象,阻止事件冒泡

    // e.stopPropagation();

    alert('大家好!我是b')

    },

    cm(){

    // 通过事件对象,阻止默认行为

    // e.preventDefault();

    console.log('哈哈');

    },

    once(){

    alert('你好呀!')

    },

    c(){

    alert('大家好!我是c')

    },

    e(){

    alert('大家好!我是e')

    },

    f(){

    alert('大家好!我是f')

    },

    g(){

    console.log(11);

    }

    },


深度响应式

1. 按键修饰符

   new Vue({

    el:'#app',

    // data选项,定义属性,该选项可以是一个对象,也可以是一个方法返回一个对象。

    data:{

    // 商品数组

    goodses:['小米手机','华为电脑','苹果手表','尼康相机'],

    // 搜索关键字

    keywords:'',

    // 搜索结果

    content:''

    },

    // methods选项,定义方法

    methods: {

    keydown(){

    // 字符串的includes()方法,用于检查字符串中是否包含指定的内容,包含返回true

    this.content = this.goodses.find(g=>g.includes(this.keywords))

    }

    },

    })


2. 深度响应式

  <div id="app">

        <button @click="name='李四'">修改姓名</button>

        <h2>{{name}}</h2>

        <hr>

        <button @click="obj.name='张飞'">修改姓名</button>

        <button @click="addJob">添加工作属性</button>

        <button @click="delAge">删除年龄属性</button>

        <h2>{{obj}}</h2>

        <hr>

        <button @click="arr.push('可乐')">添加可乐</button>

        <button @click="arr.splice(1,1,'榴莲')">通过方法修改元素</button>

        <button @click="updateArr">通过下标修改元素</button>

        <button @click="delArr">通过下标删除元素</button>

        <h2>{{arr}}</h2>

    </div>

    // Vue实例,在初始化的时候,会将对象身上的所有数据,做响应式处理,

    // 之后再向对象中添加属性,这些属性就不再具备响应式能力了。

    // 针对数组,只能通过以下方法,才能实现响应式:push() pop() unshift() shift() splice() reverse() sort()

    // 如何解决上面的问题?

    // 方式1:通过Vue的set方法,更新指定的对象属性或数组成员;delete方法,删除指定对象的属性或数组的成员

    // 方式2:通过Vue实例的$set方法,更新指定的对象属性或数组成员;$delete方法,删除指定对象的属性或数组的成员

    Vue.config.productionTip = false

    let vm = new Vue({

    el:"#app",

    data:{

    // 基本类型数据

    name:'张三',

    // 对象数据

    obj:{

    name:'张杰',

    age:20,

    sex:'男'

    },

    // 数组数据

    arr:['面包','饼干','薯片','巧克力']

    },

    methods: {

    // 给对象添加工作属性的方法

    addJob(){

    // 通过观察可以发现,我们可以给对象添加属性,但是添加后的属性,不具备响应式能力。

    // this.obj.job='前端开发工程师'

    // set方法的参数分别是:指定的对象,对象的属性,属性值

    // Vue.set(this.obj,'job','前端开发工程师')

    this.$set(this.obj,'job','前端开发工程师')

    },

    // 删除对象身上年龄的方法

    delAge(){

    // delete this.obj.age

    // delete烦烦烦的参数分别是:指定的对象,对象的属性

    // Vue.delete(this.obj,'age')

    this.$delete(this.obj,'age')

    },

    // 修改数组身上的成员

    updateArr(){

    // this.arr[1] = '苹果'

    // 这里set方法的参数分别是:指定的数组,数组的下标,对应的数据

    this.$set(this.arr,1,'苹果')

    },

    // 根据下标删除数组元素

    delArr(){

    // delete this.arr[1]

    // 这里的delete方法的参数分别是:指定的数组,数组的下标

    this.$delete(this.arr,1)

    }

    },

    })


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335

推荐阅读更多精彩内容