如何防止反应组件在每次 parent 组件渲染时渲染?
How can I prevent a react component to render every time parent component renders?
我在一个表单上有一个 TextField 输入,问题是当我在上面输入时,刚刚输入的值的 displayed/render 有一种延迟,我想防止这种情况发生。
上下文:
TextField 是标签、名称和 ID 来自名为 'formInput' 的状态 object,并且每次按下按钮时它们都会更改它们的值。此单个输入的值存储在称为 'inputsValue' 的不同状态 object 中,该状态在 'handleChange' 函数内发生变化,该函数调用 TextField 的 onChange 属性。
问题是
可疑的:
我制作了一个“BouncyLetters”组件并在一个也呈现表单的组件中使用它,我使用 BouncyLetters 作为表单的标题。当我从页面中删除此组件时,打字显示以正常速度显示。所以我认为从 re-rendering 中禁用它总是可以解决问题,idk。谢谢
代码:
export const Contact = (props) => {
const [formInput, setFormInput] = useState({input: 'name', label: 'Type name'});
¿ const [inputsValue, setInputsValue] = useState({name: '', email: '', message: ''});
const handleClick = () => {
switch (formInput.input) {
case 'name':
setFormInput({ input: 'email', label: 'type email' });
break;
case 'email':
setFormInput({ input: 'message', label: 'type message' });
break;
case 'message':
setFormInput({ input: 'name', label: 'type name' });
handleSubmission();
break;
default:
break;
}
}
const handleChange = event => {
setInputsValue({
...inputsValue,
[event.target.name]: event.target.value
});
}
const handleSubmission = event => {
console.log('SUBMITTED CONTACT FORM')
}
return (
<form>
<Grid container>
<Grid item xs={12} sm={10}>
<BouncyText />
</Grid>
</Grid>
<Grid container spacing={2}>
<Grid item xs={12} id="contactFomrField">
<TextField
fullWidth
id={formInput.input}
label={formInput.label}
name={formInput.input}
value={inputsValue[formInput.input]}
onChange={handleChange}
/>
</Grid>
</Grid>
<Grid
container
justify="center"
alignItems="center"
>
<Button
onClick={handleClick}
variant="outlined"
color="primary"
>
{ formInput.input !== 'message' ? 'Next' : 'Send :)'}
</Button>
</form>
)
}
handleClick()
是传递给子组件的回调(在组件中声明),因此它应该包装为 useCallback()
。否则,此回调在重新渲染后重新声明,因此它的引用不同,使子组件协调。
我在一个表单上有一个 TextField 输入,问题是当我在上面输入时,刚刚输入的值的 displayed/render 有一种延迟,我想防止这种情况发生。
上下文: TextField 是标签、名称和 ID 来自名为 'formInput' 的状态 object,并且每次按下按钮时它们都会更改它们的值。此单个输入的值存储在称为 'inputsValue' 的不同状态 object 中,该状态在 'handleChange' 函数内发生变化,该函数调用 TextField 的 onChange 属性。
问题是 可疑的: 我制作了一个“BouncyLetters”组件并在一个也呈现表单的组件中使用它,我使用 BouncyLetters 作为表单的标题。当我从页面中删除此组件时,打字显示以正常速度显示。所以我认为从 re-rendering 中禁用它总是可以解决问题,idk。谢谢
代码:
export const Contact = (props) => {
const [formInput, setFormInput] = useState({input: 'name', label: 'Type name'});
¿ const [inputsValue, setInputsValue] = useState({name: '', email: '', message: ''});
const handleClick = () => {
switch (formInput.input) {
case 'name':
setFormInput({ input: 'email', label: 'type email' });
break;
case 'email':
setFormInput({ input: 'message', label: 'type message' });
break;
case 'message':
setFormInput({ input: 'name', label: 'type name' });
handleSubmission();
break;
default:
break;
}
}
const handleChange = event => {
setInputsValue({
...inputsValue,
[event.target.name]: event.target.value
});
}
const handleSubmission = event => {
console.log('SUBMITTED CONTACT FORM')
}
return (
<form>
<Grid container>
<Grid item xs={12} sm={10}>
<BouncyText />
</Grid>
</Grid>
<Grid container spacing={2}>
<Grid item xs={12} id="contactFomrField">
<TextField
fullWidth
id={formInput.input}
label={formInput.label}
name={formInput.input}
value={inputsValue[formInput.input]}
onChange={handleChange}
/>
</Grid>
</Grid>
<Grid
container
justify="center"
alignItems="center"
>
<Button
onClick={handleClick}
variant="outlined"
color="primary"
>
{ formInput.input !== 'message' ? 'Next' : 'Send :)'}
</Button>
</form>
)
}
handleClick()
是传递给子组件的回调(在组件中声明),因此它应该包装为 useCallback()
。否则,此回调在重新渲染后重新声明,因此它的引用不同,使子组件协调。