您当前的位置:首页 > 电脑百科 > 程序开发 > 前端

Vue3 学习笔记,如何定义事件以及如何理解响应式

时间:2023-12-06 14:11:12  来源:今日头条  作者:前端达人

如何定义事件

在 Vue 中,可以使用 v-on 指令来绑定事件监听器。

下面是一个示例,在点击按钮时触发事件处理程序:

<template>
  <div>
    <button v-on:click="incrementCounter">{{ counter }}</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      counter: 0
    }
  },
  methods: {
    incrementCounter() {
      this.counter++
    }
  }
}
</script>

在上面的例子中,点击按钮时会触发 incrementCounter 方法,然后将计数器增加 1。

还可以使用缩写语法来绑定事件监听器,如下所示:

<button @click="incrementCounter">{{ counter }}</button>

其他常见的监听事件

除了 click 事件之外,Vue.js 中还有许多其他可供监听的事件,还包括:

  • input:当用户在输入框中输入时触发。
  • submit:当表单被提交时触发。
  • focus:当元素获得焦点时触发。
  • blur:当元素失去焦点时触发。
  • change:当元素的值改变时触发,通常用于 select 和 input[type="checkbox"]。
  • keydown:当按下键盘上的任意按键时触发。
  • keyup:当松开键盘上的任意按键时触发。
  • mouseenter:当鼠标指针移动到元素上时触发。
  • mouseleave:当鼠标指针移出元素时触发。
  • mousemove:当鼠标指针在元素上移动时触发。
  • mousedown:当鼠标按钮被按下时触发。
  • mouseup:当鼠标按钮被松开时触发。

下面针对这些事件,分别配上案例,方便大家进行理解

1、input事件

当用户在输入框中输入时触发。可以在 input 标签上直接绑定 v-on:input 事件,并在事件处理程序中执行相应的操作

<template>
  <div>
    <input v-on:input="onInput" placeholder="Enter Something">
    <p>{{ message }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: ''
    }
  },
  methods: {
    onInput(event) {
      this.message = event.target.value
    }
  }
}
</script>

2、submit事件

当表单被提交时触发。可以在 form 标签上直接绑定 v-on:submit 事件,并在事件处理程序中执行相应的操作。

<template>
  <div>
    <form v-on:submit.prevent="onSubmit">
      <input type="text" v-model="message">
      <button type="submit">Submit</button>
    </form>
    <p>{{message}}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: ''
    }
  },
  methods: {
    onSubmit() {
      alert('Form submitted!')
    }
  }
}
</script>

3、focus事件

当元素获得焦点时触发。可以在元素标签上直接绑定 v-on:focus 事件,并在事件处理程序中执行相应的操作

<template>
  <div>
    <input v-on:focus="onFocus" placeholder="Enter Something">
  </div>
</template>

<script>
export default {
  methods: {
    onFocus() {
      alert('Input focused!')
    }
  }
}
</script>

4、blur事件

当元素失去焦点时触发。可以在元素标签上直接绑定 v-on:blur 事件,并在事件处理程序中执行相应的操作

<template>
  <div>
    <input v-on:blur="onBlur" placeholder="Enter Something">
  </div>
</template>

<script>
export default {
  methods: {
    onBlur() {
      alert('Input blurred!')
    }
  }
}
</script>

5、change事件

当元素的值改变时触发,通常用于 select 和 input[type="checkbox"]。可以在元素标签上直接绑定 v-on:change 事件,并在事件处理程序中执行相应的操作

<template>
  <div>
    <select v-on:change="onChange">
      <option value="option1">Option 1</option>
      <option value="option2">Option 2</option>
      <option value="option3">Option 3</option>
    </select>
    <p>Selected: {{ selectedOption }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      selectedOption: ''
    }
  },
  methods: {
    onChange(event) {
      this.selectedOption = event.target.value
    }
  }
}
</script>

6、keydown事件

当按下键盘上的任意按键时触发。可以在元素标签上直接绑定 v-on:keydown 事件,并在事件处理程序中执行相应的操作

<template>
  <div>
    <input v-on:keydown="onKeydown" placeholder="Press a key">
  </div>
</template>

<script>
export default {
  methods: {
    onKeydown(event) {
      alert(`Key pressed: ${event.key}`)
    }
  }
}
</script>

