欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2025年03月21日 10:10:57   作者:不叫貓先生  
本文主要介紹了移動(dòng)端點(diǎn)擊事件的300ms延遲問(wèn)題,并詳細(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)擊操作,如果沒(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)題

    這篇文章主要介紹了解決配置setupProxy.js代理,頁(yè)面報(bào)錯(cuò)404問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • React不使用requestIdleCallback實(shí)現(xiàn)調(diào)度原理解析

    React不使用requestIdleCallback實(shí)現(xiàn)調(diào)度原理解析

    這篇文章主要為大家介紹了React不使用requestIdleCallback實(shí)現(xiàn)調(diào)度原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • React組件傳children的方案總結(jié)

    React組件傳children的方案總結(jié)

    自定義組件的時(shí)候往往需要傳 children,由于寫(xiě)法比較多樣,我就總結(jié)了一下,文中有詳細(xì)的總結(jié)內(nèi)容和代碼示例,具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-10-10
  • React中useState的理解和使用案例

    React中useState的理解和使用案例

    Hook是React16.8的新增特性,它可以讓你在不編寫(xiě)class的情況下使用state以及其他的React特性,本文中講解的useState就是React中的其中一個(gè)Hook,這篇文章主要給大家介紹了關(guān)于React中useState理解和使用的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • React組件生命周期詳解

    React組件生命周期詳解

    本篇文章主要介紹了React組件生命周期,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • React+Antd修改Table組件滾動(dòng)條樣式的操作代碼

    React+Antd修改Table組件滾動(dòng)條樣式的操作代碼

    這篇文章主要介紹了React+Antd修改Table組件滾動(dòng)條樣式的操作代碼,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-12-12
  • React路由攔截模式及withRouter示例詳解

    React路由攔截模式及withRouter示例詳解

    這篇文章主要為大家介紹了React路由攔截模式及withRouter示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • react-redux多個(gè)組件數(shù)據(jù)共享的方法

    react-redux多個(gè)組件數(shù)據(jù)共享的方法

    這篇文章主要介紹了react-redux多個(gè)組件數(shù)據(jù)共享的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • react路由基礎(chǔ)解讀(Router、Link和Route)

    react路由基礎(chǔ)解讀(Router、Link和Route)

    這篇文章主要介紹了react路由基礎(chǔ)解讀(Router、Link和Route),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • react-router4 嵌套路由的使用方法

    react-router4 嵌套路由的使用方法

    本篇文章主要介紹了react-router4 嵌套路由的使用方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07

最新評(píng)論