【发布时间】:2022-01-15 15:01:42
【问题描述】:
我有一个我认为是证明状态变化的简单测试,我有另一个测试通过计时器进行更改并且它工作正常(至少我是这样假设的)但是这个由click触发事件,它没有通过我的重新渲染检查。
it("should not rerender when setting state to the same value via click", async () => {
const callback = jest.fn();
function MyComponent() {
const [foo, setFoo] = useState("bir");
callback();
return (<div data-testid="test" onClick={() => setFoo("bar")}>{foo}</div>);
}
const { getByTestId } = render(<MyComponent />)
const testElement = getByTestId("test");
expect(testElement.textContent).toEqual("bir");
expect(callback).toBeCalledTimes(1);
act(() => { fireEvent.click(testElement); });
expect(testElement.textContent).toEqual("bar");
expect(callback).toBeCalledTimes(2);
act(() => { fireEvent.click(testElement); });
expect(testElement.textContent).toEqual("bar");
expect(callback).toBeCalledTimes(2); // gets 3 here
})
我尝试使用代码框 https://codesandbox.io/s/rerender-on-first-two-clicks-700c0 来做同样的事情
我在查看日志时发现它会在前两次点击时重新渲染,但我的期望是在第一次点击时重新渲染,因为值是相同的。
我也通过a snack 在 React native 上做了类似的事情,它工作正常。只有一个重新渲染。所以它可能是特定于 React-DOM 上的 onClick #22940
【问题讨论】:
-
"请注意,React 可能仍需要在退出之前再次渲染该特定组件。这不应该是一个问题,因为 React 不会不必要地“深入”到树中。如果你是在渲染时进行昂贵的计算,您可以使用 useMemo 对其进行优化。”来自 React 文档:reactjs.org/docs/…
-
问题是为什么要重新渲染?
-
为了确保所有更改都已完成,这就是 react 的工作方式,正如他们在文档中所说,这不应该是一个问题
-
但值没有变化。正如他们的文档中所述,他们使用 Object.is 你不能得到任何比使用相同的
const
标签: javascript reactjs jestjs