7、mouseenter事件

@mouseenter 事件是在鼠标指针移动到元素上方时触发。

<template>
  <div>
    <button @mouseenter="mouseEnter">Hover me</button>
  </div>
</template>

<script>
export default {
  methods: {
    mouseEnter() {
      console.log("Mouse entered button");
    }
  }
};
</script>

上面的示例中,当用户将鼠标移动到按钮上时,会在控制台打印 "Mouse entered button" 。

由于 mouseleave,mousemove,mousedown,mouseup 这几个事件都比较类似,这里我就不举例子进行展开介绍了。

聊一聊 Vue 的响应式

Vue.js 是一个 JAVAScript 框架,它采用数据驱动和组件化的思想,通过数据响应式来更新视图。

数据响应式是 Vue 的核心机制之一,它会在 Vue 实例创建时对数据进行观察,当数据发生变化时自动更新视图。

代码示例:

<template>
  <div>
    <p>{{ message }}</p>
    <button @click="changeMessage">change message</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: 'Hello Vue'
    }
  },
  methods: {
    changeMessage() {
      this.message = 'Hello World'
    }
  }
}
</script>

在这个例子中,我们在模板中使用了双括号语法来渲染 message 属性的值。当我们点击按钮时,会调用 changeMessage 方法,改变 message 的值,由于 Vue 采用了数据响应式,所以会自动更新视图,使得 p 标签中的文本也变成 “Hello World”。

那么如何理解Vue背后的响应式逻辑呢?

当我们在 Vue 实例中定义了 data 属性时,Vue 会对这些数据进行观察。当我们给 data 中的属性赋值时,Vue 会自动触发 setter,并在 setter 中进行依赖收集和派发更新。

依赖收集是 Vue 实现数据响应式的关键。当我们在模板中使用了某个数据,Vue 会在渲染过程中自动为这个数据建立一个依赖,并将其加入到相应的依赖收集器中。当数据发生变化时,Vue 会根据依赖收集器中的依赖关系,自动更新相应的视图。

在上面的代码中,我们在模板中使用了 {{ message }} 来渲染 message 属性的值,Vue 会在渲染过程中自动将 {{ message }} 与 message 属性建立依赖关系。当我们点击按钮时,会调用 changeMessage 方法,改变 message 的值,Vue 会根据依赖关系,自动更新 {{ message }} 所在的视图。

数据响应式系统是 Vue.js 数据驱动视图的基础,它能使得 Vue.js 具有高度的可维护性和可扩展性。

延伸阅读:Vue2 底层响应式实现逻辑

也许你会好奇,Vue 是如何实现响应式的,那么我们先简单的聊聊 Vue2 底层的代码是如何实现响应式的,感兴趣的可以了解下。

Vue 的响应式系统的实现主要基于 Object.defineProperty() 这个 JavaScript 内置函数。在创建 Vue 实例时,Vue 会遍历 data 选项中的所有属性,使用 Object.defineProperty() 为它们定义 getter 和 setter。

在这里介绍一下Object.defineProperty的用法:

var obj = {};
Object.defineProperty(obj, 'name', {
  value: 'Jack',
  writable: true,
  configurable: true,
  enumerable: true
});
console.log(obj.name)  //'Jack'

Object.defineProperty() 函数接受三个参数:对象、属性名、属性描述符。属性描述符是一个对象,可以设置属性的一些特性,如 value、writable、configurable、enumerable 等。

Vue 会在每个响应式属性上定义一个 getter 和一个 setter,来拦截对该属性的读写操作。当获取属性值时,调用的是 getter;当修改属性值时,调用的是 setter。

Vue 的 setter 中会对新值进行检测,如果发现新值和旧值不一样,就会触发相应的更新操作。

Vue 使用了一个叫做 Dep 的依赖管理器,来维护响应式数据与视图更新之间的关系。Dep 类负责维护一个依赖列表,其中包含了所有读取该属性的 Watcher。当 setter 被调用时,会触发 Dep 的 notify() 方法,通知所有 Watcher 更新。

Watcher 的作用是监听响应式数据的变化,并触发视图更新。它是 Vue 中重要的组成部分之一。

