[英]How to stop child component re-rendering on parent state change?
我在App.tsx
中有400
文本字段。 子组件textfield.tsx
中存在文本字段代码当我从父组件更改文本字段 state 时,我的孩子重新渲染 400 次
我希望hi
在控制台中只打印1
次而不是400
次。 我该如何解决这个问题?
示例代码:
应用程序.ts
import { useState } from "react";
import MyTextField from "./components/textField.tsx/textField";
function App() {
const [state, setState] = useState({} as any);
const arr: any[] = []
const fn = () => {
for (var i = 0; i < 400; i++) {
arr.push(i)
}
}
function onChange(event: any) {
const { name, value } = event.target;
setState((prevState: any) => ({ ...prevState, [name]: value }));
}
return (
<>
{fn()}
{
arr.map((e) => <MyTextField variant='outlined' name={'n' + e} value={state['n'+ e]} onChange={onChange} />)
}
</>
);
}
export default App;
文本字段.tsx
import { TextField, TextFieldProps, } from "@mui/material";
import React from "react";
const myClasses = ["custom1", "subvariant-hovered"] as const
type Props = Omit<TextFieldProps, "className" | "variant"> & {
variant: typeof myClasses[number] | TextFieldProps["variant"];
};
function MyTextField({ variant,name, ...rest }: Props) {
return (
<>
{console.log('hi')}
{myClasses.includes(variant as typeof ivpClasses[number]) ? (
<TextField label="Search" className={variant} {...rest}></TextField>
) : (
<TextField label="Search" variant={variant as TextFieldProps["variant"]{...rest</TextField>
)}
</>
)
}
export default React.memo(MyTextField);
问题一旦我输入w
一次 console.log 打印hi
400
次。 我希望 hi 为每个字符只打印1
次。
在更改一个文本字段 state 时,console.log 为我们键入的每个字符打印 hi 400 次
代码沙盒: https://codesandbox.io/s/textfield-issue-m3i82e?file=/src/App.tsx
是的,所以这个问题比我在评论中提到的更深入。 这也是事实:对于每次重新渲染,您都在重新创建数组并调用 function 来填充它,这就是导致问题的原因。
此外,您的组件 state 是您 append 值的 object。 请记住,当 state 发生变化时,它将重新渲染所有连接到该 state 的组件。每次重新渲染都会创建一个新的 object,从而导致所有输入重新渲染。
为了解决这个问题,您可以查看useCallback function 作为 state 的包装器并呈现您的 TextInput。 我在这里创建了一个示例,它似乎提供了您想要的 output。
https://codesandbox.io/s/textfield-issue-forked-490ki2?file=/src/myTextField/myTextField.tsx
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.