React Hooks:如何传递props setState,同时使用相同的 setState itslef?

IT技术 javascript reactjs react-hooks react-props react-state
2022-08-02 02:03:38

我有一个包含 50 多个组件的react应用程序。其中很少有组件共享一个共同的状态。

一切都很顺利,直到我到达 Modal 组件,它包含 5 个其他组件(就像选项卡,每个都有自己的组件和内容),它们共享相同的状态值,所以我将它们作为props传递,一次每个组件. 我注意到这是非常低效的,因为我可以看到视觉滞后(在我的模态组件中),这在其他组件中不存在。

我在这里的问题是将我的状态导入或传递给子组件的正确方法是什么,有人建议我使用上下文,但它不适合我的应用程序。

下面是我的代码,很抱歉我无法在沙盒上重现此错误,因为应用程序太大。

父组件(用户看到的主页,当他单击添加按钮时,我获取相关props并将其发送到模态组件,然后该组件获取该状态并在其其他五个子组件(选项卡)之间共享它)

主页 在此功能记录中是我发送到模态的props

   function MainPage = () => { 
    return <Modal record={record} />
    }

模态组件

 function modal({record}){ // destructing the props here
    return(
      <TabPane
                tab={
                  <span>
                    <InfoCircleOutlined style={{ fontSize: 14 }} />
                    Tab1
                  </span>
                }
                key="1"
              >
                  <component1 formProp={form} record={record} />
                
              </TabPane>
     <TabPane
                tab={
                  <span>
                    <InfoCircleOutlined style={{ fontSize: 14 }} />
                    Tab1
                  </span>
                }
                key="1"
              >
                  <component2 formProp={form} record={record} />
                
              </TabPane>
    )
}
  

同样,我的模态组件中还有其他三个组件,每个组件都需要相同的记录props来呈现自己的内容。

我在这里做错了什么以及导致滞后的原因是什么?再次,我很抱歉代码片段不够详细,如果您需要任何澄清,请告诉我。

更新:

在接受建议并查看之后,我认为这就是导致滞后的原因。

所以这是我的模态组件:

步骤1

  const [modalContent, setModalContent] = useState({
    title: '',
    content: '',
    visible: false,
  })

它通过按钮的这个 onClick 属性触发,

第2步

            <Button
              onClick={() => {
                setModalContent({
                  title: 'Edit Pay Item',
                  content: <Test record={record} modal={setModalContent} 
                  visible: true,
                })
              }}
            />

第 3 步:这里是我的模态滞后的地方。

所以我重用了相同的模态组件,它永远不会滞后,但在这个特定的情况下存在问题。

如果您在下面看到这一行,我正在将 setModalContent 本身作为props传递,而我正在使用它。也许这就是它落后的原因。那么实现这个逻辑的更好方法是什么?我需要在使用 setState(即 setModalContent)本身时传递 setModalContent。

setModalContent({ title: 'Edit Pay Item', content: <Test record={record} modal={setModalContent} visible: true, })

1个回答

传递状态的正确方法需要分析您的代码结构、状态管理方法以及如何组织/使用组件。但是当您在模态中传递记录时,并且基于假设您将在应用程序中获取记录列表并且每个记录都可以在模态中传递以加载它,滞后可能不是直接由于此模态/组件结构体

对于模态的滞后,您可以查看您的代码以了解以下几点

  1. 是否有任何大图像/图像在模态中加载而没有被正确压缩,因为 UI 中的大字节体积会导致滞后
  2. 您是否在进行昂贵的状态更新的同时打开您的模式,这会影响许多组件并为其他任务留下最少的 UI 线程资源
  3. 您是否在打开消耗计算资源的模态时进行任何昂贵的计算
  4. 您是否尝试过逐步评论您的模态组件以缩小开始产生视觉滞后的特定组件/组件数量

如果您在查看代码的同时保持上述观点,您将能够缩小实际原因