在 Vue 中,视图和响应式数据是一一对应的,每个响应式数据都对应着一个或多个 Watcher。当响应式数据发生变化时,Watcher 会被触发,从而更新视图。

Watcher 的实现细节较为复杂,但大致流程如下:

  • 在 Vue 实例创建时,为每个视图绑定的响应式数据创建一个 Watcher。
  • Watcher 会在它所监听的响应式数据上注册一个 Dep。
  • 当响应式数据发生变化时,会触发 Dep 的 notify() 方法,从而通知所有 Watcher 更新。
  • Watcher 会调用自己的 update() 方法更新视图。

Watcher 的实现细节较为复杂,下面是一个简化版的 Watcher 类的示例代码,帮助理解其实现原理:

class Watcher {
  constructor(vm, key, cb) {
    this.vm = vm
    this.key = key
    this.cb = cb

    // 将当前 Watcher 实例指向 Dep.target
    // 这样 Dep 就能够收集到这个 Watcher
    Dep.target = this
    this.vm[this.key] // 触发 getter,收集依赖
    Dep.target = null
  }

  update() {
    this.cb.call(this.vm, this.vm[this.key])
  }
}

这个例子中,Watcher 类包含了三个属性:vm、key、cb。vm 是 Vue 实例,key 是响应式数据的名称,cb 是更新视图的回调函数。

在构造函数中,Watcher 会将自己设置为 Dep.target,并读取 vm[key]。这样,在 vm[key] 的 getter 中就能够收集到这个 Watcher。

update() 方法会在响应式数据发生变化时被调用,更新视图。

Watcher 类还包含其他一些方法,如 addDep()、depend()等,用于维护与 Dep 之间的关系,可以参考 Vue 源码来了解这些方法的具体实现。

希望这些资料能够帮助您更好的理解 Vue 的响应式系统的实现。

延伸阅读:Vue3 响应式的实现逻辑

Vue 3 的响应式系统与 Vue 2 的响应式系统有一些不同之处。

Vue 3 引入了一种新的响应式实现方式,叫做 "Proxy based observation"。它使用了 JavaScript 内置的 Proxy 对象来实现响应式,而不再使用 Object.defineProperty()。

使用 Proxy 对象可以更简单地实现响应式,并且性能更优,代码实现更简洁。

举个例子,在 Vue 2 中,我们可以这样创建一个响应式对象:

let data = { count: 0 }
Object.defineProperty(data, 'count', {
  get() {
    console.log('count get')
    return count
  },
  set(newValue) {
    console.log('count set')
    count = newValue
  }
})

而在 Vue 3 中,我们可以这样创建响应式对象:

let data = reactive({ count: 0 })

function reactive(obj) {
  return new Proxy(obj, {
    get(target, key, receiver) {
      console.log(`get ${key}`)
      return Reflect.get(target, key, receiver)
    },
    set(target, key, value, receiver) {
      console.log(`set ${key}`)
      return Reflect.set(target, key, value, receiver)
    }
  })
}

在Vue3中,还引入了一个叫做"reactivity"的新概念,用于描述一组可响应数据,而不再依赖于组件实例。这样可以让响应式系统更加灵活,更易于实现自定义组件。

总的来说, Vue 3 的响应式系统使用了 JavaScript 内置的 Proxy 对象,并引入了新的 reactivity 概念,提高了响应式系统的灵活性和性能。在 Vue 3 中,每个组件实例都有自己的响应式系统,而不再像 Vue 2 中那样共用一个全局的响应式系统。这样可以更好地支持复杂的组件结构和高性能的响应式系统。

另外,Vue 3 中的响应式系统还支持对 Map 和 Set 等新的数据类型的响应式,这在 Vue 2 中是不支持的。

在 Vue 3 中,响应式系统与虚拟 DOM 结合更紧密,更易于实现高性能的组件。Vue 3 中还引入了新的 Composition API,可以更灵活地编写组件,更好地复用和组合组件逻辑。

总之,Vue 3 的响应式系统是基于 JavaScript 内置的 Proxy 对象实现,更加灵活高效,并支持新的数据类型和更好的组件编写方式。

结束

