React父组件仅在子TextField失焦时重渲染的MUI5实现方法
解决MUI 5 TextField输入时父组件频繁重渲染的问题
核心思路是不在输入过程中实时更新父组件状态,而是在子组件内部维护临时输入状态,仅当TextField失焦(用户离开输入框)时,再将最终值同步给父组件,这样父组件只会在失焦时触发一次重渲染。
修改后的完整代码
父组件(ProductDashboard)
const ProductDashboard = () => { const [productName, setProductName] = useState<null | string>(''); const [isLoading, setIsLoading] = useState(false); // 补全缺失的状态定义 useEffect(() => { setIsLoading(true); // 这里可添加实际业务逻辑,比如根据productName请求数据 // 请求完成后记得设置setIsLoading(false) }, [productName]); return ( <ProductFilter productName={productName} setProductName={setProductName} /> ); };
子组件(ProductFilter)
import { useState, useEffect } from 'react'; import { Box, TextField } from '@mui/material'; const ProductFilter = ({ productName, setProductName }) => { // 子组件本地维护输入状态 const [localProductName, setLocalProductName] = useState(productName); // 当父组件的productName外部更新时,同步子组件本地状态 useEffect(() => { setLocalProductName(productName); }, [productName]); return ( <Box> <TextField value={localProductName} // 输入时仅更新子组件本地状态,不触发父组件重渲染 onChange={(event) => { setLocalProductName(event.target.value); }} // 失焦时将本地值同步给父组件,触发父组件重渲染 onBlur={() => { setProductName(localProductName); }} /> </Box> ); };
关键说明
- 子组件通过
useState维护本地输入值,输入过程中仅更新这个本地状态,不会触发父组件的setProductName,也就不会导致父组件重渲染。 - 添加
onBlur事件,当用户离开输入框时,才将本地的最终输入值传递给父组件的setProductName,此时父组件才会触发重渲染和对应的useEffect逻辑。 - 用
useEffect监听父组件传入的productName,如果父组件的productName被其他逻辑修改(比如重置筛选条件),子组件的输入框值会同步更新,保证数据一致性。
内容的提问来源于stack exchange,提问作者mattsmith5
相关产品推荐
相关产品推荐

