Vue学习笔记(四)

事件处理

我们可以使用 v-on 指令 (通常缩写为 @ 符号) 来监听 DOM 事件,并在触发事件时执行一些 JavaScript。用法为 v-on:click="methodName" 或使用快捷方式 @click="methodName"

事件处理器的值可以是:

  1. 内联事件处理器:事件被触发时执行的内联JavaScript语句(与onclick类似)
  2. 方法事件处理器:一个指向组件上定义的方法的属性名或是路径。

内联事件处理器

内联事件处理器通常用于简单场景

js 复制代码
<script>
    export default {
        data() {
            return {
                count: 0
            }
        }
    }
</script>

<template>
    <h3>内联事件处理器</h3>
    <button @click="count++">Add</button>
    <p>{{ count }}</p>
</template>

方法事件处理器(重)

js 复制代码
<script>
    export default {
        data() {
            return {
                count: 0
            }
        },
        methods: {
            addCount() {
                console.log('addCount');
                // 读取data中的count值,然后加1,使用this
                this.count++;
            }
        }
    }
</script>

<template>
    <h3>方法事件处理器</h3>
    <button @click="addCount">Add</button>
    <p>Count is: {{ count }}</p>
</template>

事件参数

事件参数可以获取event对象和通过事件传递数据

获取event对象

js 复制代码
<script>
    export default {
        data() {
            return {
                names: ['Tom', 'Jerry', 'Mickey'],
            }
        },
        methods: {
            getNameHander(name){
                console.log(name)
            }
        }
    }
</script>

事件传参

js 复制代码
<script>
    export default {
        data() {
            return {
                names: ['Tom', 'Jerry', 'Mickey'],
            }
        },
        methods: {
            getNameHander(e){
                console.log(e)
            }
        }
    }
</script>

<template>
    <h3>事件传参</h3>
    <p @click="getNameHander(item)" v-for="(item,index) in names" :key="index">{{ item }}</p>
    
</template>

传递参数过程中获取event

js 复制代码
<script>
    export default {
        data() {
            return {
                names: ['Tom', 'Jerry', 'Mickey'],
            }
        },
        methods: {
            getNameHander(name,e){
                console.log(name),
                console.log(e)
            }
        }
    }
</script>

<template>
    <h3>事件传参</h3>
    <p @click="getNameHander(item,$event)" v-for="(item,index) in names" :key="index">{{ item }}</p>
    
</template>

注意$event

事件修饰符

在处理事件时调用event.preventDefault()event.stopPropagation()是很常见的。尽管我们可以直接在方法内调用,但如果方法能更专注于数据逻辑而不用去处理DOM事件的细节会更好

为解决这一问题,Vue为v-on提供了事件修饰符,常用有以下几个:

  1. .stop 阻止冒泡
  2. .prevent 阻止默认行为
  3. .once
  4. .enter
js 复制代码
<script>
    export default {
        data() {
            return {
                
            }
        },
        methods: {
            clickHandle(e) {
                // 阻止默认行为
                // e.preventDefault()
                console.log('clickHandle')
            },
            clickDiv() {
                console.log('clickDiv')
            },
            ClickP(e) {
                // 阻止冒泡
                // e.stopPropagation()
                console.log('ClickP')
            }
        }
    }
</script>

<template>
    <h3>事件修饰符</h3>
    <a @click.prevent="clickHandle" href="https://baidu.com">百度一下</a>
    <div @click="clickDiv">
        <p @click.stop="ClickP">测试冒泡</p>
    </div>
</template>

数组变化侦测

js 复制代码
<script>
    export default {
        data() {
            return {
                names: ['张三', '李四', '王五']
            }
        },
        methods: {
            addListHandle() {
                //引起UI自动更新
                // this.names.push('赵六')
                this.names.concat(['赵六']) //不会引起UI自动更新
                //可以this.names = this.names.concat(['赵六']) 
            }
        }
    }
</script>

<template>
    <h3>数组变化侦测</h3>
    <button @click="addListHandle">添加数据</button>
    <ul>
        <li v-for="(item, index) in names" :key="index">
            {{item}}
        </li>
    </ul>
</template>

变更方法