今天的分享就到这里,本篇文章我们一起学习了如何在 Vue 中定义事件 ,并且介绍了常用的事件。以及什么是响应式,以及 Vue 底层是如何实现响应式的,并对 Vue2 和 Vue3 的实现方式和差异进行了介绍。下一篇文章,我将继续介绍 Vue 其他方面的相关内容,比如计算属性 Computed 和 Watch 属性,敬请期待。



Tags:Vue3   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
SpringBoot3+Vue3 开发高并发秒杀抢购系统
开发高并发秒杀抢购系统:使用SpringBoot3+Vue3的实践之旅随着互联网技术的发展,电商行业对秒杀抢购系统的需求越来越高。为了满足这种高并发、高流量的场景,我们决定使用Spring...【详细内容】
2024-01-14  Search: Vue3  点击:(90)  评论:(0)  加入收藏
vue3中 ref和 reactive的区别 ?
最近有朋友在面试过程中经常被问到这么一个问题,vue3 中的ref 和 reactive的区别在哪里,为什么 要定义两个API 一个 api不能实现 响应式更新吗??带着这个疑问 ,我们 接下来进行逐...【详细内容】
2024-01-03  Search: Vue3  点击:(36)  评论:(0)  加入收藏
React18 与 Vue3 全方面对比
1. 编程风格 & 视图风格1.1 编程风格 React 语法少、难度大;Vue 语法多,难度小例如指令:Vue<input v-model="username"/><ul> <li v-for="(item,index) in list" :key="inde...【详细内容】
2024-01-03  Search: Vue3  点击:(72)  评论:(0)  加入收藏
Vue3 学习笔记,如何使用 Watch 监听数据变化
大家好,本篇文章我们继续学习和 Vue 相关的内容,今天我们归纳总结下如何使用 watch 监听组件中的数据变化,以及 computed 和 watch 的区别。什么是 watch,以及如何使用?watch 是...【详细内容】
2023-12-14  Search: Vue3  点击:(163)  评论:(0)  加入收藏
Vue3 学习笔记,如何理解 Computed 计算属性
大家好,本篇文章我们继续学习和 Vue 相关的内容,今天我们归纳总结下什么是 computed 计算属性、如何使用和应用场景,以及 computed 和 Method 事件的区别和应用场景。什么是 co...【详细内容】
2023-12-11  Search: Vue3  点击:(199)  评论:(0)  加入收藏
Vue3 学习笔记,如何定义事件以及如何理解响应式
如何定义事件在 Vue 中,可以使用 v-on 指令来绑定事件监听器。下面是一个示例,在点击按钮时触发事件处理程序:<template> <div> <button v-on:click="incrementCounter">{{...【详细内容】
2023-12-06  Search: Vue3  点击:(136)  评论:(0)  加入收藏
最全Vue3开源管理系统汇总
搭建一个后台管理,从零开始开发,其实并不容易,在众多开源管理后台中,Vue3是一个备受瞩目的选择。它是一个现代化的前端框架,具有高效、灵活、易用等特点,今天,要为大家介绍几款开源...【详细内容】
2023-11-24  Search: Vue3  点击:(202)  评论:(0)  加入收藏
Vue3问题:如何实现El-table内容超出省略提示?第三条很少有人会
一、需求分析,问题描述1、需求一个表格,分表头、表体、表尾三部分。当每个单元格的内容过长超出时,需要省略,用省略号代替超出的部分。同时,当鼠标移入上去时,会在上方弹出一个小...【详细内容】
2023-11-23  Search: Vue3  点击:(90)  评论:(0)  加入收藏
Spring Boot + Vue3 前后端分离 实战wiki知识库系统
下栽の地止:https://www.itwangzi.cn/2508.html Spring Boot + Vue3 前后端分离 实战wiki知识库系统在当今的Web应用开发中,前后端分离已经成为了一种主流的开发模式。Spring...【详细内容】
2023-11-18  Search: Vue3  点击:(142)  评论:(0)  加入收藏
深入详解Vue3中的Mock数据模拟
Vue3 前端开发时,需要api请求模拟和数据模拟,我将在接下来的时间写Mock模拟和json-server模拟。两种比较流行的模式,现在先介绍mock模式。使用NPM安装Mock.js库Mock.js是一个轻...【详细内容】
2023-11-07  Search: Vue3  点击:(158)  评论:(0)  加入收藏
▌简易百科推荐
20k级别前端是怎么使用LocalStorage的,想知道吗?
当咱们把咱们想缓存的东西,存在localStorage、sessionStorage中,在开发过程中,确实有利于咱们的开发,咱们想看的时候也是一目了然,点击Application就可以看到。前言大家好,我是林...【详细内容】
2024-03-26  前端之神  微信公众号  Tags:前端   点击:(10)  评论:(0)  加入收藏
前端不存在了?盲测64%的人更喜欢GPT-4V的设计,杨笛一等团队新作
3 月 9 日央视的一档节目上,百度创始人、董事长兼 CEO 李彦宏指出,以后不会存在「程序员」这种职业了,因为只要会说话,人人都会具备程序员的能力。「未来的编程语言只会剩下两种...【详细内容】
2024-03-11  机器之心Pro    Tags:前端   点击:(9)  评论:(0)  加入收藏
前端开始“锈化”?Vue团队开源JS打包工具:基于Rust、速度极快、尤雨溪主导
Vue 团队已正式开源Rolldown &mdash;&mdash; 基于 Rust 的 JavaScrip 打包工具。Rolldown 是使用 Rust 开发的 Rollup 替代品,它提供与 Rollup 兼容的应用程序接口和插件接口...【详细内容】
2024-03-09  OSC开源社区    Tags:Vue   点击:(11)  评论:(0)  加入收藏
两年前端经验还不会手写Promise?
什么是promise?当我们处理异步操作时,我们经常需要进行一系列的操作,如请求数据、处理数据、渲染UI等。在过去,这些操作通常通过回调函数来处理,但是回调函数嵌套过多会导致代码...【详细内容】
2024-03-07  海燕技术栈  微信公众号  Tags:Promise   点击:(23)  评论:(0)  加入收藏
网站开发中的前端和后端开发有什么区别
前端开发和后端开发都是干什么的?有哪些区别?通俗地讲,前端干的工作是用户可以直接看得见的,而后端开发的工作主要在服务端,用户不太能直接看到。虽然前端开发和后端开发的工作有...【详细内容】
2024-02-21  CarryData    Tags:前端   点击:(31)  评论:(0)  加入收藏
网站程序开发中的前后端分离技术
随着互联网的快速发展和技术的不断创新,传统的网站开发模式已经难以满足日益增长的业务需求。为了提高开发效率、增强系统的可维护性和可扩展性,前后端分离技术逐渐成为了网站...【详细内容】
2024-01-31  网站建设派迪星航    Tags:前后端分离   点击:(23)  评论:(0)  加入收藏
如何优雅的实现前端国际化?
JavaScript 中每个常见问题都有许多成熟的解决方案。当然,国际化 (i18n) 也不例外,有很多成熟的 JavaScript i18n 库可供选择,下面就来分享一些热门的前端国际化库!i18nexti18ne...【详细内容】
2024-01-17  前端充电宝  微信公众号  Tags:前端   点击:(67)  评论:(0)  加入收藏
Vue中Scope是怎么做样式隔离的?
scope样式隔离在 Vue 中,样式隔离是通过 scoped 特性实现的。当在一个组件的 <style> 标签上添加 scoped 特性时,Vue 会自动为这个样式块中的所有选择器添加一个唯一的属性,以...【详细内容】
2024-01-04  海燕技术栈  微信公众号  Tags:Vue   点击:(80)  评论:(0)  加入收藏
vue3中 ref和 reactive的区别 ?
最近有朋友在面试过程中经常被问到这么一个问题,vue3 中的ref 和 reactive的区别在哪里,为什么 要定义两个API 一个 api不能实现 响应式更新吗??带着这个疑问 ,我们 接下来进行逐...【详细内容】
2024-01-03  互联网高级架构师  今日头条  Tags:vue3   点击:(36)  评论:(0)  加入收藏
React18 与 Vue3 全方面对比
1. 编程风格 & 视图风格1.1 编程风格 React 语法少、难度大;Vue 语法多,难度小例如指令:Vue<input v-model="username"/><ul> <li v-for="(item,index) in list" :key="inde...【详细内容】
2024-01-03  爱做梦的程序员  今日头条  Tags:Vue3   点击:(72)  评论:(0)  加入收藏
站内最新
站内热门
站内头条