Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >反应可滑动-如何包装一个<tr>?

反应可滑动-如何包装一个<tr>?
EN

Stack Overflow用户
提问于 2018-10-24 05:12:52
回答 2查看 1.1K关注 0票数 1

我在react中构建了自己的Table组件。我想添加更多的配置,比如可滑动行

问题是,所有用于反应可滑动的NPM附加组件都是包装器,将包装我的组件。

tr标记不能由div或任何其他html标记包装,但td除外。

在底线中,我如何使我的行组件(也就是tr)可以滑动?

这是我的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let RowComp = <Row key={index} cols={this.props.cols} row={row} onRowClick={this.onRowClick}/>;

if(this.props.onRowSwipe){
  return (
    <Swipe key={index} onSwipeRight={() => this.props.onRowSwipe(row)}>
      {RowComp}
    </Swipe>
  );
}
return RowComp;

当然,我收到了反应警告,tr不能包装。我能做些什么呢?我怎么才能让我的刷卡?

非常感谢:)

EN

回答 2

Stack Overflow用户

发布于 2018-10-24 06:01:37

我在应用程序中尝试过类似的东西。没有任何本机swipe事件,但是有三个事件可以让您解决问题:onTouchStartonTouchMoveonTouchEnd。下面您可以看到我的一个可滑动菜单的实验性实现:正如您所看到的,我已经在App.js组件中创建了三个函数:handleTouchStarthandleTouchMovehandleTouchEnd

  • handleTouchStart函数接收事件作为支柱,并保存初始的X和Y位置
  • handleTouchMove函数再次接收事件作为支柱,并查找当前和初始位置之间的差异。
  • 最后,handleTouchEnd函数检查X和Y之间的差异,并显示或隐藏菜单。

不幸的是,您无法访问onTouchEnd事件的最后一个位置,这就是为什么您必须使用onTouchMove事件.

,你还得检查一下垂直移动是否发生过。这就是为什么我还检查Y位置之间的差异,但您需要绝对值

如果X差为负值,则表示您向左移动。如果X差是正的,那就意味着你向右移动.。

--您还必须在不同的设备中进行大量测试,以确定初始X位置与最终X位置之间的理想差异

最后,我将函数作为道具传递给组件,并将它们绑定到三个事件。

App.js (父组件)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React, { Component } from "react";
import styled from "styled-components";
import Header from "components/Header";
import Navbar from "components/Navbar";
import SideMenu from "components/SideMenu";
import MainContent from "components/Content";

const AppWrapper = styled.section`
  height: 100vh;
  width: 100vw;
  display: grid;
  grid-template-rows: 70px auto;
  @media (max-width: 884px) {
    grid-template-columns: 60vw auto;
  }
  @media (min-width: 885px) {
    grid-template-columns: 200px auto;
  }
`;

class App extends Component {
  swipe = {
    firstPositionX: null,
    firstPositionY: null,
    positionDifferenceX: null,
    positionDifferenceY: null
  };
  constructor(props) {
    super(props);
    this.state = {
      sideMenuDisplay: window.innerWidth >= 885 ? true : false
      // movement: -60
    };
  }



  componentDidMount() {
    window.addEventListener("resize", this.updateSideMenuDisplay);
  }

  componentWillUnmount() {
    window.removeEventListener("resize", this.updateSideMenuDisplay);
  }

  updateSideMenuDisplay = () => {
    this.setState({ sideMenuDisplay: window.innerWidth >= 885 ? true : false });
  };

  toggleSideMenu = () => {
    this.setState(prevState => ({
      sideMenuDisplay: !prevState.sideMenuDisplay
    }));
  };



  handleTouchStart = e => {
    this.swipe.firstPositionX = e.touches[0].screenX;
    this.swipe.firstPositionY = e.touches[0].screenY;
  };

  handleTouchMove = e => {
    this.swipe.positionDifferenceX =
      e.touches[0].screenX - this.swipe.firstPositionX;
    this.swipe.positionDifferenceY =
      e.touches[0].screenY - this.swipe.firstPositionY;
  };

  handleTouchEnd = () => {
    if (Math.abs(this.swipe.positionDifferenceY) <= 150) {
      this.setState(
        prevState => ({
          sideMenuDisplay:
            prevState.sideMenuDisplay === false
              ? this.swipe.positionDifferenceX > 50
              : !(this.swipe.positionDifferenceX < -50)
        }),
        () => {
          this.swipe.firstPositionX = null;
          this.swipe.positionDifferenceX = null;
          this.swipe.firstPositionY = null;
          this.swipe.positionDifferenceY = null;
        }
      );
    }
  };

