最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React?事件綁定的最佳實(shí)踐

 更新時(shí)間:2025年03月21日 10:10:57   作者:不叫貓先生  
本文主要介紹了移動(dòng)端點(diǎn)擊事件的300ms延遲問題,并詳細(xì)的介紹了三種解決方法,具有一定的參考價(jià)值,感興趣的可以了解一下

事件綁定

移動(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)入。注意:可能與其他庫(kù)或框架沖突

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 項(xiàng)目中優(yōu)雅實(shí)現(xiàn)新用戶引導(dǎo)HagiCode 的 driver.js 實(shí)踐指南

    在 React 項(xiàng)目中優(yōu)雅實(shí)現(xiàn)新用戶引導(dǎo)HagiCode 的 driver.js

    本文介紹了在HagiCode項(xiàng)目中使用driver.js實(shí)現(xiàn)新用戶引導(dǎo)的經(jīng)驗(yàn),通過輕量級(jí)、簡(jiǎn)潔API和靈活配置,配合狀態(tài)管理、目標(biāo)元素定位和動(dòng)態(tài)導(dǎo)入等技術(shù)手段,實(shí)現(xiàn)精準(zhǔn)的用戶引導(dǎo),旨在幫助新用戶快速理解產(chǎn)品工作流,并提高用戶體驗(yàn),感興趣的朋友跟隨小編一起看看吧
    2026-04-04
  • ReactNative頁(yè)面跳轉(zhuǎn)Navigator實(shí)現(xiàn)的示例代碼

    ReactNative頁(yè)面跳轉(zhuǎn)Navigator實(shí)現(xiàn)的示例代碼

    本篇文章主要介紹了ReactNative頁(yè)面跳轉(zhuǎn)Navigator實(shí)現(xiàn)的示例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下
    2017-08-08
  • 詳解React中Fragment的簡(jiǎn)單使用

    詳解React中Fragment的簡(jiǎn)單使用

    這篇文章主要介紹了詳解React中Fragment的簡(jiǎn)單使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)我們學(xué)習(xí)React有一定的幫助,感興趣的小伙伴們可以參考一下
    2022-10-10
  • 使用React代碼動(dòng)態(tài)生成柵格布局的方法

    使用React代碼動(dòng)態(tài)生成柵格布局的方法

    這篇文章主要介紹了使用React簡(jiǎn)短代碼動(dòng)態(tài)生成柵格布局的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • react?native?reanimated實(shí)現(xiàn)動(dòng)畫示例詳解

    react?native?reanimated實(shí)現(xiàn)動(dòng)畫示例詳解

    這篇文章主要為大家介紹了react?native?reanimated實(shí)現(xiàn)動(dòng)畫示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • antd中form表單的wrapperCol和labelCol問題詳解

    antd中form表單的wrapperCol和labelCol問題詳解

    最近學(xué)習(xí)中遇到了些問題,所以給大家總結(jié),下面這篇文章主要給大家介紹了關(guān)于antd中form表單的wrapperCol和labelCol問題的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • React中嵌套組件與被嵌套組件的通信過程

    React中嵌套組件與被嵌套組件的通信過程

    這篇文章主要介紹了React中嵌套組件與被嵌套組件的通信過程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-07-07
  • React狀態(tài)更新的優(yōu)先級(jí)機(jī)制源碼解析

    React狀態(tài)更新的優(yōu)先級(jí)機(jī)制源碼解析

    這篇文章主要為大家介紹了React狀態(tài)更新的優(yōu)先級(jí)機(jī)制源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • 在react中使用windicss的問題

    在react中使用windicss的問題

    這篇文章主要介紹了在react中使用windicss的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • React插槽使用方法

    React插槽使用方法

    本文主要介紹了React插槽使用方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12

最新評(píng)論

南安市| 黑水县| 兴隆县| 舟山市| 靖江市| 白河县| 响水县| 宜宾县| 平乡县| 南京市| 县级市| 友谊县| 南澳县| 丹凤县| 大渡口区| 永平县| 宣武区| 宁海县| 兰考县| 彭州市| 元阳县| 万宁市| 平果县| 醴陵市| 鱼台县| 长武县| 龙里县| 延长县| 宁远县| 常宁市| 军事| 博野县| 包头市| 黑山县| 吴桥县| 邮箱| 五大连池市| 长治市| 大姚县| 鞍山市| 肃北|