reactjs - 什么可能导致 React Native 组件不断地卸载和重新安装?
问题描述
我有一个组件呈现一个子组件,当它从另一个组件中调用时,它会不断卸载并重新安装。我不明白为什么会这样。
代码大致如下:
import React, { useState } from 'react';
import { View } from 'react-native';
import EditLayout from './EditLayout'
export default users = (props) => {
let { user } = props
const [layout, setLayout] = useState([])
const [layout, setLayout] = useState([])
const Header = () => {
return (<View>
<EditLayout layout={layout} user={user} />
</View>
)
}
return (
<View style={{ flex: 1 }}>
{/* <EditLayout layout={layout} user={user} /> */}
<Header />
</View>
);
}
并且这会导致 EditLayout 的许多重新渲染(EditLayout 非常小)。
当我将上面注释掉的代码替换为 {/* <EditLayout ... /> /} 以改为 {/ */} 时,重新安装就会消失。似乎由于某种原因在 Header 中调用时,它会在最终稳定下来之前导致许多 un & remounts。
知道可能是什么原因造成的吗?
编辑:EditLayout 和输出
这是相关的 EditLayout 代码,即使只有下面的代码,我也可以复制该问题(因此它似乎与 EditLayout 代码的其余部分无关)。
在这里,我将 checkStateData 设置为默认的“Mounted Edit Layout”并立即将其更改为 false,仅在它为 true 时打印。
export default EditLayout = (props) => {
const [checkStateData, setCheckStateData] = useState("Mounted Edit Layout")
checkStateData && console.log("*****", checkStateData) // Print the current status
useEffect(() => {
if(setCheckStateData){
console.log("Made it here")
setCheckStateData(false)
}
}, [])
return (
<View style={{ flex: 1 }}>
{/* {headerLayoutData && headerLayoutData.map((card, i) => {
if (card && user){
return <Card card={card} key={i} user={user} />
}
})}
{newCards && newCards.map((card, i) => {
return <NewCard key={i} user={user} />
})} */}
</View>
);
}
Via <Header />
[Tue Feb 23 2021 15:43:11.836] LOG ***** Mounted Edit Layout
[Tue Feb 23 2021 15:43:11.853] LOG Made it here
[Tue Feb 23 2021 15:43:12.127] LOG ***** Mounted Edit Layout
[Tue Feb 23 2021 15:43:12.172] LOG Made it here
[Tue Feb 23 2021 15:43:12.179] LOG ***** Mounted Edit Layout
[Tue Feb 23 2021 15:43:12.259] LOG Made it here
[Tue Feb 23 2021 15:43:12.281] LOG ***** Mounted Edit Layout
[Tue Feb 23 2021 15:43:12.300] LOG Made it here
[Tue Feb 23 2021 15:43:12.303] LOG ***** Mounted Edit Layout
[Tue Feb 23 2021 15:43:12.307] LOG Made it here
[Tue Feb 23 2021 15:43:12.309] LOG ***** Mounted Edit Layout
[Tue Feb 23 2021 15:43:12.314] LOG Made it here
[Tue Feb 23 2021 15:43:12.364] LOG ***** Mounted Edit Layout
[Tue Feb 23 2021 15:43:12.373] LOG Made it here
[Tue Feb 23 2021 15:43:12.373] LOG ***** Mounted Edit Layout
[Tue Feb 23 2021 15:43:12.384] LOG Made it here
Without <Header>
[Tue Feb 23 2021 15:43:32.797] LOG ***** Mounted Edit Layout
[Tue Feb 23 2021 15:43:32.856] LOG Made it here
解决方案
在您当前的代码中,Header
每次重新Users
呈现组件时都会重新创建(组件)。这将导致错误,因为您不想重新创建子组件(相反,它可能会在需要时重新呈现)。
为了防止这种情况,您应该定义Header
外部父组件,即Users
(名称应以大写字母开头)。
因此,Header
可以在不同的文件中或在同一个文件中(但在外部Users
)。如果Header
要成为一个大组件,最好将其保存在不同的文件中。
// 不要这样做
function MainComp() {
//...
function ChildComp() {
// ...
}
}
// 改为这样做
function MainComp() {
// ...
}
function ChildComp() {
// ...
}
推荐阅读
- xml - HCL Connections 6.5.1 的 files-config.xml 中 simpleUploadAPI 的 tns:intGTE1 数据类型的最大值
- android - “任务:react-native-admob:compileDebugJavaWithJavac FAILED”由 react-native-admob 显示
- typescript - 将参数类型传递给同一函数会导致编译器错误
- c++ - 为什么我们在 C++ 中使用 pos?假设我的代码 int pos = cHash(symbol);
- vba - 如何使用 Teradata 在 Ms Access(VBA) 中以表格/网格格式查看加载到记录集中的数据
- unity3d - 如何从资产包中加载网格?
- swift - 调用 Text 的初始化程序没有完全匹配,如何在 SwiftUI 中解决这个问题?
- javascript - 设置 jQuery 滑块值并使用 AJAX 发送它们
- jpa - 一对多 Hibernate Entity 类 + spring boot + mariaDB 异常
- svg - SVG 图像中的文本缩放