日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

Vue3 學(xué)習(xí)筆記,如何定義事件以及如何理解響應(yīng)式

來源: 責(zé)編: 時間:2023-12-06 09:19:37 247觀看
導(dǎo)讀如何定義事件在 Vue 中,可以使用 v-on 指令來綁定事件監(jiān)聽器。下面是一個示例,在點擊按鈕時觸發(fā)事件處理程序:<template> <div> <button v-on:click="incrementCounter">{{ counter }}</button> </div></template><

Ej928資訊網(wǎng)——每日最新資訊28at.com

如何定義事件

在 Vue 中,可以使用 v-on 指令來綁定事件監(jiān)聽器。Ej928資訊網(wǎng)——每日最新資訊28at.com

下面是一個示例,在點擊按鈕時觸發(fā)事件處理程序:Ej928資訊網(wǎng)——每日最新資訊28at.com

<template>  <div>    <button v-on:click="incrementCounter">{{ counter }}</button>  </div></template><script>export default {  data() {    return {      counter: 0    }  },  methods: {    incrementCounter() {      this.counter++    }  }}</script>

在上面的例子中,點擊按鈕時會觸發(fā) incrementCounter 方法,然后將計數(shù)器增加 1。Ej928資訊網(wǎng)——每日最新資訊28at.com

還可以使用縮寫語法來綁定事件監(jiān)聽器,如下所示:Ej928資訊網(wǎng)——每日最新資訊28at.com

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

其他常見的監(jiān)聽事件

除了 click 事件之外,Vue.js 中還有許多其他可供監(jiān)聽的事件,還包括:Ej928資訊網(wǎng)——每日最新資訊28at.com

  • input:當(dāng)用戶在輸入框中輸入時觸發(fā)。
  • submit:當(dāng)表單被提交時觸發(fā)。
  • focus:當(dāng)元素獲得焦點時觸發(fā)。
  • blur:當(dāng)元素失去焦點時觸發(fā)。
  • change:當(dāng)元素的值改變時觸發(fā),通常用于 select 和 input[type="checkbox"]。
  • keydown:當(dāng)按下鍵盤上的任意按鍵時觸發(fā)。
  • keyup:當(dāng)松開鍵盤上的任意按鍵時觸發(fā)。
  • mouseenter:當(dāng)鼠標(biāo)指針移動到元素上時觸發(fā)。
  • mouseleave:當(dāng)鼠標(biāo)指針移出元素時觸發(fā)。
  • mousemove:當(dāng)鼠標(biāo)指針在元素上移動時觸發(fā)。
  • mousedown:當(dāng)鼠標(biāo)按鈕被按下時觸發(fā)。
  • mouseup:當(dāng)鼠標(biāo)按鈕被松開時觸發(fā)。

下面針對這些事件,分別配上案例,方便大家進(jìn)行理解Ej928資訊網(wǎng)——每日最新資訊28at.com

1、input事件

當(dāng)用戶在輸入框中輸入時觸發(fā)??梢栽?input 標(biāo)簽上直接綁定 v-on:input 事件,并在事件處理程序中執(zhí)行相應(yīng)的操作Ej928資訊網(wǎng)——每日最新資訊28at.com

<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事件

當(dāng)表單被提交時觸發(fā)。可以在 form 標(biāo)簽上直接綁定 v-on:submit 事件,并在事件處理程序中執(zhí)行相應(yīng)的操作。Ej928資訊網(wǎng)——每日最新資訊28at.com

<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事件

當(dāng)元素獲得焦點時觸發(fā)。可以在元素標(biāo)簽上直接綁定 v-on:focus 事件,并在事件處理程序中執(zhí)行相應(yīng)的操作Ej928資訊網(wǎng)——每日最新資訊28at.com

<template>  <div>    <input v-on:focus="onFocus" placeholder="Enter Something">  </div></template><script>export default {  methods: {    onFocus() {      alert('Input focused!')    }  }}</script>

4、blur事件

當(dāng)元素失去焦點時觸發(fā)??梢栽谠貥?biāo)簽上直接綁定 v-on:blur 事件,并在事件處理程序中執(zhí)行相應(yīng)的操作Ej928資訊網(wǎng)——每日最新資訊28at.com

<template>  <div>    <input v-on:blur="onBlur" placeholder="Enter Something">  </div></template><script>export default {  methods: {    onBlur() {      alert('Input blurred!')    }  }}</script>

5、change事件