Vue能够侦听响应式数组的变更方法,并在它们被调用时触发相关的更新。这些变更方法包括:

  1. push()
  2. pop()
  3. shift()
  4. unshift()
  5. splice()
  6. sort()
  7. reverse()

替换一个数组

变更方法,顾名思义,就是会对调用它们的原数组进行变更。相对地,也有一些不可变(immutable)方法,例如filter(),concat()slice(),这些都不会更改原数组,而总是返回一个新数组。当遇到的是非变更方法时,我们需要将旧的数组替换为新的。

例子

js 复制代码
<script>
    export default {
        data() {
            return {
                names: ['张三', '李四', '王五'],
                Numbers1: [1, 2, 3, 4, 5],
                Numbers2: [6, 7, 8, 9, 10],
            }
        },
        methods: {
            addListHandle() {
                //引起UI自动更新
                // this.names.push('赵六')
                this.names = this.names.concat(['赵六']) //不会引起UI自动更新
            },
            concatHandle() {
                this.Numbers1 = this.Numbers1.concat(this.Numbers2)
            }
        }
    }
</script>

<template>
    <h3>数组变化侦测</h3>
    <button @click="addListHandle">添加数据</button>
    <ul>
        <li v-for="(item, index) in names" :key="index">
            {{item}}
        </li>
    </ul>
    <button @click="concatHandle">合并数组</button>
    <h3>数组1</h3>
    <p v-for="(item, index) in Numbers1" :key="index">{{item}}</p>
    <h3>数组2</h3>
    <p v-for="(item, index) in Numbers2" :key="index">{{item}}</p>
</template>

计算属性

模板中的表达式虽然方便,但也只能用来做简单的操作。如果在模板中写太多逻辑,会让模板变得臃肿,难以维护。因此我们推荐使用计算属性来描述依赖响应式状态的复杂逻辑。

js 复制代码
<script>

    export default {
        data() {
            return {
                itbaizhan: {
                    name: "百战程序员",
                    content: ["前端", "后端", "全栈"]
                }
            }
        },
        //计算属性
        computed: {
            itbaizhanContent() {
                return this.itbaizhan.content.length > 0 ? 'Yes' : 'No'
            }
        },
        //放函数或者方法
        methods: {
            itbaizhanContents() {
                return this.itbaizhan.content.length > 0 ? 'Yes' : 'No'
            }
        }
    }
</script>

<template>
    <h3>计算属性</h3>
    <h3>{{ itbaizhan.name }}</h3>
    <p>{{ itbaizhanContent }}</p>
    <p>{{  itbaizhanContents() }}</p>
</template>

计算属性缓存跟方法的比较

在表达式中调用函数会得到跟计算属性相同的结果

计算属性会有缓存,如果运行5次,使用计算属性只会1次,如果使用方法会运行5次

相关推荐
lxlyhwl几秒前
【STK学习】part2-星座-目标可见性与覆盖性分析
学习
nbsaas-boot1 分钟前
如何利用ChatGPT加速开发与学习:以BPMN编辑器为例
学习·chatgpt·编辑器
dr李四维3 分钟前
iOS构建版本以及Hbuilder打iOS的ipa包全流程
前端·笔记·ios·产品运营·产品经理·xcode
I_Am_Me_17 分钟前
【JavaEE进阶】 JavaScript
开发语言·javascript·ecmascript
雯0609~24 分钟前
网页F12:缓存的使用(设值、取值、删除)
前端·缓存
℘团子এ28 分钟前
vue3中如何上传文件到腾讯云的桶(cosbrowser)
前端·javascript·腾讯云
学习前端的小z33 分钟前
【前端】深入理解 JavaScript 逻辑运算符的优先级与短路求值机制
开发语言·前端·javascript
星星会笑滴37 分钟前
vue+node+Express+xlsx+emements-plus实现导入excel,并且将数据保存到数据库
vue.js·excel·express
CV学术叫叫兽40 分钟前
一站式学习:害虫识别与分类图像分割
学习·分类·数据挖掘
我们的五年1 小时前
【Linux课程学习】:进程程序替换,execl,execv,execlp,execvp,execve,execle,execvpe函数
linux·c++·学习