首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反应-测试-库-避免子组件的重建器

反应-测试-库-避免子组件的重建器
EN

Stack Overflow用户
提问于 2022-02-02 14:31:25
回答 1查看 1.3K关注 0票数 0

我正在尝试将一个测试从酶迁移到反应测试库

酶的目的是“如果孩子不受影响,不应该强迫孩子重新渲染”。

代码语言:javascript
复制
    const wasRendered = jest.fn();

    const Component = (props) => (
        <div {...props} />
    );

    const ChildComponent = () => {
        wasRendered();
        return <div>Hello</div>;
    };

    const SkinnableParent = Skinnable(config, Component); //Skinnable is a higher order component applied from our code. 
    const SkinnableChild = Skinnable(config, ChildComponent);

    const subject = mount(
        <SkinnableParent>
            <SkinnableChild />
        </SkinnableParent>
    );

    // Sending props to force parent to re-render
    subject.setProps({className: 'foo'});
    const expected = 1;
    const actual = wasRendered.mock.calls.length;

    expect(actual).toEqual(expected);

通过测试库,我尝试使用rerender功能。

代码语言:javascript
复制
    const wasRendered = jest.fn();
    
    const Component = (props) => {
        return <div {...props} />
    };

    const ChildComponent = () => {
        wasRendered();
        return <div>Hello</div>;
    };

    const SkinnableParent = Skinnable(config, Component); //Skinnable is a higher order component applied from our code. 
    const SkinnableChild = Skinnable(config, ChildComponent);

    const RootComponent = ({className}) => {
        return (
        <SkinnableParent className={className}>
            <SkinnableChild />
        </SkinnableParent>
        )
    };

    const {rerender} = render(<RootComponent />);

    rerender(<RootComponent className='foo' />);

    const expected = 1;
    const actual = wasRendered.mock.calls.length;

    expect(actual).toEqual(expected);

问题是RTL的实际结果是2。“子”组件也正在重新命名。

是否有一种方法可以达到与以前的酶实现相同的效果?

EN

回答 1

Stack Overflow用户

发布于 2022-02-02 14:37:34

在那个测试中,没有什么能阻止ChildComponent的重发器。你的酶测试不是你想的那样。在本例中,阻止子组件中的重复器的唯一方法是用React.memo包装它。

当呈现父组件时,所有子组件都将重新呈现,除非通过备注或返回false的shouldComponentUpdate实现停止。

React具有良好的性能,因为即使组件被重新呈现,它也可能不需要在DOM中进行调解(这是一个沉重的计算负担。请参阅https://reactjs.org/docs/optimizing-performance.html#shouldcomponentupdate-in-action

您不应该担心避免重新呈现,除非组件中的JS很昂贵。

查看这个沙箱,复制您的测试用例,您将看到它两次呈现https://codesandbox.io/s/romantic-river-hcos6

在本例中,使用备忘录,它将只呈现一次https://codesandbox.io/s/condescending-lovelace-6z2j4

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70957455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档