  render() {
    const sideMenuDisplay = this.state.sideMenuDisplay;
    return (
      <AppWrapper>
        <Header display={sideMenuDisplay} />
        <Navbar onClick={this.toggleSideMenu} display={sideMenuDisplay} />
        <SideMenu

  }
}

export default App;  display={sideMenuDisplay}
          onTouchStart={this.handleTouchStart}
          onTouchMove={this.handleTouchMove}
          onTouchEnd={this.handleTouchEnd}
        />
        <MainContent
          display={sideMenuDisplay}
          onTouchStart={this.handleTouchStart}
          onTouchMove={this.handleTouchMove}
          onTouchEnd={this.handleTouchEnd}
        />
      </AppWrapper>
    );
  }
}

export default App;

SideMenu.js (子组件)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import React, { Component } from "react";
import SideMenuElement from "./SideMenuElement";
import MembersIcon from "./MembersIcon";
import DashboardIcon from "./DashboardIcon";
import {
  SideMenuSection,
  SideMenuItems,
  SideMenuElementLogo,
  AppMobileLogo
} from "./styles";
import logoIcon from "static/logo@3x.png";

class SideMenu extends Component {
  constructor(props) {
    super(props);
    this.state = { selectedItem: "dashboard" };
  }

  selectItem = item => {
    this.setState({ selectedItem: item });
  };

  render() {
    const selectedItem = this.state.selectedItem;

    return (
      <SideMenuSection
        display={`${this.props.display}`}
        onTouchStart={this.props.onTouchStart}
        onTouchMove={this.props.onTouchMove}
        onTouchEnd={this.props.onTouchEnd}
      >
        <SideMenuItems>
          <SideMenuElementLogo>
            <AppMobileLogo src={logoIcon} alt="App Logo" />
          </SideMenuElementLogo>

          <SideMenuElement
            item="dashboard"
            icon={DashboardIcon}
            selected={selectedItem === "dashboard"}
            onClick={this.selectItem}
          >
            Dashboard
          </SideMenuElement>

          <SideMenuElement
            item="members"
            icon={MembersIcon}
            selected={selectedItem === "members"}
            onClick={this.selectItem}
          >
            Members
          </SideMenuElement>
        </SideMenuItems>
      </SideMenuSection>
    );
  }
}

export default SideMenu;
票数 0
EN

Stack Overflow用户

发布于 2018-10-25 07:00:11

谢谢你的回复。我终于想出来了。我心里想,怎样才能合法地包扎一个tr?

答案是:tbody

我使用了react来用tbody节点包装tr,这一切都像魔术一样没有警告。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import Swipe from 'react-swipe-component';

<Swipe key={index} nodeName="tbody" onSwipeRight={() => this.props.onRowSwipe(row)}>
  {RowComp}
</Swipe>

无论如何,谢谢你的评论:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52969953

