将 react-spring useSprings 与动态项目数组一起使用

Posted

技术标签:

【中文标题】将 react-spring useSprings 与动态项目数组一起使用【英文标题】:Using react-spring useSprings with dynamic items array 【发布时间】:2019-10-14 06:49:20 【问题描述】:

我正在尝试使用 react-spring 的 useSprings 使用户能够以 formik FieldArray 重新排序项目。 useSprings Draggable List 演示 (found here) 使用 useRef 来管理项目的顺序。 FieldArray 带有许多用于插入、删除和移动项目的数组辅助函数。

我遇到的问题是:

1) 使用 formik 的 move 数组辅助方法重新排序现有项目成功更改数组顺序,但需要额外单击才能呈现正确的顺序

2) 使用数组辅助方法添加或删除数组项会产生意想不到的结果。改变 ref 的长度不会改变 order.current 内部 useGesture 的长度

我也尝试过使用useState 而不是useRef 并在道具更改时使用useEffect 更新状态。

这是我制作的代码沙箱:https://codesandbox.io/s/usesprings-with-fieldarray-56bex

bind函数中,注释掉

order.current = newOrder;
并取消注释
// arrayHelpers.move(currIndex, currRow);
显示了我上面提到的问题 #1。

我希望能够将 formik 的 moveinsertremove 辅助函数与 react-spring 一起使用,以无缝地重新排序、添加和删除 FieldArray 中的项目。

【问题讨论】:

嘿!你设法解决了这个问题吗? 【参考方案1】:

也许你可以在添加新元素后尝试设置新的 order.current

  onClick=() =>
          arrayHelpers.insert(items.length, 
            name: `Item $items.length + 1`
          )
          order.current = [...order.current, order.current.length];
        
      

这将在列表末尾添加新项目。

【讨论】:

【参考方案2】:

我至少遇到了你的 #1 问题。

请注意,setSprings 函数不会自行重新渲染任何内容,并且 useSprings 缺少要自动更新的 dependencies 数组。

react-springs@9.0.0.beta-23 有一个依赖数组,并与链接到here 的沙箱中的useSpringsFixed 包装器一起,它应该强制重新渲染更改的道具。

希望对您的问题也有帮助。

【讨论】:

感谢您的回答。我现在正在关注您在 Github 上打开的问题。

以上是关于将 react-spring useSprings 与动态项目数组一起使用的主要内容,如果未能解决你的问题,请参考以下文章

将 react-spring 用于 react-native

如何将 react-spring 动画组件添加到 React 延迟加载?

如何使用 react-spring 滚动到元素?

react-spring 中的“动画”做啥?

如何反向运行 react-spring 动画?

React-Spring - 改变过渡动画速度