成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

react怎么實現滑動

react實現滑動的方法:1、在onTouchStart事件找到touches,根據identifier中記錄新的touch出現;2、在onTouchMove事件中根據identifier來記錄每個touch經過的點的坐標;3、在onTouchEnd事件中,找到結束的touch事件,然后通過結束的touch事件劃過的點來計算要執行的手勢即可。

react怎么實現滑動

本教程操作環境:Windows10系統、react18.0.0版、Dell G3電腦。

react怎么實現滑動?

react 實現左右滑動效果

React 中滑動手勢的實現

react怎么實現滑動

最近做了一點關于react在移動端滑動翻頁的功能。

開始搜索了一下,發現居然沒找到合適的庫,唯一找到了名字叫react-touch的庫,一看,前端世界四五百star===自己擼,而且似乎也不是想要的功能,算了自己寫點吧。

看了下原理,基本就是配合onTouchStart,onTouchMove和onTouchEnd這三個事件,來記錄滑動過的點,然后來計算手勢。

顯然對于多點觸摸,需要找到每個點觸摸的路徑,所以有如下幾步:

  • 在onTouchStart事件找到touches,根據identifier中記錄新的touch出現。

  • 在onTouchMove事件中根據identifier來記錄每個touch經過的點的坐標。

  • 在onTouchEnd事件中,找到結束的touch事件,然后通過結束的touch事件劃過的點來計算要執行的手勢。

對于我來說我只是想要上下滑動的功能那么我就只關注單點觸摸的情況。

接下來準備上代碼。哦,不對,首先要想想要怎么封裝。開始自問自答:

我想用一個單例模式。

是不是使用有點太麻煩了,還要先實例化一下?

那用靜態類?

都js了還要啥靜態類,輸出個字典完事。

那好吧,開始擼吧。

數據部分

const touchData = { touching: false, trace: [] }; // 單點觸摸,所以只要當前在觸摸中,就可以把劃過的點記錄到trace中了 function* idGenerator() {   let start = 0;   while (true) {     yield start;     start += 1;   } } //這個生成器用來生成不同事件回調的id,這樣我們可以注冊不同的回調,然后在不需要的時候刪掉。 const callbacks = {   onSlideUpPage: { generator: idGenerator(), callbacks: {} },   onSlideDownPage: { generator: idGenerator(), callbacks: {} } }; //存儲向上、下換頁的回調函數
登錄后復制

記錄觸摸部分

這里的事件處理的是react的合成事件,并非原生事件。

function onTouchStart(evt) {   if (evt.touches.length !== 1) {     touchData.touching = false;     touchData.trace = [];     return;   }   touchData.touching = true;   touchData.trace = [{ x: evt.touches[0].screenX, y: evt.touches[0].screenY }]; } //在onTouchStart事件,如果是多點觸摸直接清空所有數據。如果是單點觸摸,記錄第一個點,并設置狀態 function onTouchMove(evt) {   if (!touchData.touching) return;   touchData.trace.push({     x: evt.touches[0].screenX,     y: evt.touches[0].screenY   }); } //如果在單點觸摸過程中,持續記錄觸摸的位置。 function onTouchEnd() {   if (!touchData.touching) return;   let trace = touchData.trace;   touchData.touching = false;   touchData.trace = [];   handleTouch(trace);  //判斷touch類型并調用適當回調 } //在觸摸結束事件,中調用handleTouch函數來處理手勢判斷邏輯并執行回調
登錄后復制

handleTouch函數