复制
相关文章
ClickHouse C++ 如何隐藏/包装一个类
- 当A为一个类的一个成员的时候,可以利用EntryA对A进行封装,进一步进行其他的操作
jasong
2021/10/29
5670
Java 为什么需要包装类,如何使用包装类?
Java 是号称面向对象的语言,所有的类型都是引用类型。 Object 类是所有类的父类,而且是唯一不用指定明确继承的类。但是基本类型如 int 不是引用类型,也不是继承自 Object,所以 Java 需要一个这样的包装类来使其面向对象的完整性。 包装类同时也可以实现可空类型,即一个数值是空的。Java 集合中也只能放入包装类型,而不支持基本类型。
水货程序员
2018/11/13
6.7K0
tr命令
tr命令用于转换或删除文件中的字符,可以读文件也可以从标准输入设备读取数据,经过字符串转译后,将结果输出到标准输出设备。
WindRunnerMax
2021/01/08
1.3K0
如何用 vue 制作一个探探滑动组件
前言 嗨,说起探探想必各位程序汪都不陌生(毕竟妹子很多),能在上面丝滑的翻牌子,探探的的堆叠滑动组件起到了关键的作用,下面就来看看如何用vue写一个探探的堆叠组件。 一、功能分析 简单使用下探探会发现,堆叠滑动的功能很简单,用一张图概括就是: 简单归纳下里面包含的基本功能点: 图片的堆叠 图片第一张的滑动 条件成功后的滑出,条件失败后的回弹 滑出后下一张图片堆叠到顶部 体验优化: 根据触摸点的不同,滑动时首图有不同角度偏移 偏移面积判定是否成功滑出 二、具体实现 有了归纳好的功能点,我们实现组件
前端教程
2018/03/29
3.1K0
如何用 vue 制作一个探探滑动组件
Linux 命令 | tr
此命令将 linyi.txt 文件的内容通过管道符传递给 tr 命令进行转换,转换后的结果输出到终端上。
小林C语言
2023/09/14
2920
Linux 命令 | tr
如何对一个【可执行程序】进行拦截和包装?
Ubuntu 18.04操作系统中,重启指令/sbin/reboot是一个软链接,链接到可执行程序/bin/systemctl,那么是否可以在执行systemctl之前,做一些其它的事情(例如:保持一些应用程序的状态数据)?
IOT物联网小镇
2022/09/26
7620
如何对一个【可执行程序】进行拦截和包装?
如何构建一个反电信网络诈骗基础模型
网络诈骗,电信诈骗层出不穷,花样翻新,防不胜防,伤害普通百姓利益。本文通过对目前社会上关于网络电信诈骗新闻进行提取,从中分析当前网络诈骗发展趋势和关键因素,进而构建合理的反诈骗模型。 1、对关键词分析
FB客服
2018/02/24
1.6K0
如何构建一个反电信网络诈骗基础模型
8.12 tee_tr_split命令
在切割一个文件,在不指定任何的文件名,最后显示的切割完的文件,会是已xab,xac这样一直延续下去,若再切割一次,则会zxaaa,zxaab等依次下去
运维小白
2022/01/06
9430
SAP 如何看某个TR是否传入了Q或者P系统?
执行,看记录里的字段TPSTAT_KEY是否为空,如果不为空,表明已经传入该系统了:
SAP虾客
2021/01/23
7470
手机重力感应可泄露用户身份信息
研究人员发现,智能手机和平板电脑里的加速计只要有一丝不同之处就可以创造出独一无二的重力感应“指纹”,这种指纹可以当成是一个用户的身份,在这个身份上可以绑定用户的浏览记录等隐私信息,如果被广告商获取这种数据,就相当于隐私泄漏。更可怕的是,现在的智能手机都默认应用程序可以不经过用户同意就是用加速计。 加速计除了用来调整手机屏幕的显示方向之外,还被广泛应用在应用程序中,比如说计步器和手机游戏。与此同时,许多应用程序的运营都靠广告,要精准地投放广告就必须追踪用户的行为和他们的爱好
安恒信息
2018/04/11
1K0
Linux之tr命令
原文链接:https://rumenz.com/rumenbiji/linux-tr.html
入门笔记
2021/08/30
1.8K0
Linux之tr命令
原文链接:https://rumenz.com/rumenbiji/linux-tr.html
入门笔记
2022/06/02
1.3K0
Linux之tr命令
原文链接:https://rumenz.com/rumenbiji/linux-tr.html
入门笔记
2022/03/31
1.4K0
自己实现一个滑动窗口
上述计算中的alpha的值是一个0~1之间的常量,aplha值决定了一段时间内的平滑水平,alpha越趋于1,历史值对当前的平均值的影响越大,反之亦然
Meet相识
2018/09/12
1.2K0
一个反直觉的sql
在《容易引起雪崩的两个处理》里,我提到一个慢查询的问题。本文先从整洁架构的角度讲讲慢查询sql完成的功能以及设计,再介绍对sql进行的实施测试现象以及思考。
静儿
2021/11/16
3760
一个反直觉的sql
【Vulnhub】Tr0ll
从这个流量包里面拿到了 ftp 的一组用户名和密码 anonymous/password
yichen
2020/07/01
1.3K0
【Vulnhub】Tr0ll
用 tr 过滤文件
您可以将 tr 看作为 sed 的(极其)简化的变体:它可以用一个字符来替换另一个字符,或者可以完全除去一些字符。您也可以用它来除去重复字符。这就是所有 tr 所能够做的。
一见
2018/08/07
1.2K0
【说站】php包装迭代器如何理解
1、本身也是一个迭代器,当被实例化时,又需要被传递到另一个迭代器内部保存,即内部迭代InnerIterator。
很酷的站长
2022/11/24
4020
【说站】php包装迭代器如何理解
Linux命令(41)——tr命令
tr用来转换或者删除一段文字。tr是translate(转换的缩写),功能的英文示意是:translate or delete characters。tr所有的功能均可由sed来完成,可以将tr视为sed一个极简的实现。
恋喵大鲤鱼
2018/08/03
3.5K0
点击加载更多

相似问题

反应可滑动标签

13

如何在反应可滑动列表中延迟更新反应状态?

28

从材料ui问题中响应可滑动选项卡

20

如何选择包装在<input>中的<tr>?

66

将<td>包装在<tr>中

31
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文