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

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

作者: 云瑶糖糖 | 来源:发表于2021-11-29 13:51 被阅读0次

    <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)

    }

    },

    })