reactjs - 改变状态时输入值不更新
问题描述
在为学习目的创建一个小项目时,我遇到了更新输入值的问题。这是组件(我已尝试将其减少到最低限度)。
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() 语句中,则值会正确更新。
解决方案
我会将您的输入移出该组件,并让他们在 TipSelector 之外管理自己的状态。
看:
https://codesandbox.io/s/naughty-http-d38w9
例如:
import { useState, useEffect } from "react";
import CustomInput from "./Input";
function TipSelector({ selections, onTipChanged }) {
const [controls, setControls] = useState([]);
//Build controls
function buildControls() {
let controlList = [];
controlList.push(<CustomInput />);
controlList.push(<CustomInput />);
setControls(controlList);
}
useEffect(() => {
buildControls();
return () => {
console.log("unmounts");
};
}, []);
return (
<div>
<span>Select Tip %</span>
<div>{controls}</div>
</div>
);
}
export default TipSelector;
import { useState, useEffect } from "react";
function CustomInput() {
const [tip, setTip] = useState("0");
function customTipChanged(percent) {
setTip(percent);
}
return (
<input
value={tip.toString()}
onChange={(event) => {
customTipChanged(event.target.value);
}}
></input>
);
}
export default CustomInput;
推荐阅读
- r - 用另一个数据框中的数值重新编码一个数据框中的字符变量列
- r - R - 如何简化特殊字符的文本清理?
- c - strcmp 不将数组与字符串“abc”进行比较
- android-studio - Android Studio - LocationManager(获取经纬度)
- wordpress - Elementor 查询帖子不适用于单个帖子
- python - 使用 src / 目标坐标使用 Python PIL 进行透视变换
- java - 在 PutObject 时设置 s3 存储桶策略
- google-sheets - 如何从下拉列表中覆盖其 id 的值?
- c++ - 我不明白为什么我需要按特定顺序放置两行才能使其工作(递归)
- animation - 哪个动画适合可扩展容器颤动?