我做了一个简单的代码复制.我有一个列表,我可以通过单击up down按钮来更改项目位置.我想实现也是一个动画时,改变项目的立场.因此,例如,点击"向上"按钮应移动项目translateY(-100%)和"向下"按钮的其他方式. 我自己试过这个,但是没有达到效果,而且在改变位置的时候有很多bug.做这件事的最好方法是什么?

const { useState } = React;

const ITEMS = ["item 1", "item 2", "item 3", "item 4"];

const App = () => {
  const [items, setItems] = useState(ITEMS);

  const handleMoveItem = (index, direction) => {
    const updatedItems = [...items];
    const targetIndex = direction === "up" ? index - 1 : index + 1;

    if (targetIndex >= 0 && targetIndex < items.length) {
      [updatedItems[index], updatedItems[targetIndex]] = [
        updatedItems[targetIndex],
        updatedItems[index],
      ];

      setItems(updatedItems);
    }
  };

  return (
    <div className="wrapper">
      <ul>
        {items.map((item, index) => (
          <li key={item}>
            {item}
            <div>
              <button onClick={() => handleMoveItem(index, "up")}>
                up
              </button>
              <button onClick={() => handleMoveItem(index, "down")}>
                down
              </button>
            </div>
          </li>
        ))}
      </ul>
    </div>
  );
};

ReactDOM.render(<App />, document.getElementById("root"));
.wrapper {
  min-height: 100vh;
  display: flex;
  align-items: center;
  justify-content: center;
}

ul {
  list-style: none;
  width: 500px;
  margin: 0 auto;
  display: flex;
  flex-direction: column;
  gap: 1rem;
}

ul li {
  text-align: center;
  display: flex;
  justify-content: space-between;
  background-color: lightblue;
  transition: transform 0.3s ease;
}
<div id="root">
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/18.1.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/18.1.0/umd/react-dom.production.min.js"></script>

</div>

推荐答案

使用普通的JavaScript在Reaction中添加动画到列表项可能会很棘手.在List的重新排序过程中,您需要添加和删除类.

或者,您可以使用包@formkit/auto-animate将动画添加到您的列表中.

参考文献:example

Javascript相关问答推荐

使用json文件字符串来enum显示类型字符串无法按照计算的enum成员值的要求分配给类型号

在贝塞尔曲线的直线上找不到交叉点:(使用@Pomax的bezier.js)

微软Edge Select 间隙鼠标退出问题

zoom svg以适应圆

如何从JSON数组添加Google Maps标记—或者如何为数组添加参数到标记构造器

Exceljs:我们在file.xlsx(...)&#中发现了一个问题'"" 39人;

Snowflake JavaScript存储过程返回成功,尽管预期失败

有没有可能使滑动img动画以更快的速度连续?

显示图—如何在图例项上添加删除线效果?

并不是所有的iframe都被更换

如何强制Sphinx中的自定义js/css文件始终加载更改而不缓存?

Reaction Native中的范围滑块

rxjs插入延迟数据

映射类型定义,其中值对应于键

TypeError:无法读取未定义的属性(正在读取';宽度';)

try 使用PM2在AWS ubuntu服务器上运行 node 进程时出错

我想将Sitecore搜索面过滤器从多个转换为单个

如何使用画布在另一个内部绘制一个较小但相同的形状,同时保持恒定的边界厚度?

如何根据输入数量正确显示alert ?

在Java脚本中构建接口的对象