function handleTouch(trace) {   let start = trace[0];   let end = trace[trace.length - 1];   if (end.y - start.y > 200) {     Object.keys(callbacks.onSlideUpPage.callbacks).map(key =>       callbacks.onSlideUpPage.callbacks[key]()     );      // 向上翻頁   } else if (start.y - end.y > 200) {     Object.keys(callbacks.onSlideDownPage.callbacks).map(key =>       callbacks.onSlideDownPage.callbacks[key]()     );     // 向下翻頁   } }
登錄后復制

在這里我只判斷了向上向下翻頁兩個事件,如果事件達成,則會調用所有注冊到該事件的回調。如果有多個回調可按照需求對回調的執行順序進行調整。這里應該是無序的。

接口部分

function addSlideUpPage(f) {   let key = callbacks.onSlideUpPage.generator.next().value;   callbacks.onSlideUpPage.callbacks[key] = f;   return key; } //注冊向上滑動回調并返回回調id function addSlideDownPage(f) {   let key = callbacks.onSlideDownPage.generator.next().value;   callbacks.onSlideDownPage.callbacks[key] = f;   return key; } //注冊向下滑動回調并返回回調id function removeSlideUpPage(key) {   delete callbacks.onSlideUpPage.callbacks[key]; } //使用回調id刪除向上滑動回調 function removeSlideDownPage(key) {   delete callbacks.onSlideDownPage.callbacks[key]; } //使用回調id刪除向下滑動回調 export default {   onTouchEnd,   onTouchMove,   onTouchStart,   addSlideDownPage,   addSlideUpPage,   removeSlideDownPage,   removeSlideUpPage }; //輸出所有接口函數
登錄后復制

這沒啥說的,就是折麼簡單粗暴。接下來,就在react中使用吧!

在next.js中使用

我使用的next.js+create-next-app。在pages目錄下的_app.js文件中綁定所有touch事件。

//pages/_app.js import App, { Container } from "next/app"; import React from "react"; import withReduxStore from "../redux/with-redux-store"; import { Provider } from "react-redux"; import touch from "../components/touch";  class MyApp extends App {   render() {     const { Component, pageProps, reduxStore } = this.props;     return (       <Container>         <Provider store={reduxStore}>           <div             onTouchEnd={touch.onTouchEnd}             onTouchStart={touch.onTouchStart}             onTouchMove={touch.onTouchMove}           >             <Component {...pageProps} />           </div>  { // 將所有導出的touch事件綁定在最外層的div上 // 這樣就可以全局注冊事件了 }         </Provider>       </Container>     );   } }  export default withReduxStore(MyApp);
登錄后復制

接下來看看如何使用。

import React, {useEffect} from "react"; import touch from "../touch";  const Example = () => {   useEffect(() => {     let key = touch.addSlideDownPage(() => {       console.log("try to slideDownPage!!")     });     return () => {       touch.removeSlideDownPage(key)       // 用完別忘了刪除事件     };   }, []);   return (     <div>This is an example!!</div>   ); };
登錄后復制

在原生react中使用

這個項目使用create-react-app生成的

//src/App.js import React from 'react'; import logo from './logo.svg'; import './App.css'; import touch from "./components/touch";  function App() {   return (     <div className="App"       onTouchEnd={touch.onTouchEnd}       onTouchStart={touch.onTouchStart}       onTouchMove={touch.onTouchMove}     >       <header className="App-header">         <img src={logo} className="App-logo" alt="logo" />         <p>           Edit <code>src/App.js</code> and save to reload.         </p>         <a           className="App-link"           href="https://reactjs.org"           target="_blank"           rel="noopener noreferrer"         >           Learn React         </a>       </header>     </div>   ); }
登錄后復制

結語

如果真的有人仔細看了代碼,可能會有個問題,這個touch.js里的內容除了使用了react的合成事件,然后就沒react什么事了,好像不太常規。

的確是這樣,就沒關react什么事了。解釋就是這些數據不用通過react的state或者redux的state太傳遞,一來是在性能上,一更新redux或者react的state就會觸發react的重新渲染,沒有必要,二就是希望可以全局使用這些接口,所以就并沒有借助react的機制。其實這就像是react所說的uncontrolled components。

最后附上完整的touch.js

//touch.js const touchData = { touching: false, trace: [] };  function* idGenerator() {   let start = 0;   while (true) {     yield start;     start += 1;   } }  const callbacks = {   onSlideUpPage: { generator: idGenerator(), callbacks: {} },   onSlideDownPage: { generator: idGenerator(), callbacks: {} } };  function onTouchStart(evt) {   if (evt.touches.length !== 1) {     touchData.touching = false;     touchData.trace = [];     return;   }   touchData.touching = true;   touchData.trace = [{ x: evt.touches[0].screenX, y: evt.touches[0].screenY }]; } function onTouchMove(evt) {   if (!touchData.touching) return;   touchData.trace.push({     x: evt.touches[0].screenX,     y: evt.touches[0].screenY   }); } function onTouchEnd() {   if (!touchData.touching) return;   let trace = touchData.trace;   touchData.touching = false;   touchData.trace = [];   handleTouch(trace); } function handleTouch(trace) {   let start = trace[0];   let end = trace[trace.length - 1];   if (end.y - start.y > 200) {     Object.keys(callbacks.onSlideUpPage.callbacks).map(key =>       callbacks.onSlideUpPage.callbacks[key]()     );   } else if (start.y - end.y > 200) {     Object.keys(callbacks.onSlideDownPage.callbacks).map(key =>       callbacks.onSlideDownPage.callbacks[key]()     );   } } function addSlideUpPage(f) {   let key = callbacks.onSlideUpPage.generator.next().value;   callbacks.onSlideUpPage.callbacks[key] = f;   return key; } function addSlideDownPage(f) {   let key = callbacks.onSlideDownPage.generator.next().value;   callbacks.onSlideDownPage.callbacks[key] = f;   return key; } function removeSlideUpPage(key) {   delete callbacks.onSlideUpPage.callbacks[key]; } function removeSlideDownPage(key) {   delete callbacks.onSlideDownPage.callbacks[key]; } export default {   onTouchEnd,   onTouchMove,   onTouchStart,   addSlideDownPage,   addSlideUpPage,   removeSlideDownPage,   removeSlideUpPage };
登錄后復制

推薦學習:《react視頻教程》

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
国产精品国产三级国产AV浪潮| 国产成人无码区免费A∨视频网站 国产成人无码免费视频在线 | 亚洲AV韩Av无码色老头| 亚洲AV无码成人精品区百度| 亚洲国产欧美在线人成| 亚洲中文字幕无码久久2020| 51国产偷自视频区视频| 饱满的乳被揉捏玩弄| 国产SM调教视频在线观看| 国产又爽又黄无码无遮挡在线观看| 精JAVAPARSER乱偷| 老头挺进娇妻身体| 人妻AV无码系列一区二区三区| 色欲AV浪潮AV蜜臀AⅤ| 性色AⅤ一区二区三区天美传媒| 亚洲老妈激情一区二区三区| 2019NV天堂香蕉在线观看| 大胆人体艺术视频| 国产制服丝袜在线无码| 久久综合亚洲色一区二区三区| 欧美午夜精品一区二区蜜桃| 天天躁日日躁狠狠躁欧美老妇| 亚洲国产精品久久久久爰| 中文字幕一本性无码| 嗯快点别停舒服好爽受不了了 | 亚洲中文字幕久久精品无码A| 8x8x熟妇一区二区三区| 丰满饥渴老女人HD| 精品国产一区二区三区色欲| 欧美巨大XXXX做受| 无码人妻一区二区三区AV| 一对浑圆的胸乳被揉捏| 被强迫的爱人 电影| 国产亚洲精品A第一页 | 中文字幕在线不卡一区二区 | 236宅宅理论片免费| 丰满少妇猛烈进入无码人妻| 精品成在人线AV无码免费看| 欧美交换配乱婬粗大| 无码熟妇人妻AV| 中国凸偷窥XXXX自由视频| 丰满少妇A级毛片| 久久精品久久精品中文字幕| 日本乱人伦AⅤ精品潮喷| 亚洲国产精品无码中文在线| wwwxxx亚洲| 精东传媒剧国产MV的特点| 人妻丰满熟妇无码区yeezy| 亚洲AV中文无码乱人伦| 啊灬啊灬啊灬快灬高潮少妇| 黑人男女粗大猛烈进出视频| 漂亮人妻被中出中文字幕| 亚洲VA无码VA在线VA天堂| WWW亚洲精品自慰一区二区三| 国内精品久久久久久久久齐齐 | 丰满少妇邻居找我泻火| 巨爆乳中文字幕爆乳区| 铜铜铜铜铜铜铜铜好大免费| 主人调教下贱的烂货| 国产无夜激无码AV毛片| 强CAO出水嗯啊高潮了H漫画| 亚洲精品无码少妇30P| 成人全部免费的A毛片在线看| 久久AV高潮AV无码AV| 他用舌头让我高潮视频| 中文国产成人精品久久| 国产亚洲成AV片在线观看蜜桃 | 波多野结衣加勒比东京热| 久久精品国产99久久久古代| 天堂中文资源在线最新版下载| 中国高清WINDOWS视频软件| 国产精品自在在线午夜| 欧美兽交YOYO| 亚洲中文字幕日本无线码| 国产精品久久久久久无毒不卡| 欧美精品一区二区蜜臀亚洲| 亚洲日韩精品无码专区加勒比海| 国产 麻豆 日韩 欧美 久久| 牛和人交VIDEOS欧美3D| 亚洲免费福利视频| 国产精品18久久久久久麻辣| 欧美午夜成人片在线观看| 亚洲综合无码久久精品综合 | 小宝贝荡货啊用力水湿AⅤ视频| WWWW亚洲熟妇久久久久| 看国产一毛片在线看手机看| 亚洲AV色先锋资源电影网站| 岛国精品一区免费视频在线观看 | 久久久久久人妻一区精品| 小SAO货都湿掉奶头好硬男女| 菠萝蜜视频在线观看入口| 美国ZOOM人与ZOOM| 亚洲欧美国产国产一区二区| 国产麻花豆剧传媒精品MV| 日韩一区二区三区人妻系列| CHINESE树林性BBW| 馒头型B好还是蝴蝶型B| 亚洲色成人WWW永久网站| 国产午夜三级一区二区三| 天堂А√在线地址资源| 变态另类AV手机版天堂| 哦┅┅快┅┅用力啊┅┅| 影音先锋新男人AV资源站| 极品少妇被猛的白浆直喷白浆| 无人区一码二码乱码区别在哪| 地师传人电影在线观看| 人与各种动ZZZ0O0OⅩⅩX| ASS年轻少妇BBWPICS| 免费A级毛片中文字幕| 一二三四免费观看在线中文版| 黑人顶到深处高潮颤抖| 亚洲av无码成人精品区在线观看 | 国产一区二区三区无码免费| 无码国产精品一区二区免费16| 得到超级肉禽系统的小说怎么办| 秋霞午夜久久午夜精品| JAPAN丰满人妻VIDEOS| 浓精喷进老师黑色丝袜| 50岁人妻丰满熟妇ΑV无码区| 两毫米的小洞你却稳稳命中| 一面膜上边一面膜下边53分钟| 久久精品人人做人人爽老司机| 亚洲av中文无码| 极品少妇被猛得白浆直流草莓视频| 亚洲AV无码一区二区三区性色| 国模私密浓毛150p露150p极| 亚洲AV成人无码网站在线| 国产性夜夜春夜夜爽| 洗澡被公强玩好舒服肉欲小说| 国产美女精品自在线拍免费| 小SAO货都湿掉了高H奶头好硬| 国产精品无圣光一区二区| 午夜亚洲AV永久无码精品| 国产午夜无码视频在线观看| 小婷又紧又嫩又窄又多水| 国产亚洲人成A在线V网站| 亚洲AV永久无码精品放毛片一| 狠狠躁日日躁夜夜躁2020| 亚洲欧美日韩中文字幕在线一区| 久久精品第九区免费观看| 永久免费AV网站可以直接看的| 美女裸露双奶头光屁股无遮挡直播| 2019国产情侣超清在线| 欧美午夜精品久久久久免费视 | 亚洲 精品 制服 校园 无码| 韩国三级在线观看完整版| 亚洲色大情网站WWW| 美女露 0的奶头无| WWW国产精品人妻一二三区| 日本水蜜桃身体乳的美白效果| 丰满饥渴老女人HD| 午夜天堂精品久久久久| 狠狠色欧美亚洲综合色| 一本无码人妻在中文字幕免费| 男生把小j放进女人屁股视频狂躁| 办公室爆乳女秘在线观看| 色欲AV无码一区二区人妻| 国产美女mv一区二区竹| 亚洲精品无码专区在线在线播放 | APPSTORE美区免费| 色婷婷五月综合丁香中文字幕| 国产乱人伦AV在线A麻豆| 亚洲熟妇AV综合网五月| 女同学浮乱系列合集| 大JI巴好深好爽又大又粗视频| 午夜成人亚洲理论片在线观看| 精品国产亚洲一区二区三区在线观 | 精品久久久无码人妻字幂| 中文字幕人妻中文AV不卡专区| 人人爽人人操人人精品| 国产精品久久久久永久免费看| 亚洲欧洲AV综合一区二区三区| 免费A级毛片在线播放| 村长你的机巴太粗太长了| 亚洲AV成人一区二区三区在线看| 久久久亚洲欧洲日产国码二区 | 综合无码一区二区三区四区五区 | 亚洲精品无码久久毛片波多野吉衣| 秘密の花园动漫在线| 成年女人毛片免费观看中文| 亚洲AV激情无码专区在线播放| 乱色视频中文字幕| 丁香五月天天综合亚洲| 亚洲国产人成自久久国产| 女同学浮乱系列合集| 国产精品毛片一区内射| 一边下奶一边吃面膜视频讲解| 日本漂亮妈妈7在观有限中子| 国产午夜精品无码| 2023无人区码一码二码三码| 无码精品黑人一区二区三区| 久久久久亚洲国产AV麻豆| 尺码最大的国产SUV| 亚洲丰满多毛XXXⅩ熟妇| 欧美黑人又大又粗XXXX| 国产精品网站在线观看免费传媒| 荫蒂添的好舒服视频囗交| 试看120秒做受小视频免费| 久久人爽人人爽人人片AV| 高潮到不停喷水的免费视频|