我正在try 使用React 16封装一个<Drawer/>和<modal/>组件.我引用了一些项目,现在我有两种方法.哪一个更好?

在这种情况下,由于父组件中的可见性状态发生了更改,如果父组件具有大量计算逻辑,则使用<modal/>组件的开发人员将需要付出额外的努力来解决性能问题.

const [visible, setVisible] = useState<boolean>(false);

// Parent
return <>
    <Button onClick={() => {
        setVisible(true);
    }}>Open Modal</Button>

    // Children
    <Modal visible={visible} />
</>;

或使用Ref:

// Children
const [visible, setVisible] = useState<boolean>(false);

React.useImperativeHandle(ref, () => {
    open: () => { setVisible(true) },
    close: () => { setVisible(false) },
})

return <div>
    {props.visible && children}
</div>;

// Parent
const ModalRef = useRef<{ open: () => void; close: () => void } | null>(null);

return <>
    <Button onClick={() => {
        ModalRef.current.open();
    }}>Open Modal</Button>

    <Modal ref={ModalRef} />
</>;

在本例中,我不必要地操作了对DOM的引用,并且这种类型的组件不会频繁销毁.该REF可能会在浏览器中与父对象保持很长时间.这样做的好处是开发人员不再需要在父组件中管理其状态.

推荐答案

好吧,你说了.父代中的繁重计算会影响子代,因此适当的逻辑分离和独立性是最好的.

Therefore go with your method 2 in that case

尽管如果没有真正的判断,人们可能会认为根本没有性能瓶颈.然后,它就变成了一种过度杀戮.

在一个完全常见的场景中,开发人员的目标可能是早期的性能特性,而手头有一个更棘手的问题.这就是为什么我建议在过分担心绩效之前,先把工作效率放在首位(just my personal opinion).

在你的情况下,我在正常情况下会使用第一种方法,但当有明确的理由时,我会使用第二种方法.在过go 的几十年里,保持代码非常简单已经被证明是有用的.

组件解耦一直是与Reaction组件争执的主要焦点.这允许代码重用、模块化和代码维护.

如果在解耦时,您实现了父对象中的计算不再影响子对象的功能,那么这是最好的方法.

就我个人而言,我还没有遇到这种方法的重大缺点.

Reactjs相关问答推荐

eslint -无法解析模块的路径@web3modal/ethers/react导入/no-unresolved

呈现组件元素(MAP)中的问题

在Redux工具包查询中,是否可以将标记应用到API切片内的所有端点?

Redux Provider Stuck甚至彻底遵循了文档

如何将图像(在代码中称为自己)定位在蓝色圈内的点上?我正在使用material UI和Reaction

每次单击按钮时,Reaction组件都会重新生成

无法找出状态正在被更改的位置

如何垂直对齐 React Bootstrap Table 行中的项目

如何隐藏移动导航栏后面的向下滚动图标和文本?

VideoSDK api 不使用更新状态

文本的几个词具有线性渐变 colored颜色 - React native

Select 项目后 Select HeadlessUI 组合框中的所有文本?

我正在try 将一组加载程序函数发送到我的路由,它抛出一个错误 Handler is not a funtion in a reactJs application

将 useState 设置为组件内部的值

如何在 ChartJS 中操作 Y 轴

我正在try 使用 cypress 测试我的下拉列表,它 Select 值但不提交它们(手动工作)

为什么 React 会多次调用我的应用程序的某些函数?

为什么我不能使用 formik 更改此嵌套对象中的值

为什么这两个 div 的渲染方式不同?

react 路由:router.ts:11 没有匹配的路由位置/管理