當(dāng)元素的值改變時觸發(fā),通常用于 select 和 input[type="checkbox"]。可以在元素標(biāo)簽上直接綁定 v-on:change 事件,并在事件處理程序中執(zhí)行相應(yīng)的操作Ej928資訊網(wǎng)——每日最新資訊28at.com

<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事件

當(dāng)按下鍵盤上的任意按鍵時觸發(fā)??梢栽谠貥?biāo)簽上直接綁定 v-on:keydown 事件,并在事件處理程序中執(zhí)行相應(yīng)的操作Ej928資訊網(wǎng)——每日最新資訊28at.com

<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 事件是在鼠標(biāo)指針移動到元素上方時觸發(fā)。Ej928資訊網(wǎng)——每日最新資訊28at.com

<template>  <div>    <button @mouseenter="mouseEnter">Hover me</button>  </div></template><script>export default {  methods: {    mouseEnter() {      console.log("Mouse entered button");    }  }};</script>

上面的示例中,當(dāng)用戶將鼠標(biāo)移動到按鈕上時,會在控制臺打印 "Mouse entered button" 。Ej928資訊網(wǎng)——每日最新資訊28at.com

由于 mouseleave,mousemove,mousedown,mouseup 這幾個事件都比較類似,這里我就不舉例子進(jìn)行展開介紹了。Ej928資訊網(wǎng)——每日最新資訊28at.com

聊一聊 Vue 的響應(yīng)式

Vue.js 是一個 JavaScript 框架,它采用數(shù)據(jù)驅(qū)動和組件化的思想,通過數(shù)據(jù)響應(yīng)式來更新視圖。Ej928資訊網(wǎng)——每日最新資訊28at.com

數(shù)據(jù)響應(yīng)式是 Vue 的核心機(jī)制之一,它會在 Vue 實例創(chuàng)建時對數(shù)據(jù)進(jìn)行觀察,當(dāng)數(shù)據(jù)發(fā)生變化時自動更新視圖。Ej928資訊網(wǎng)——每日最新資訊28at.com

代碼示例:Ej928資訊網(wǎng)——每日最新資訊28at.com

<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 屬性的值。當(dāng)我們點擊按鈕時,會調(diào)用 changeMessage 方法,改變 message 的值,由于 Vue 采用了數(shù)據(jù)響應(yīng)式,所以會自動更新視圖,使得 p 標(biāo)簽中的文本也變成 “Hello World”。Ej928資訊網(wǎng)——每日最新資訊28at.com

那么如何理解Vue背后的響應(yīng)式邏輯呢?Ej928資訊網(wǎng)——每日最新資訊28at.com

當(dāng)我們在 Vue 實例中定義了 data 屬性時,Vue 會對這些數(shù)據(jù)進(jìn)行觀察。當(dāng)我們給 data 中的屬性賦值時,Vue 會自動觸發(fā) setter,并在 setter 中進(jìn)行依賴收集和派發(fā)更新。Ej928資訊網(wǎng)——每日最新資訊28at.com

依賴收集是 Vue 實現(xiàn)數(shù)據(jù)響應(yīng)式的關(guān)鍵。當(dāng)我們在模板中使用了某個數(shù)據(jù),Vue 會在渲染過程中自動為這個數(shù)據(jù)建立一個依賴,并將其加入到相應(yīng)的依賴收集器中。當(dāng)數(shù)據(jù)發(fā)生變化時,Vue 會根據(jù)依賴收集器中的依賴關(guān)系,自動更新相應(yīng)的視圖。Ej928資訊網(wǎng)——每日最新資訊28at.com

在上面的代碼中,我們在模板中使用了 {{ message }} 來渲染 message 屬性的值,Vue 會在渲染過程中自動將 {{ message }} 與 message 屬性建立依賴關(guān)系。當(dāng)我們點擊按鈕時,會調(diào)用 changeMessage 方法,改變 message 的值,Vue 會根據(jù)依賴關(guān)系,自動更新 {{ message }} 所在的視圖。Ej928資訊網(wǎng)——每日最新資訊28at.com

數(shù)據(jù)響應(yīng)式系統(tǒng)是 Vue.js 數(shù)據(jù)驅(qū)動視圖的基礎(chǔ),它能使得 Vue.js 具有高度的可維護(hù)性和可擴(kuò)展性。Ej928資訊網(wǎng)——每日最新資訊28at.com

延伸閱讀:Vue2 底層響應(yīng)式實現(xiàn)邏輯

