Vue事件处理、计算属性和监视属性

181 阅读1分钟

事件处理

事件的基本使用

  1. 使用v-on:xxx 或 @xxx 绑定事件,其中xxx是事件名;
  2. 事件的回调需要配置在methods对象中,最终会在vm上;
  3. method中配置的函数,不要用箭头函数!否则this就不是vm了;
  4. @click="demo"和@click="demo($event)"效果一致,但后者可以传参; 5.methods中的方法尽量不要使用箭头函数,因为this指向window
<div id="root">
        <button @click="handles">提交</button>
        <button @click="handles1(123,$event)">提交</button>
    </div>
    <script src="../vue.js"></script>
    <script>
        let vm = new Vue({
            el: '#root',
            data: {
                msg: '好啊!'
            },
            methods: {
                handles(event) {
                    console.log(event)
                    console.log(event.target)
                    console.log(this)
                },
                handles1(a, event) {
                    console.log(a)
                    console.log(event);
                }
            }
        })

事件属性

click 鼠标单击触发 dblclick 鼠标双击触发 wheel 鼠标滚轮滚动触发(触发了滚轮处理了回调函数滚动条才动) mouseenter 鼠标进入触发(不会冒泡) mouseleave 鼠标离开触发(不会冒泡) mouseout 鼠标移出触发(会冒泡) mouseover 鼠标经过触发(会冒泡) input 表单输入触发 change 表单改变失焦触发 scroll 滚动条滚动触发

事件修饰符

  1. prevent 事件修饰符
  2. stop 阻止事件冒泡
  3. once 事件只触发一次
  4. capture 使用事件的捕获模式
  5. self 只有event.target是当前操作的元素是才触发的事件
  6. passive 事件的默认行为立即执行,无续等待事件回调执行完毕

键盘事件

keyup 键盘弹起触发 keydown 键盘按下触发 keypress

常用的键盘别名

  1. enter 回车
  2. delete 删除
  3. esc 退出
  4. space 空格
  5. tab 特殊,必须配合keydown去使用
  6. up 上
  7. down 下
  8. left 左
  9. right 右

Vue未提供别名的按键,可以使用键盘原始的key值去绑定,但注意要转为kebab-case(短横线命名)

系统修饰键(用法特殊):ctrl、alt、shift、meta

  • 配合keyup使用:按下修饰的同时,再按下其他按键,随后释放其他键,事件才被触发.
  • 配合keydown使用:注册触发事件

使用KeyCode去指定具体的按键(不推荐)

因为web标准准备遗弃,因为有些键盘的按键编码不一样有些浏览器不支持,现在一般使用which或key。

  1. which和keyCode差不多
  2. key为按键别名

指定义按键

Vue.config.keyCodes.指定义健名 = 键码

    <div id="root">
        <button @click="handles">提交</button>
        <button @click="handles1(123,$event)">提交</button>
        <input type="text" @keyup="handles">
        <input type="text" @keyup.aa="handles">
    </div>
    <script src="../vue.js"></script>
    <script>
        Vue.config.keyCodes.aa = 13
        let vm = new Vue({
            el: '#root',
            data: {
                msg: '好啊!'
            },
            methods: {
                handles(event) {
                    console.log(event)
                    console.log(event.target)
                    console.log(this)
                },
                handles1(a, event) {
                    console.log(a)
                    console.log(event);
                }
            }
        })

计算属性

计算属性:

  1. 定义:要用的属性不存在.要通过以有的属性计算得来.
  2. 原理:底层借助了Objcet.defineproperty方法提供的getter和setter.
  3. get函数什么时候执行? (1).初次读取时会执行一次。 (2).当依赖的数据发生改变时会被再次调用。
  4. 优势:与methods实现相比,内部有缓存机制(复用),效率更高.调试方便。
  5. 备注:
  • 计算属性最终会出现在vm上,直接读取使用即可。

  • 如果计算属性要被修改,那必须写set函数去响应修改,且set中要引起计算时依赖的数据发生改变。

  </script>
    <script>
        let vm = new Vue({
            el: '#root',
            data: {
                xing: "小",
                name: "明",
            },
            computed: {
                fullName: {
                    // get有什么作用?当有人读取fullName时,get就会被调用,且返回值作为fullName的值
                    // get有什么时候被调用?
                    // 1.初次读取fullName时
                    // 2.所依赖的数据发生变化时
                    get() {
                        console.log("get被调用了");
                        return this.xing.slice(0, 3) + '-' + this.name
                    },
                    // set什么时候被调用?当fullName被修改时.
                    set(value) {
                        console.log('set被调用了');
                        const arr = value.split('-')
                        this.fullName = arr[0]
                        this.lastName = arr[1]
                    }
                }
            }
        })
    </script>

