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)擊操作,如果沒有事單擊,如果有就是雙擊。
render() {
return <div>
<button onTouchStart={this.touchstart}
onTouchMove={this.touchmove}
onTouchEnd={this.touchend}>
提交
</button>
</div>;
}
解決方案一:?jiǎn)问种甘录P?/h3>
在觸摸屏設(shè)備上,單手指事件模型主要通過 touch 相關(guān)的事件來處理。以下是常見的觸摸事件:
touchstart:當(dāng)手指觸摸屏幕時(shí)觸發(fā)。可以用來記錄觸摸的開始位置。
touchmove:手指在屏幕上滑動(dòng)時(shí)觸發(fā)??梢杂脕碜粉櫴种傅囊苿?dòng)位置。
touchend:手指從屏幕上離開時(shí)觸發(fā)。可以用來處理觸摸結(jié)束后的邏輯。
touchcancel:當(dāng)觸摸事件被系統(tǒng)打斷時(shí)觸發(fā),例如,設(shè)備出現(xiàn)電話、通知等中斷時(shí)。
模擬點(diǎn)擊效果,可以監(jiān)聽 touchstart 和 touchend 事件。通過判斷觸摸的起始位置和結(jié)束位置,確定是否是點(diǎn)擊操作。如果在一定時(shí)間內(nè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;
}
};
// 手指離開:根據(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;
// 說明觸發(fā)了點(diǎn)擊操作
console.log('點(diǎn)擊了按鈕');
};
}
解決方案二:fastclick(已過時(shí),仍可用)
使用fastclick插件解決移動(dòng)端使用click事件的300ms延遲問題,在入口文件導(dǎo)入。注意:可能與其他庫或框架沖突
import FastClick from "fastclick" FastClick.attach(document.body)
handle = ()=>{
....
}
render() {
return <div>
<button onClick={this.handle}>
提交
</button>
</div>;
}
解決方案三:CSS touch-action屬性
touch-action 屬性允許開發(fā)者控制瀏覽器對(duì)觸摸手勢(shì)的默認(rèn)行為。 將 touch-action 設(shè)置為none可以阻止瀏覽器對(duì)觸摸事件的默認(rèn)處理,包括雙擊縮放,從而消除 300ms 延遲。
循環(huán)事件綁定
在React中,我們給循環(huán)「創(chuàng)建」的元素做“循環(huán)事件綁定”,是好還是不好?按常理來說,此類需求用事件委托處理是最好的,但是在React 中,我們循環(huán)給元素綁定的合成事件本身就是基于事件委托處理的,所以無需我們自己再單獨(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)文章
React中super()和super(props)的區(qū)別小結(jié)
本文主要介紹了React中super()和super(props)的區(qū)別小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-03-03
詳解React中錯(cuò)誤邊界的原理實(shí)現(xiàn)與應(yīng)用
在React中,錯(cuò)誤邊界是一種特殊的組件,用于捕獲其子組件樹中發(fā)生的JavaScript錯(cuò)誤,并防止這些錯(cuò)誤冒泡至更高層,導(dǎo)致整個(gè)應(yīng)用崩潰,下面我們就來看看它的具體應(yīng)用吧2024-03-03
react-router-dom6(對(duì)比?router5)快速入門指南
這篇文章主要介紹了快速上手react-router-dom6(對(duì)比?router5),通過本文學(xué)習(xí)最新的react-router-dom?v6版本的路由知識(shí),并且會(huì)與v5老版本進(jìn)行一些對(duì)比,需要的朋友可以參考下2022-08-08
react?echarts?tree樹圖搜索展開功能示例詳解
這篇文章主要為大家介紹了react?echarts?tree樹圖搜索展開功能示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
react Input組件Compositionstart和Compositionend事件
這篇文章主要為大家介紹了Compositionstart和Compositionend事件之于react組件庫Input組件的坑解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
使用react-virtualized實(shí)現(xiàn)圖片動(dòng)態(tài)高度長(zhǎng)列表的問題
一般我們?cè)趯憆eact項(xiàng)目中,同時(shí)渲染很多dom節(jié)點(diǎn),會(huì)造成頁面卡頓, 空白的情況。為了解決這個(gè)問題,今天小編給大家分享一篇教程關(guān)于react-virtualized實(shí)現(xiàn)圖片動(dòng)態(tài)高度長(zhǎng)列表的問題,感興趣的朋友跟隨小編一起看看吧2021-05-05

