React?事件綁定的最佳實(shí)踐
事件綁定
移動(dòng)端的click會(huì)存在300ms延遲,移動(dòng)端的click是點(diǎn)擊事件,PC端的click是點(diǎn)擊。
比如連著點(diǎn)擊兩下:
- PC會(huì)觸發(fā):兩次click、一次dbclick
- 移動(dòng)端:不回觸發(fā)click、只會(huì)觸發(fā)dbclick
點(diǎn)擊事件:第一次點(diǎn)擊后,檢測(cè)300ms,看看會(huì)不會(huì)有第二次點(diǎn)擊操作,如果沒(méi)有事單擊,如果有就是雙擊。
render() { return <div> <button onTouchStart={this.touchstart} onTouchMove={this.touchmove} onTouchEnd={this.touchend}> 提交 </button> </div>; }
解決方案一:?jiǎn)问种甘录P?/h3>
在觸摸屏設(shè)備上,單手指事件模型主要通過(guò) touch 相關(guān)的事件來(lái)處理。以下是常見(jiàn)的觸摸事件:
touchstart:當(dāng)手指觸摸屏幕時(shí)觸發(fā)??梢杂脕?lái)記錄觸摸的開(kāi)始位置。
touchmove:手指在屏幕上滑動(dòng)時(shí)觸發(fā)??梢杂脕?lái)追蹤手指的移動(dòng)位置。
touchend:手指從屏幕上離開(kāi)時(shí)觸發(fā)??梢杂脕?lái)處理觸摸結(jié)束后的邏輯。
touchcancel:當(dāng)觸摸事件被系統(tǒng)打斷時(shí)觸發(fā),例如,設(shè)備出現(xiàn)電話、通知等中斷時(shí)。
模擬點(diǎn)擊效果,可以監(jiān)聽(tīng) touchstart 和 touchend 事件。通過(guò)判斷觸摸的起始位置和結(jié)束位置,確定是否是點(diǎn)擊操作。如果在一定時(shí)間內(nèi)沒(méi)有滑動(dòng),并且觸摸的起始和結(jié)束位置幾乎相同,則可以認(rèn)為是一個(gè)點(diǎn)擊。
class Demo extends React.Component { // 手指按下:記錄手指的起始坐標(biāo) touchstart = (ev) => { console.log('startstartstartstartstart') let finger = ev.changedTouches[0]; //記錄了操作手指的相關(guān)信息 this.touchStartTime = Date.now(); this.touch = { startX: finger.pageX, startY: finger.pageY, isMove: false }; }; // 手指移動(dòng):記錄手指偏移值,和誤差值做對(duì)比,分析出是否發(fā)生移動(dòng) touchmove = (ev) => { console.log('movemovemovemove') let finger = ev.changedTouches[0], { startX, startY } = this.touch; let changeX = finger.pageX - startX, changeY = finger.pageY - startY; if (Math.abs(changeX) > 10 || Math.abs(changeY) > 10) { this.touch.isMove = true; } }; // 手指離開(kāi):根據(jù)isMove判斷是否是點(diǎn)擊 touchend = () => { console.log('endddddd') this.touchEndTime = Date.now(); console.log(this.touch.isMove, 'this.touch.isMove') // 點(diǎn)擊操作時(shí)間是否小于300ms if (this.touchEndTime - this.touchStartTime < 300) { this.touch.isMove = false; } let { isMove } = this.touch; if (isMove) return; // 說(shuō)明觸發(fā)了點(diǎn)擊操作 console.log('點(diǎn)擊了按鈕'); }; }
解決方案二:fastclick(已過(guò)時(shí),仍可用)
使用fastclick
插件解決移動(dòng)端使用click事件的300ms延遲問(wèn)題,在入口文件導(dǎo)入。注意:可能與其他庫(kù)或框架沖突
import FastClick from "fastclick" FastClick.attach(document.body)
handle = ()=>{ .... } render() { return <div> <button onClick={this.handle}> 提交 </button> </div>; }
解決方案三:CSS touch-action屬性
touch-action
屬性允許開(kāi)發(fā)者控制瀏覽器對(duì)觸摸手勢(shì)的默認(rèn)行為。 將 touch-action
設(shè)置為none
可以阻止瀏覽器對(duì)觸摸事件的默認(rèn)處理,包括雙擊縮放,從而消除 300ms 延遲。
循環(huán)事件綁定
在React中,我們給循環(huán)「創(chuàng)建」的元素做“循環(huán)事件綁定”,是好還是不好?按常理來(lái)說(shuō),此類(lèi)需求用事件委托處理是最好的,但是在React 中,我們循環(huán)給元素綁定的合成事件本身就是基于事件委托處理的
,所以無(wú)需我們自己再單獨(dú)的設(shè)置事件委托的處理機(jī)制
class Demo extends React.Component { state = { arr: [{ id: 1, title: '新聞' }, { id: 2, title: '體育' }, { id: 3, title: '電影' }] }; handle = (item) => { // item:點(diǎn)擊這一項(xiàng)的數(shù)據(jù) console.log('我點(diǎn)擊的是:' + item.title); }; render() { let { arr } = this.state; return <div> {arr.map(item => { let { id, title } = item; return <span key={id} style={{ padding: '5px 15px', marginRight: 10, border: '1px solid #DDD', cursor: 'pointer' }} onClick={this.handle.bind(this, item)}> {title} </span>; })} </div>; } }
在vue中,給當(dāng)前元素添加事件綁定就是給給它做事件綁定,我們可以給它父級(jí)元素做事件委托
,根據(jù)事件源判斷點(diǎn)擊的是哪一個(gè)
<template> <div class="list-container" @click="handleClick"> <div class="item" v-for="(item, index) in items" :key="index"> {{ item }} </div> </div> </template> <script> export default { data() { return { items: ['Item 1', 'Item 2', 'Item 3', 'Item 4'] }; }, methods: { handleClick(event) { // 獲取事件源 const clickedElement = event.target; // 判斷點(diǎn)擊的是哪個(gè)子元素(例如列表項(xiàng)) if (clickedElement && clickedElement.classList.contains('item')) { // 獲取點(diǎn)擊的列表項(xiàng)的文本內(nèi)容 const clickedItem = clickedElement.textContent; console.log(`點(diǎn)擊了: ${clickedItem}`); } } } } </script>
到此這篇關(guān)于React 事件綁定的最佳實(shí)踐的文章就介紹到這了,更多相關(guān)React 事件綁定內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決配置setupProxy.js代理,頁(yè)面報(bào)錯(cuò)404問(wèn)題
這篇文章主要介紹了解決配置setupProxy.js代理,頁(yè)面報(bào)錯(cuò)404問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07React不使用requestIdleCallback實(shí)現(xiàn)調(diào)度原理解析
這篇文章主要為大家介紹了React不使用requestIdleCallback實(shí)現(xiàn)調(diào)度原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11React+Antd修改Table組件滾動(dòng)條樣式的操作代碼
這篇文章主要介紹了React+Antd修改Table組件滾動(dòng)條樣式的操作代碼,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-12-12react-redux多個(gè)組件數(shù)據(jù)共享的方法
這篇文章主要介紹了react-redux多個(gè)組件數(shù)據(jù)共享的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08react路由基礎(chǔ)解讀(Router、Link和Route)
這篇文章主要介紹了react路由基礎(chǔ)解讀(Router、Link和Route),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07