我的编程空间,编程开发者的网络收藏夹
学习永远不晚

react怎么实现滑动

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

react怎么实现滑动

react怎么实现滑动

本教程操作环境:Windows10系统、react18.0.0版、Dell G3电脑。

react怎么实现滑动?

react 实现左右滑动效果

React 中滑动手势的实现

35ad8859e3a5ad94b0e23e5210bd91d5.png

最近做了一点关于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生成的

//class="lazy" data-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 class="lazy" data-src={logo} className="App-logo" alt="logo" />
        <p>
          Edit <code>class="lazy" data-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怎么实现滑动的详细内容,更多请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

react怎么实现滑动

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

react怎么实现滑动

react实现滑动的方法:1、在onTouchStart事件找到touches,根据identifier中记录新的touch出现;2、在onTouchMove事件中根据identifier来记录每个touch经过的点的坐标;3、在onTouchEnd事件中,找到结束的touch事件,然后通过结束的touch事件划过的点来计算要执行的手势即可。
2023-05-14

react如何实现滑动效果

今天小编给大家分享一下react如何实现滑动效果的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。react实现滑动的方法:1、
2023-07-04

CSS怎么实现滑动门

小编给大家分享一下CSS怎么实现滑动门,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!所谓的滑动门技术,就是指盒子背景能够自动拉伸以适应不同长度的文本。即当文字增多
2023-06-08

react怎么实现滚动条

react实现滚动条的方法:1、使用“render() {const translateDistancePercentage...}”方式设置滚动条滚动百分比;2、通过“.scrollBar {width: 362px;...}”设置滚动条宽度;3、设置样式为“left: -362px;top: 0px;position: absolute;”即可。
2023-05-14

jquery全屏滑动怎么实现

在现代网站设计中,全屏滑动效果已经成为了越来越流行的一种网页设计趋势。而jQuery作为一种广泛应用的JavaScript库,也提供了一些非常方便实现全屏滑动效果的方法。在本文中,我们将讨论如何使用jQuery实现全屏滑动效果。首先,我们需要准备一些必要的HTML和CSS代码。为了实现全屏滑动效果,我们需要在HTML文档中添加多个页面,每个页面对应一个屏幕的高度。同时,我们需要
2023-05-18

android怎么实现界面滑动

在Android中,可以使用ScrollView、RecyclerView、ViewPager等控件来实现界面滑动。下面分别介绍这些控件的使用方法:1. ScrollView:ScrollView是一个可滚动的View容器,可以用于包裹一组
2023-08-18

vue怎么实现滑动验证条

这篇文章主要介绍“vue怎么实现滑动验证条”,在日常操作中,相信很多人在vue怎么实现滑动验证条问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue怎么实现滑动验证条”的疑惑有所帮助!接下来,请跟着小编一起来
2023-06-29

react怎么实现浮动菜单

react实现浮动菜单的方法:1、利用onMouseOver和onMouseLeave来监听鼠标的变化;2、在样式中设置父类及子类的position值;3、设置父类值为relative,子类值为absolute,并在菜单的css中加入“z-index:999;”;4、通过控制display来控制显示与否即可。
2023-05-14

UniAPP怎么实现tabbar滑动切换

随着移动互联网发展的不断推进,APP应用的开发也越来越受到关注。而在APP开发中,tabbar作为一种常见的页面设计模式,被广泛应用于各类APP中。在这种设计模式中,通常通过点击tabbar进行不同的页面切换。但是对于用户来说,想要快速地浏览不同页面,通过滑动切换可能是更好的选择。而UniAPP作为一款跨平台的开发工具,为我们提供了一种简便的制作tabbar滑动切换的方法。本文
2023-05-14

android怎么实现可以滑动的平滑曲线图

本文小编为大家详细介绍“android怎么实现可以滑动的平滑曲线图”,内容详细,步骤清晰,细节处理妥当,希望这篇“android怎么实现可以滑动的平滑曲线图”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1 att
2023-07-02

Unity怎么实现透视滑动列表

本篇内容主要讲解“Unity怎么实现透视滑动列表”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Unity怎么实现透视滑动列表”吧!本文实例为大家分享了Unity实现透视滑动列表的具体代码,供大家
2023-06-20

vue怎么实现滑动解锁功能

本文小编为大家详细介绍“vue怎么实现滑动解锁功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue怎么实现滑动解锁功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。效果如下话不多说,直接上代码;
2023-06-29

android页面上下滑动怎么实现

要实现Android页面上下滑动,可以使用ScrollView或RecyclerView控件。1. 使用ScrollView控件:在布局文件中,将需要滑动的内容包裹在ScrollView中,并将ScrollView设置为垂直方向滑动。```
2023-09-28

eclipse怎么实现滑动切换页面

要实现滑动切换页面,你可以使用ViewPager组件。下面是一个使用ViewPager实现滑动切换页面的示例代码:首先,在XML布局文件中添加ViewPager组件:在Activity中,获取ViewPager的实例并设置适配器:ViewP
2023-10-23

在WPF中怎么实现平滑滚动

本篇内容介绍了“在WPF中怎么实现平滑滚动”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!WPF实现滚动条还是比较方便的,只要在控件外围加上S
2023-07-02

Android怎么实现菜单左右滑动

在Android中,实现菜单左右滑动可以通过使用ViewPager和Fragment来实现。下面是实现的步骤:1. 在布局文件中,添加一个ViewPager作为菜单容器。```xmlandroid:id="@+id/viewPager"an
2023-09-28

编程热搜

目录