reactjs - React 中非常快速的 setState 调用的性能问题?

标签 reactjs

我创建了一个简单的可拖动组件。我正在使用 react-swipeable 库,但我的问题是关于任何重复和快速连续更新 useState 的事件。
通过console.log中的onSwiping,我可以看到该函数每秒被调用多次,这就是我更新组件位置所需要的。这有效,但是如此频繁地调用 setSwipeX 是否存在性能问题?
整个组件在拖动时会非常快速地重新渲染。这是可以的,还是只更新 swipeX 而不重新渲染整个组件会更好,这甚至可能吗?

import React from "react";
import { useSwipeable } from "react-swipeable";

export default function App() {
  const [swipeX, setSwipeX] = React.useState(0);

  const swipeHandlers = useSwipeable({
    onSwiping: (e) => {
      console.log(e);
      setSwipeX(-e.deltaX);
    },
    trackMouse: true
  });

  return (
    <div
      className="App"
      {...swipeHandlers}
      style={{
        transform: `translateX(${swipeX}px)`
      }}
    >
      <h1>Stuff</h1>
    </div>
  );
}
https://codesandbox.io/s/relaxed-minsky-ni7n9?file=/src/App.js

最佳答案

我不是性能方面的专家,但几周前我已经实现了一个组件,可以让您向下滑动页面组件。这与你正在做的非常相似,但在垂直方向上。我第一次尝试使用 useState 这样做时,我的 Pixel 3a 没有问题。但是当我在 Nexus 5x 上测试时,它一点也不流畅。当我将逻辑更改为使用 useRef 而不是 userState 时,感觉更流畅了。像这样的东西:

import React from "react";
import { useSwipeable } from "react-swipeable";

export default function App() {
  const ref = React.useRef(null);

  const swipeHandlers = useSwipeable({
    onSwiping: (e) => {
      console.log(e);
      ref.style.transform = `translateX(${-e.deltaX}px)`;
    },
    trackMouse: true
  });

  return (
    <div
      className="App"
      {...swipeHandlers}
      ref={ref}
    >
      <h1>Stuff</h1>
    </div>
  );
}
这样,您就可以直接更改 DOM。再次提到,我没有通过数字来测试它,但在低端设备上我可以看到一些差异。

关于reactjs - React 中非常快速的 setState 调用的性能问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63721722/

相关文章:

javascript - Redux 不会通过调度调用另一个函数

javascript - ReactJS:在点击时动态添加一个组件

javascript - 如何在外部函数中使用setState?

javascript - React object.map 由于 key 而未更新

reactjs - : "^{:key item}"的用途

javascript - React JS 使用 lodash 渲染数组项

javascript - 使用 React Bootstrap 自定义 Card.Header

javascript - React Hooks : Shuffle array immediately on load, 和 onClick

javascript - ReactJs搜索按钮在fetch之前重新加载页面可以获取图像链接并显示它们

javascript - 如何在React.js中以异步方式加载悬停效果的图像?