也許你會好奇,Vue 是如何實現(xiàn)響應(yīng)式的,那么我們先簡單的聊聊 Vue2 底層的代碼是如何實現(xiàn)響應(yīng)式的,感興趣的可以了解下。Ej928資訊網(wǎng)——每日最新資訊28at.com

Vue 的響應(yīng)式系統(tǒng)的實現(xiàn)主要基于 Object.defineProperty() 這個 JavaScript 內(nèi)置函數(shù)。在創(chuàng)建 Vue 實例時,Vue 會遍歷 data 選項中的所有屬性,使用 Object.defineProperty() 為它們定義 getter 和 setter。Ej928資訊網(wǎng)——每日最新資訊28at.com

在這里介紹一下Object.defineProperty的用法:Ej928資訊網(wǎng)——每日最新資訊28at.com

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

Object.defineProperty() 函數(shù)接受三個參數(shù):對象、屬性名、屬性描述符。屬性描述符是一個對象,可以設(shè)置屬性的一些特性,如 value、writable、configurable、enumerable 等。Ej928資訊網(wǎng)——每日最新資訊28at.com

Vue 會在每個響應(yīng)式屬性上定義一個 getter 和一個 setter,來攔截對該屬性的讀寫操作。當(dāng)獲取屬性值時,調(diào)用的是 getter;當(dāng)修改屬性值時,調(diào)用的是 setter。Ej928資訊網(wǎng)——每日最新資訊28at.com

Vue 的 setter 中會對新值進(jìn)行檢測,如果發(fā)現(xiàn)新值和舊值不一樣,就會觸發(fā)相應(yīng)的更新操作。Ej928資訊網(wǎng)——每日最新資訊28at.com

Vue 使用了一個叫做 Dep 的依賴管理器,來維護(hù)響應(yīng)式數(shù)據(jù)與視圖更新之間的關(guān)系。Dep 類負(fù)責(zé)維護(hù)一個依賴列表,其中包含了所有讀取該屬性的 Watcher。當(dāng) setter 被調(diào)用時,會觸發(fā) Dep 的 notify() 方法,通知所有 Watcher 更新。Ej928資訊網(wǎng)——每日最新資訊28at.com

Watcher 的作用是監(jiān)聽響應(yīng)式數(shù)據(jù)的變化,并觸發(fā)視圖更新。它是 Vue 中重要的組成部分之一。Ej928資訊網(wǎng)——每日最新資訊28at.com

在 Vue 中,視圖和響應(yīng)式數(shù)據(jù)是一一對應(yīng)的,每個響應(yīng)式數(shù)據(jù)都對應(yīng)著一個或多個 Watcher。當(dāng)響應(yīng)式數(shù)據(jù)發(fā)生變化時,Watcher 會被觸發(fā),從而更新視圖。Ej928資訊網(wǎng)——每日最新資訊28at.com

Watcher 的實現(xiàn)細(xì)節(jié)較為復(fù)雜,但大致流程如下:Ej928資訊網(wǎng)——每日最新資訊28at.com

  • 在 Vue 實例創(chuàng)建時,為每個視圖綁定的響應(yīng)式數(shù)據(jù)創(chuàng)建一個 Watcher。
  • Watcher 會在它所監(jiān)聽的響應(yīng)式數(shù)據(jù)上注冊一個 Dep。
  • 當(dāng)響應(yīng)式數(shù)據(jù)發(fā)生變化時,會觸發(fā) Dep 的 notify() 方法,從而通知所有 Watcher 更新。
  • Watcher 會調(diào)用自己的 update() 方法更新視圖。

Watcher 的實現(xiàn)細(xì)節(jié)較為復(fù)雜,下面是一個簡化版的 Watcher 類的示例代碼,幫助理解其實現(xiàn)原理:Ej928資訊網(wǎng)——每日最新資訊28at.com

