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

如何在React?Native開發(fā)中防止滑動過程中的誤觸

 更新時間:2023年05月06日 11:00:25   作者:suwu150  
在使用React?Native開發(fā)的時,當我們快速滑動應用的時候,可能會出現(xiàn)誤觸,導致我們會點擊到頁面中的某一些點擊事件,誤觸導致頁面元素響應從而進行其他操作,表現(xiàn)出非常不好的用戶體驗。

一、問題背景

常見的情形是長列表中,在滑動過程中可能會出現(xiàn)誤觸到列表中的某一項的情形,對于用戶使用非常不好的體驗。

如下列表組件中,就會存在滑動過程中產(chǎn)生誤觸的情況。

import React from 'react';
import { 
  StyleSheet, Text, SafeAreaView,
  ScrollView,  View, TouchableOpacity, StatusBar,
} from 'react-native';
const App = () => {
  const list = Array.from(Array(100).keys());
  const onPress = (e) => {
    alert(1);
  };
  return (
    <SafeAreaView style={styles.container}>
      <ScrollView style={styles.scrollView}>
        {list.map((item) => {
          return (
            <TouchableOpacity onPress={onPress}>
              <View style={styles.containerView}>
                <Text style={styles.text}>{item}+ item</Text>
              </View>
            </TouchableOpacity>
          );
        })}
      </ScrollView>
    </SafeAreaView>
  );
};
const styles = StyleSheet.create({
  container: { flex: 1, paddingTop: StatusBar.currentHeight },
  scrollView: { marginHorizontal: 20 },
  text: { fontSize: 1 },
  containerView: { backgroundColor: 'pink', marginTop: 20, height: 50 },
});
export default App;

上面長列表,在滾動的過程中可能會出現(xiàn)誤觸的問題。

二、解決思路

我們應該如何處理這種情形,可以考慮從點擊事件上入手,考慮根據(jù)距離的移動來進行組織是否響應點擊事件

通過查看官方文檔,我們能夠發(fā)現(xiàn)點擊時間在點擊按下和抬起的過程中有一個過程回調,我們就可以利用這個回調進行處理誤觸了,有興趣的小伙伴可以看看這塊官方說明

由于點擊事件執(zhí)行過程原理

  • onPressIn 在按壓時被調用。
  • onPressOut 在按壓動作結束后被調用。

在按下 onPressIn 后,將會出現(xiàn)如下兩種情況的一種:

用戶移開手指,依次觸發(fā)onPressOut 和onPress事件。

按壓持續(xù) 500 毫秒以上,觸發(fā)onLongPress 事件。(onPressOut 在移開手后依舊會觸發(fā)。)

可以通過監(jiān)聽點擊事件的方式來監(jiān)聽按鈕點擊,那我們來簡單實現(xiàn)一個避免誤觸的方案

其中的核心原理就是點擊事件的整個過程,總結來說就是下面的三個點擊過程

  onPressOut={(event) => {
    const [startX, startY] = [
      event.nativeEvent.pageX,
      event.nativeEvent.pageY,
    ];
    const currentTime = new Date().getTime();
    const shouldReject =
      (Math.abs(pressInPointRef.current.startX - startX) >
        pointDistance ||
        Math.abs(pressInPointRef.current.startY - startY) >
          pointDistance) &&
      (currentTime - pressInTime.current) < pointMinTimeSpace;
    console.log('shouldReject', shouldReject);
    shouldReject && event?.preventDefault?.();
  }}
  onPress={(event) => {
    if (event?.isDefaultPrevented?.()) return;
    onclick && onclick();
  }}
  onPressIn={(event) => {
    pressInPointRef.current.startX = event.nativeEvent.pageX;
    pressInPointRef.current.startY = event.nativeEvent.pageY;
    pressInTime.current = new Date().getTime();
  }}

當發(fā)生觸摸時,通過onPressIn事件記錄位置和獲取事件戳,當指頭觸摸彈起時,通過onPressOut事件記錄并且對比按下時的位置和按下時的時間,是否滿足響應當前點擊的條件,如果不滿足響應,則使用event?.preventDefault?.()阻止其繼續(xù)響應,最后根據(jù)onPress事件中if (event?.isDefaultPrevented?.()) return;判斷該如何響應這次觸摸點擊,這就是整個過程。

pressInTime

調整按壓時間區(qū)間,在按下時和抬起間隔小于該時間,則認為是誤觸,這個和距離區(qū)間(pointDistance)一起確定是否誤觸

pointDistance

調整按下和抬起時之間的距離,在按下時和抬起間隔小于該距離,則認為是誤觸,這個和按壓時間(pressInTime)區(qū)間一起確定是否誤觸

調整顯示組件

其中TouchableOpacity組件可以更換為能夠響應點擊事件的任何組件,下面是官方列出的被引用到的組件,都能夠使用這種方式處理誤觸。

 Button
 PanResponder
 Pressable
 ScrollView
 Text
 TextInput
 TouchableHighlight
 TouchableOpacity
 TouchableNativeFeedback
 TouchableWithoutFeedback
 View

針對以上情況,能夠將其應用到業(yè)務不同的誤觸情況下,下面是整理之后,完整的代碼,根據(jù)以上情況可以再次進行組件封裝,適配自己業(yè)務組件的調整。

