今天小編給大家分享一下react如何實現(xiàn)滑動效果的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
專注于為中小企業(yè)提供成都網(wǎng)站建設、網(wǎng)站制作服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)弋江免費做網(wǎng)站提供優(yōu)質的服務。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了超過千家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設實現(xiàn)規(guī)模擴充和轉變。
react實現(xiàn)滑動的方法:1、在onTouchStart事件找到touches,根據(jù)identifier中記錄新的touch出現(xiàn);2、在onTouchMove事件中根據(jù)identifier來記錄每個touch經(jīng)過的點的坐標;3、在onTouchEnd事件中,找到結束的touch事件,然后通過結束的touch事件劃過的點來計算要執(zhí)行的手勢即可。
react 實現(xiàn)左右滑動效果
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: {} }
};
//存儲向上、下?lián)Q頁的回調函數(shù)
這里的事件處理的是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事件,如果是多點觸摸直接清空所有數(shù)據(jù)。如果是單點觸摸,記錄第一個點,并設置狀態(tài)
function onTouchMove(evt) {
if (!touchData.touching) return;
touchData.trace.push({
x: evt.touches[0].screenX,
y: evt.touches[0].screenY
});
}
//如果在單點觸摸過程中,持續(xù)記錄觸摸的位置。
function onTouchEnd() {
if (!touchData.touching) return;
let trace = touchData.trace;
touchData.touching = false;
touchData.trace = [];
handleTouch(trace); //判斷touch類型并調用適當回調
}
//在觸摸結束事件,中調用handleTouch函數(shù)來處理手勢判斷邏輯并執(zhí)行回調
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]()
);
// 向下翻頁
}
}
在這里我只判斷了向上向下翻頁兩個事件,如果事件達成,則會調用所有注冊到該事件的回調。如果有多個回調可按照需求對回調的執(zhí)行順序進行調整。這里應該是無序的。
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
};
//輸出所有接口函數(shù)
這沒啥說的,就是折麼簡單粗暴。接下來,就在react中使用吧!
我使用的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>
);
};
這個項目使用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什么事了,好像不太常規(guī)。
的確是這樣,就沒關react什么事了。解釋就是這些數(shù)據(jù)不用通過react的state或者redux的state太傳遞,一來是在性能上,一更新redux或者react的state就會觸發(fā)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如何實現(xiàn)滑動效果”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
新聞名稱:react如何實現(xiàn)滑動效果
文章位置:http://aaarwkj.com/article20/pjcejo.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設計、做網(wǎng)站、面包屑導航、微信小程序、網(wǎng)站收錄、響應式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)