class Watcher {  constructor(vm, key, cb) {    this.vm = vm    this.key = key    this.cb = cb    // 將當(dāng)前 Watcher 實例指向 Dep.target    // 這樣 Dep 就能夠收集到這個 Watcher    Dep.target = this    this.vm[this.key] // 觸發(fā) getter,收集依賴    Dep.target = null  }  update() {    this.cb.call(this.vm, this.vm[this.key])  }}

這個例子中,Watcher 類包含了三個屬性:vm、key、cb。vm 是 Vue 實例,key 是響應(yīng)式數(shù)據(jù)的名稱,cb 是更新視圖的回調(diào)函數(shù)。Ej928資訊網(wǎng)——每日最新資訊28at.com

在構(gòu)造函數(shù)中,Watcher 會將自己設(shè)置為 Dep.target,并讀取 vm[key]。這樣,在 vm[key] 的 getter 中就能夠收集到這個 Watcher。Ej928資訊網(wǎng)——每日最新資訊28at.com

update() 方法會在響應(yīng)式數(shù)據(jù)發(fā)生變化時被調(diào)用,更新視圖。Ej928資訊網(wǎng)——每日最新資訊28at.com

Watcher 類還包含其他一些方法,如 addDep()、depend()等,用于維護(hù)與 Dep 之間的關(guān)系,可以參考 Vue 源碼來了解這些方法的具體實現(xiàn)。Ej928資訊網(wǎng)——每日最新資訊28at.com

希望這些資料能夠幫助您更好的理解 Vue 的響應(yīng)式系統(tǒng)的實現(xiàn)。Ej928資訊網(wǎng)——每日最新資訊28at.com

延伸閱讀:Vue3 響應(yīng)式的實現(xiàn)邏輯

Vue 3 的響應(yīng)式系統(tǒng)與 Vue 2 的響應(yīng)式系統(tǒng)有一些不同之處。Ej928資訊網(wǎng)——每日最新資訊28at.com

Vue 3 引入了一種新的響應(yīng)式實現(xiàn)方式,叫做 "Proxy based observation"。它使用了 JavaScript 內(nèi)置的 Proxy 對象來實現(xiàn)響應(yīng)式,而不再使用 Object.defineProperty()。Ej928資訊網(wǎng)——每日最新資訊28at.com

使用 Proxy 對象可以更簡單地實現(xiàn)響應(yīng)式,并且性能更優(yōu),代碼實現(xiàn)更簡潔。Ej928資訊網(wǎng)——每日最新資訊28at.com

舉個例子,在 Vue 2 中,我們可以這樣創(chuàng)建一個響應(yīng)式對象:Ej928資訊網(wǎng)——每日最新資訊28at.com

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 中,我們可以這樣創(chuàng)建響應(yīng)式對象:Ej928資訊網(wǎng)——每日最新資訊28at.com

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"的新概念,用于描述一組可響應(yīng)數(shù)據(jù),而不再依賴于組件實例。這樣可以讓響應(yīng)式系統(tǒng)更加靈活,更易于實現(xiàn)自定義組件。Ej928資訊網(wǎng)——每日最新資訊28at.com

總的來說, Vue 3 的響應(yīng)式系統(tǒng)使用了 JavaScript 內(nèi)置的 Proxy 對象,并引入了新的 reactivity 概念,提高了響應(yīng)式系統(tǒng)的靈活性和性能。在 Vue 3 中,每個組件實例都有自己的響應(yīng)式系統(tǒng),而不再像 Vue 2 中那樣共用一個全局的響應(yīng)式系統(tǒng)。這樣可以更好地支持復(fù)雜的組件結(jié)構(gòu)和高性能的響應(yīng)式系統(tǒng)。Ej928資訊網(wǎng)——每日最新資訊28at.com

另外,Vue 3 中的響應(yīng)式系統(tǒng)還支持對 Map 和 Set 等新的數(shù)據(jù)類型的響應(yīng)式,這在 Vue 2 中是不支持的。Ej928資訊網(wǎng)——每日最新資訊28at.com

在 Vue 3 中,響應(yīng)式系統(tǒng)與虛擬 DOM 結(jié)合更緊密,更易于實現(xiàn)高性能的組件。Vue 3 中還引入了新的 Composition API,可以更靈活地編寫組件,更好地復(fù)用和組合組件邏輯。Ej928資訊網(wǎng)——每日最新資訊28at.com

總之,Vue 3 的響應(yīng)式系統(tǒng)是基于 JavaScript 內(nèi)置的 Proxy 對象實現(xiàn),更加靈活高效,并支持新的數(shù)據(jù)類型和更好的組件編寫方式。Ej928資訊網(wǎng)——每日最新資訊28at.com

結(jié)束

今天的分享就到這里,本篇文章我們一起學(xué)習(xí)了如何在 Vue 中定義事件 ,并且介紹了常用的事件。以及什么是響應(yīng)式,以及 Vue 底層是如何實現(xiàn)響應(yīng)式的,并對 Vue2 和 Vue3 的實現(xiàn)方式和差異進(jìn)行了介紹。下一篇文章,我將繼續(xù)介紹 Vue 其他方面的相關(guān)內(nèi)容,比如計算屬性 Computed 和 Watch 屬性,敬請期待。Ej928資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-38519-0.htmlVue3 學(xué)習(xí)筆記,如何定義事件以及如何理解響應(yīng)式

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 2023年震撼,Java地位搖搖欲墜?在TIOBE排行榜滑坡至歷史最低!

下一篇: .NET Core的中間件來對Web API進(jìn)行流量限制實現(xiàn)方法

標(biāo)簽:
  • 熱門焦點
  • Find N3入網(wǎng):最高支持16+1TB