const App = () => {
  const list = Array.from(Array(100).keys());
  const pressInPointRef = useRef({ startX: 0, startY: 0 });
  const。pressInTime = useRef(0);
  const pointDistance = 100;
  const pointMinTimeSpace = 1000;
  const onclick = () => {
    console.log('按鈕被點擊...');
    alert('按鈕被點擊...')
  };
  return (
    <SafeAreaView style={styles.container}>
      <ScrollView style={styles.scrollView}>
        {list.map((item) => {
          return (
            <TouchableOpacity
              onPressOut={(event) => {
                const [startX, startY] = [
                  event.nativeEvent.pageX,
                  event.nativeEvent.pageY,
                ];
                const currentTime = new Date().getTime();
                const shouldReject =
                  (Math.abs(pressInPointRef.current.startX - startX) >
                    pointDistance ||
                    Math.abs(pressInPointRef.current.startY - startY) >
                      pointDistance) &&
                  (currentTime - pressInTime.current) < pointMinTimeSpace;
                console.log('shouldReject', shouldReject);
                shouldReject && event?.preventDefault?.();
              }}
              onPress={(event) => {
                if (event?.isDefaultPrevented?.()) return;
                onclick && onclick();
              }}
              onPressIn={(event) => {
                pressInPointRef.current.startX = event.nativeEvent.pageX;
                pressInPointRef.current.startY = event.nativeEvent.pageY;
                pressInTime.current = new Date().getTime();
              }}>
              <View style={styles.containerView}>
                <Text style={styles.text}>{item}+ line</Text>
              </View>
            </TouchableOpacity>
          );
        })}
      </ScrollView>
    </SafeAreaView>
  );
};

三、總結整理

  • 解決這次觸摸,主要是使用點擊事件本身的一個響應機制,在中間通過記錄狀態(tài)值的方式去處理
  • 使用到的方法涉及到按下時、抬起時、按下這三個過程
  • 通用功能組件需要進行封裝,以達到業(yè)務功能上的適配

到此這篇關于如何在React Native開發(fā)中防止滑動過程中的誤觸的文章就介紹到這了,更多相關React Native防止滑動誤觸內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • React之如何在Suspense中優(yōu)雅地請求數(shù)據(jù)

    React之如何在Suspense中優(yōu)雅地請求數(shù)據(jù)

    Suspense 是 React 中的一個組件,直譯過來有懸掛的意思,能夠將其包裹的異步組件掛起,直到組件加載完成后再渲染,本文詳細介紹了如何在Suspense中請求數(shù)據(jù),感興趣的小伙伴可以參考閱讀本文
    2023-04-04
  • 2個奇怪的react寫法

    2個奇怪的react寫法

    大家好,我卡頌。雖然React官網(wǎng)用大量篇幅介紹最佳實踐,但因JSX語法的靈活性,所以總是會出現(xiàn)奇奇怪怪的React寫法。本文介紹2種奇怪(但在某些場景下有意義)的React寫法。也歡迎大家在評論區(qū)討論你遇到過的奇怪寫法
    2023-03-03
  • 一看就懂的ReactJs基礎入門教程-精華版

    一看就懂的ReactJs基礎入門教程-精華版

    現(xiàn)在最熱門的前端框架有AngularJS、React、Bootstrap等。自從接觸了ReactJS,ReactJs的虛擬DOM(Virtual DOM)和組件化的開發(fā)深深的吸引了我,下面來跟我一起領略ReactJs的風采吧~~ 文章有點長,耐心讀完,你會有很大收獲哦
    2021-04-04
  • React.js前端導出Excel的方式

    React.js前端導出Excel的方式

    這篇文章主要為大家介紹了React.js前端導出Excel的方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • JS跨域解決方案react配置反向代理

    JS跨域解決方案react配置反向代理

    這篇文章主要為大家介紹了JS跨域解決方案react配置反向代理的示例內容詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-11-11
  • react中useEffect Hook作用小結

    react中useEffect Hook作用小結

    React中useEffect是一個非常重要的Hook,它允許我們函數(shù)組件中執(zhí)行副作用操作,本文就來介紹一下useEffect Hook作用,具有一定的參考價值,感興趣的可以了解一下
    2024-11-11
  • 詳解React服務端渲染從入門到精通

    詳解React服務端渲染從入門到精通

    這篇文章主要介紹了詳解React服務端渲染從入門到精通,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • 淺談React中組件間抽象

    淺談React中組件間抽象

    這篇文章主要介紹了淺談React中組件間抽象,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • React Native Popup實現(xiàn)示例

    React Native Popup實現(xiàn)示例

    本文主要介紹了React Native Popup實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-05-05
  • React Hook父組件如何獲取子組件的數(shù)據(jù)/函數(shù)

    React Hook父組件如何獲取子組件的數(shù)據(jù)/函數(shù)

    這篇文章主要介紹了React Hook父組件如何獲取子組件的數(shù)據(jù)/函數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09

最新評論

万山特区| 峨眉山市| 历史| 乳山市| 将乐县| 乌兰察布市| 靖江市| 湾仔区| 云龙县| 湖州市| 吴桥县| 龙海市| 监利县| 共和县| 保康县| 榆中县| 永德县| 仪陇县| 玉龙| 清河县| 金沙县| 常州市| 莱州市| 阳原县| 云浮市| 琼中| 永仁县| 环江| 体育| 龙游县| 龙岩市| 泸定县| 定州市| 绵竹市| 县级市| 祁连县| 商南县| 长武县| 奈曼旗| 泸州市| 竹北市|