我对此的react 是相当新的.我目前有一个项目,可以在桌面上正常工作,我正在try 添加移动功能.我正在表格中显示一组对象,我希望用户能够在移动设备上使用touch 来切换表格中对象的位置.

当用户touch 一行时,我们可以说这是原点位置.下一次连续接触一行时,即为目标位置.我想让它工作,这样,它就会在接触到目的地位置时交换起点和目的地.

例如,我有一张桌子:

<table>
    <thead>
      <tr><th>Rank</th></tr>
    </thead>
    <tbody>
      <tr onTouchStart={(e) => handleTouchStart(e, rowObj)}}><td>Object 1</td></tr>
      <tr onTouchStart={(e) => handleTouchStart(e, rowObj)}}><td>Object 2</td></tr>
      <tr onTouchStart={(e) => handleTouchStart(e, rowObj)}}><td>Object 3</td></tr>
    </tbody>
</table>

我希望用户能够交换对象1和对象2在桌子上的位置.

这项预期的功能目前在大多数设备上都可以与Draggable、onDragStart和onDragEnd一起使用,但在移动设备上不能使用.我怀疑这与这里所描述的有关:

Is the react-draggable not support on mobile platform?

我从上面的解决方案中想不出任何东西.

不幸的是,onTouchStart()和onTouchEnd()与onDragStart()和onDragEnd()的工作方式不同.这两种touch 功能都处理相同的对象,并不关心您的touch 在哪里结束.他们只关心你最初touch 的是什么物体.而拖动功能则更简单,因为dragStart与最初的点击交互,而dragEnd与光标结束的位置交互(因此,您只需交换它们).

我想我只能使用onTouchStart,因为onTouchEnd没有帮助,对于上面已经描述的功能(第二段).我让它几乎正常工作,但我遇到了useState()的问题.

我在第一次touch 开始时将第一行设置为useState,假设:

const (origin, setOrigin) = useState({})

const handleTouchStart = (e, rowObj) =>
{
    setOrigin(rowObj)
}

然后,我在handleTouchStart中第二次touch 时将其与rowObj互换,其中:

const handleTouchStart = (e, rowObj) =>
{
    if (origin !== undefined)
    {
        swap(origin, rowObj)
    }
    setOrigin(rowObj)
}

这是第一次奏效.问题是,在交换之后,useState仍然记得一个起源.因此,下一次touch 一行时,它会进行交换,并重复该行为.

因此,它不是: touch ,touch ,交换-touch ,touch ,交换-touch ,touch ,交换

现实: touch ,touch ,交换-touch ,交换-&>touch ,交换

我try 在交换后将原点设置为未定义,但不起作用.当我try 这样做时,掉期本身甚至都没有发生.此外,由于onouch chStart()的工作方式,您不能只有两个useState并交换它们.Onouch chStart()将覆盖这两个useState.

推荐答案

我想通了.看起来有点古怪,可能存在一个更好、更干净、更优化的解决方案.但是,通过执行以下操作,我现在可以让它按预期运行:

创建一个useState,用于保存交换是否发生在上一个状态:

const [justSwapped, setJustSwapped] = useState(false)

然后,我们在函数内部工作

const handleTouchStart = (e, obj) =>

首先,创建一个判断,如果来源=obj,则返回该判断.这意味着,用户两次(或多次)touch 同一行.从理论上讲,你可以将它与自身互换,但这似乎并不是必要的,也不太复杂.

if (origin === obj)
{
    return
}

接下来,创建另一个 case 以判断前一个状态是否为交换状态,并判断原点是否未定义.第一个条件是为了防止在交换后立即进行不需要的交换,第二个条件是为了防止在初始接触时使用未定义的交换.

else if ((!justSwapped) && (origin.first !== undefined))
{
    swap(origin, obj)
    setOrigin({}) //reset origin
    setJustSwapped(true)
    return
}

最后,函数的结尾:

else
{
    setOrigin(obj)
    setJustSwapped(false)
}

我不确定这是否对任何人有帮助,但我想我还是分享一下吧.

Reactjs相关问答推荐

在Reaction+Redux+RTKQuery中对API调用进行排序

通过单击具有此值的按钮将值添加到数组对象键

React Context未正确更新

有没有可能在next.js和ssr中使用tsps?

无法在REACTION TANSTACK查询中传递参数

透明MOV文件未出现在我的React网页中

如何动态地改变<; Select >;React和Tailwind元素?

如何在中间件中获取 nextAuth 会话

找不到名称setCometChat

更新对象状态的父数组时记住子组件

REACT: UseState 没有更新变量(ant design 模态形式)

使用jest如何覆盖对象的模拟?我正在使用`jest.mock()`来模拟对象,并希望 for each 测试用例覆盖模拟.

Spring Boot + React + MySQL应用的架构层面有哪些?

React:如何使用条件渲染和react 挂钩来更新另一个组件的状态?

React 测试库包装器组件

即使配置了 webpack.config.js,html-loader 也不起作用

DatePicker MUI 如何在日历左侧显示清除文本

调用 Jest 和服务方法的问题

将 dict 值转换并插入到react 钩子的列表中

仅在重新渲染后设置状态