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

react如何实现滑动效果

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

react如何实现滑动效果

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

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

react 实现左右滑动效果

数据部分

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

Android如何实现View滑动效果

这篇文章给大家分享的是有关Android如何实现View滑动效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、View的滑动简介View的滑动是Android实现自定义控件的基础,同时在开发中我们也难免会遇到
2023-06-14

iOS如何实现背景滑动效果

这篇文章主要介绍了iOS如何实现背景滑动效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体内容如下第一步、在很多APP中,我们都可以看见那些特效绚丽的滑动选项条,那么如何
2023-06-29

Android如何实现平滑翻动效果

这篇文章给大家分享的是有关Android如何实现平滑翻动效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体内容如下效果1.activity加implementsimplements GestureDetect
2023-06-14

Unity ScrollView如何实现无限滑动效果

小编给大家分享一下Unity ScrollView如何实现无限滑动效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、效果演示二、前言当邮件中有1000封邮件,
2023-06-20

如何用CSS实现平滑滚动效果

如何用CSS实现平滑滚动效果在网页设计与开发中,滚动效果是一种非常常见且炫酷的效果,能够为用户带来更好的体验。而实现平滑滚动效果,可以通过CSS的一些技巧来实现。本文将介绍如何使用CSS来实现平滑滚动效果,并提供具体的代码示例。一、使用锚点
如何用CSS实现平滑滚动效果
2023-11-21

CSS过渡效果:如何实现元素的滑动效果

CSS过渡效果:如何实现元素的滑动效果引言:在网页设计中,元素的动态效果能够提升用户体验,其中滑动效果是一个常见而又受欢迎的过渡效果。通过CSS的过渡属性,我们可以轻松实现元素的滑动动画效果。本文将介绍如何使用CSS过渡属性来实现元素的滑动
CSS过渡效果:如何实现元素的滑动效果
2023-11-21

Android继承ViewGroup如何实现Scroll滑动效果

这篇文章主要介绍Android继承ViewGroup如何实现Scroll滑动效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体如下:extends ViewGroup需要重写onMeasure和onLayout方
2023-05-30

原生JS如何实现滑动按钮效果

小编给大家分享一下原生JS如何实现滑动按钮效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!利用Js制作的滑动按钮的具体代码,供大家参考,具体内容如下首先贴上效果
2023-06-25

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录