我需要使用 useEffect 来重新渲染组件吗?
Do I need to use useEffect to rerender a component?
当 props 发生变化时,我在更新组件时遇到了问题。我使用 useEffect 让它工作,但我不确定它是否是解决我问题的正确方法。
这是我的代码:
import * as React from "react";
import "./styles.css";
const InputWithDefaultValue = (props: any) => {
const { value } = props;
//had to add this to get my component to rerender when the button in App-Component was pressed
React.useEffect(() => {
setText(value);
}, [value]);
const [text, setText] = React.useState(value);
return (
<input
value={text}
onChange={(e) => setText(e.currentTarget.value)}
></input>
);
};
export const App = () => {
const [value, setValue] = React.useState("Foo");
return (
<div className="App">
<InputWithDefaultValue value={value} />
<button onClick={() => setValue(Math.random().toString())}>Update</button>
</div>
);
};
export default App;
我在想当我更新 InputWithDefaultValue 的道具时它会被重新渲染。是使用 useEffect 让组件重新呈现解决问题的正确方法还是我找到了一些 hacky-solution?
谢谢!
您的解决方案是正确的。
当您向组件添加状态(即使用 useState
)时,组件将不再在其 props 更改时自动更新。相反,您必须使用效果并更新内部状态,就像您在代码中所做的那样。
这是一个相关问题:
你基本上已经“将 props 分叉到状态中”——此时你负责自己处理状态变化。另一种选择可能是为 user-edited 文本设置状态,默认情况下 undefined
,并执行类似 value={userText !== undefined ? userText : props.value}
的操作
当 props 发生变化时,我在更新组件时遇到了问题。我使用 useEffect 让它工作,但我不确定它是否是解决我问题的正确方法。
这是我的代码:
import * as React from "react";
import "./styles.css";
const InputWithDefaultValue = (props: any) => {
const { value } = props;
//had to add this to get my component to rerender when the button in App-Component was pressed
React.useEffect(() => {
setText(value);
}, [value]);
const [text, setText] = React.useState(value);
return (
<input
value={text}
onChange={(e) => setText(e.currentTarget.value)}
></input>
);
};
export const App = () => {
const [value, setValue] = React.useState("Foo");
return (
<div className="App">
<InputWithDefaultValue value={value} />
<button onClick={() => setValue(Math.random().toString())}>Update</button>
</div>
);
};
export default App;
我在想当我更新 InputWithDefaultValue 的道具时它会被重新渲染。是使用 useEffect 让组件重新呈现解决问题的正确方法还是我找到了一些 hacky-solution?
谢谢!
您的解决方案是正确的。
当您向组件添加状态(即使用 useState
)时,组件将不再在其 props 更改时自动更新。相反,您必须使用效果并更新内部状态,就像您在代码中所做的那样。
这是一个相关问题:
你基本上已经“将 props 分叉到状态中”——此时你负责自己处理状态变化。另一种选择可能是为 user-edited 文本设置状态,默认情况下 undefined
,并执行类似 value={userText !== undefined ? userText : props.value}