【发布时间】:2021-09-27 07:21:18
【问题描述】:
在为学习目的创建一个小项目时,我遇到了更新输入值的问题。这是组件(我已尝试将其减少到最低限度)。
function TipSelector({selections, onTipChanged}: {selections: TipSelectorItem[], onTipChanged?:(tipPercent:number)=>void}) {
const [controls, setControls] = useState<any>([]);
const [tip, setTip] = useState<string>("0");
function customTipChanged(percent: string) {
setTip(percent);
}
//Build controls
function buildControls()
{
let controlList: any[] = [];
controlList.push(<input className={styles.input} value={tip.toString()} onChange={(event)=> {customTipChanged(event.target.value)}}></input>);
setControls(controlList);
}
useEffect(()=>{
console.log("TipSelector: useEffect");
buildControls();
return ()=> {
console.log("unmounts");
}
},[])
console.log("TipSelector: Render -> "+tip);
return (
<div className={styles.tipSelector}>
<span className={globalStyles.label}>Select Tip %</span>
<div className={styles.btnContainer}>
{
controls
}
</div>
</div>
);
}
如果我将输入的创建直接移动到 return() 语句中,则值会正确更新。
【问题讨论】:
-
在状态中存储组件是一种反模式。而是在 state 中保留有关组件的数据列表,并在 return 每个渲染中创建组件。
-
@BrianThompson 我理解你所说的状态反模式中的组件是什么意思,但我不明白的是你的第二个陈述。我不是直接改变状态,而是通过 setControls 钩子。我的意思是我没有做controls.push(X)。我错过了什么吗? (你刚刚删除了我提到的评论吗?)
-
我确实删除了该评论,我读错了您的代码并且不正确。
-
好的,无论如何感谢其他反模式。
标签: reactjs typescript state