reactjs - 防止 useState 重新渲染组件
问题描述
我有一个 TextField 在更改时使用 useState 更新状态。我面临一个问题,即在状态更改后整个组件都会重新渲染,我希望只有 TextField 会更改。
const Uploader = ({ onUploadComplete }) => {
const [fields, setFields] = useState({});
const handleName = (event) => {
const { name, value } = event.target;
setFields((fields) => ({
...fields,
[name]: { value: value },
}
<React.Fragment>
<Grid item xs={4}>
<Card>{console.log('Card Media Rendered')}</Card>
</Grid>
<Grid item xs={8}>
<FormControl fullWidth>
<TextField
value={fields[file.id]?.value || ''}
onChange={handleName}
/>
</FormControl>
</Grid>
</React.Fragment>
}
解决方案
您需要useState
像这样移动功能组件内部:
const Uploader = ({ onUploadComplete }) => {
const [fields, setFields] = useState({});
const handleName = (event) => {
const { name, value } = event.target;
setFields((fields) => ({
...fields,
[name]: { value: value },
}))
}
return (
<React.Fragment>
<Grid item xs={4}>
<Card>{console.log('Card Media Rendered')}</Card>
</Grid>
<Grid item xs={8}>
<FormControl fullWidth>
<TextField
value={fields[file.id]?.value || ''}
onChange={handleName}
/>
</FormControl>
</Grid>
</React.Fragment>
)
}
您的组件确实重新渲染,因为它所依赖的变量不在反应范围内。所以它不能只触发对文本字段的更新
推荐阅读
- java - 为什么找不到这些符号?
- amazon-web-services - 无法在需要基本身份验证的页面上使用 AWS S3 对象
- html - CSS 在 URL 中使用波浪号作为具有未知完整 URL 的文件夹名称的一部分
- css - Google recaptcha 样式问题,用 css 还是 javascript 解决?
- java - 如果输入了无效选项,我如何循环代码
- html - 如何在 CSS 代码中限制背景图像?
- typescript - What is TypeScript's ThisType used for?
- c++ - C++:如何从 lambda 中“取消捕获”不可复制的内容(例如 unique_ptr)?
- matlab - Plotting numbers in a Cell array
- java - 在java中打包和解包一个浮点数组