    OPPO將于近期登場的Find N3折疊屏目前已經(jīng)正式入網(wǎng),型號為PHN110。本次Find N3在外觀方面相比前兩代有很大的變化,不再是小號的橫向折疊屏,而是跟別的廠商一樣采用了較為常見的
  • 鴻蒙OS 4.0公測機(jī)型公布:甚至連nova6都支持

    華為全新的HarmonyOS 4.0操作系統(tǒng)將于今天下午正式登場,官方在發(fā)布會之前也已經(jīng)正式給出了可升級的機(jī)型產(chǎn)品,這意味著這些機(jī)型會率先支持升級享用。這次的HarmonyOS 4.0支持
  • 從 Pulsar Client 的原理到它的監(jiān)控面板

    背景前段時間業(yè)務(wù)團(tuán)隊偶爾會碰到一些 Pulsar 使用的問題,比如消息阻塞不消費了、生產(chǎn)者消息發(fā)送緩慢等各種問題。雖然我們有個監(jiān)控頁面可以根據(jù) topic 維度查看他的發(fā)送狀態(tài),
  • 讓我們一起聊聊文件的操作

    文件【1】文件是什么?文件是保存數(shù)據(jù)的地方,是數(shù)據(jù)源的一種,比如大家經(jīng)常使用的word文檔、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存數(shù)據(jù),它既可以保
  • Python異步IO編程的進(jìn)程/線程通信實現(xiàn)

    這篇文章再講3種方式,同時講4中進(jìn)程間通信的方式一、 Python 中線程間通信的實現(xiàn)方式共享變量共享變量是多個線程可以共同訪問的變量。在Python中,可以使用threading模塊中的L
  • 當(dāng)家的盒馬,加速謀生

    來源 | 價值星球Planet作者 | 歸去來自己&ldquo;當(dāng)家&rdquo;的盒馬,開始加速謀生了。據(jù)盒馬官微消息,盒馬計劃今年開放生鮮供應(yīng)鏈,將其生鮮商品送往食堂。目前,盒馬在上海已經(jīng)與
  • OPPO K11搭載長壽版100W超級閃充:26分鐘充滿100%

    據(jù)此前官方宣布,OPPO將于7月25日也就是今天下午14:30舉辦新品發(fā)布會,屆時全新的OPPO K11將正式與大家見面,將主打旗艦影像,和同檔位競品相比,其最大的賣
  • 榮耀Magicbook V 14 2021曙光藍(lán)版本正式開售,擁有觸摸屏

    榮耀 Magicbook V 14 2021 曙光藍(lán)版本正式開售,搭載 i7-11390H 處理器與 MX450 顯卡,配備 16GB 內(nèi)存與 512GB SSD,重 1.48kg,厚 14.5mm,具有 1.5mm 鍵盤鍵程、
  • 利用職權(quán)私自解除被封帳號 Meta開除20多名員工

    11月18日消息,據(jù)外媒援引知情人士表示,過去一年時間內(nèi),F(xiàn)acebook母公司Meta解雇或處罰了20多名員工以及合同工,指控這些人通過內(nèi)部系統(tǒng)以不當(dāng)方式重置用戶帳號,其
Top 主站蜘蛛池模板: 县级市| 山丹县| 长沙市| 姜堰市| 灌阳县| 宁乡县| 哈密市| 临夏市| 含山县| 嘉黎县| 乌拉特中旗| 平远县| 井研县| 门源| 永和县| 白山市| 左权县| 昔阳县| 海城市| 革吉县| 内江市| 平阳县| 桑植县| 南城县| 广元市| 萍乡市| 民乐县| 宜阳县| 永济市| 新郑市| 三都| 邹平县| 都安| 高唐县| 延川县| 凌海市| 西吉县| 承德市| 济源市| 南靖县| 册亨县|