计算属性的简写

当我们确定这个值只是调用而不是去修改时我们可以用简写

  <div id="root"><input v-model="xing"><br><input v-model="name"><br>
        全名:<span>{{fullName}}</span>
        <span>{{fullName}}</span>
        <span>{{fullName}}</span>
        <span>{{fullName}}</span>
    </div>
    <script src="../vue.js">
    </script>
    <script>
        let vm = new Vue({
            el: '#root',
            data: {
                xing: "小",
                name: "明",
            },
            computed: {
                fullName() {

                    console.log("get被调用了");
                    return this.xing.slice(0, 3) + '-' + this.name

                }
            }
        })
    </script>

监视属性

        当被监视的属性变化时,回调函数自动调用,进行相关操作
        监视的属性必须存在,才能进行监视!!
        监视的两种写法:
        (1).new Vue时传入watch配置
        (2).通过vm.$watch监视
  <div id="root">
        <div>{{isred}}</div>

    </div>
    <script src="../vue.js"></script>
    <script>
        let vm = new Vue({
            el: '#root',
            data: {
                isred: true,
                haha: 123
            },
            computed: {
                handles() {
                    return this.isred ? "红色" : "不是红色"
                }
            },
            watch: {
                /* isred: {
                    immediate: true,
                    handler(newvalue, oldvalue) {
                        console.log(`监测到的新值${newvalue},检测到的旧值${oldvalue}`);
                    }
                }, */
                handles: {
                    immediate: true,
                    handler(newvalue, oldvalue) {
                        console.log(`监测到的新值${newvalue},检测到的旧值${oldvalue}`);
                    }
                }
            }
        })
        vm.$watch('isred', {
            immediate: true, //初始化时让handler调用一下
            // handle什么时候被调用?当isred发生改变时。
            handler(newvalue, oldvalue) {
                console.log(`监测到的新值${newvalue},检测到的旧值${oldvalue}`);
            }
        })
    </script>

深度监视

深度监视:

  • Vue中的watch默认不监测对象内部的改变(一层)。
  • 配置deep:true可以监测对象内部改变(多层)。 备注:
  • Vue自身可以监测对象内部的改变,但Vue提供的watch默认不可以!
  • 使用watch时根据数据的具体结构,决定是否采用深度监视
 <!-- 
      深度监视:
      Vue中的watch默认不监测对象内部的改变(一层)。
      配置deep:true可以监测对象内部改变(多层)。
      备注:
      Vue自身可以监测对象内部的改变,但Vue提供的watch默认不可以!
      使用watch时根据数据的具体结构,决定是否采用深度监视
     -->
    <div id="root">
        <div>{{number.a}}</div>
        <button @click="number.a++">a++</button>

    </div>
    <script src="../vue.js"></script>
    <script>
        let vm = new Vue({
            el: '#root',
            data: {
                isred: true,
                haha: 123,
                number: {
                    a: 1,
                    b: 1
                }
            },
            computed: {
                handles() {
                    return this.isred ? "红色" : "不是红色"
                }
            },
            watch: {
                // 可以这样精确监视a的变化
                /*  'number.a': {
                     immediate: true,
                     handler(newvalue, oldvalue) {
                         console.log(`监测到的新值${newvalue},检测到的旧值${oldvalue}`);
                     }
                 } */
                number: {
                    deep: true,
                    immediate: true,
                    handler(newvalue, oldvalue) {
                        console.log(`监测到number内的值变化`);
                    }
                }
            }
        })

    </script>

watch简写

image.png

   <div id="root">
        <div>{{isred}}</div>
        <button @click="isred = !isred">toggle</button>

    </div>
    <script src="../vue.js"></script>
    <script>
        let vm = new Vue({
            el: '#root',
            data: {
                isred: true,
                haha: 123,
                number: {
                    a: 1,
                    b: 1
                }
            },
            computed: {
                handles: function () {
                    return console.log(isred);
                }
            }/* ,
            watch: {
                isred: function (newvalue, oldvalue) {
                    console.log(`监测到的新值${newvalue},检测到的旧值${oldvalue}`);
                }
            } */
        })
        vm.$watch('isred', function (newvalue, oldvalue) {
            console.log(`监测到的新值${newvalue},检测到的旧值${oldvalue}`);
        })
    </script>

computed和watch之间的区别:

  1. computed能完成的功能,watch都能可以完成。
  2. watch能完成的功能,computed不一定能完成,例如:watch可以进行异步操作。

两个重要的小原则:

所被vue管理的函数,最好写成普通函数,这样this的指向才是vm或组件实例对象。 所有不被Vue所管理的函数(定时器的回调函数、ajax的回调函数等),最好写成箭头函数,这样this的指向才是vm或组件实例对象。