reactjs - 如何使用 React Hooks 维护在用户单击时动态添加的受控输入
问题描述
我有一个表单组件,您可以在其中单击添加多个输入。我正在使用 useState 存储来自所有输入的数据,但问题是我收到一条消息,指出我的输入不受控制
状态数据结构
const [formData, setFormData] = useState({
title: '',
titleNum: '',
meta: [
{
content: '',
contentNum: '',
details: '',
tags: ''
}
]
});
这个想法是通过表单将多个对象动态添加到元数组
添加到输入的 onChange 事件
const { title, titleNum, meta } = formData;
const handleMainChange = e => {
const { name, value } = e.target;
setFormData({ ...formData, [name]: value });
};
const handleSubChange = (e, index) => {
const { name, value } = e.target;
let metaContent = [...meta];
metaContent[index] = { ...metaContent[index], [name]: value };
setFormData({ ...formData, meta: metaContent });
};
添加和删除输入
const handleAddInput = () => {
setFormData(prevState => ({
meta: [
...prevState.meta,
{ content: '', contentNum: '', details: '', tags: '' }
]
}));
};
const handleRemove = index => {
let metaContent = [...meta];
metaContent.splice(index, 1);
setFormData({ meta: metaContent });
};
提交并循环遍历所有 META
const onFormSubmit = e => {
e.preventDefault();
createAccount(formData, history);
};
const renderList = meta.map((item, index) => {
console.log(item);
return (
<AddMeta
key={index}
index={index}
meta={item}
handleChange={e => handleSubChange(e, index)}
handleRemove={() => handleRemove(index)}
/>
);
});
添加元组件
const AddMeta = ({ index, meta, handleChange, handleRemove }) => {
return (
<Fragment>
<div className='row valign-wrapper'>
<div className='col s3'>
<h5 className='indigo-text text-lighten-1'>Add Meta - {index + 1}</h5>
</div>
<div className='col s9'>
<button onClick={() => handleRemove(index)} className='btn red'>
Remove Meta Content
</button>
</div>
</div>
<div className='form-group'>
<input
type='text'
placeholder='Content Text'
name='content'
value={meta.content || ''}
onChange={e => handleChange(e, index)}
autoComplete='off'
/>
</div>
<div className='form-group'>
<input
type='text'
placeholder='Content Number'
name='contentNum'
value={meta.contentNum || ''}
onChange={e => handleChange(e, index)}
autoComplete='off'
/>
</div>
<div className='form-group'>
<textarea
className='materialize-textarea'
type='text'
placeholder='Details'
name='details'
value={meta.details || ''}
onChange={e => handleChange(e, index)}
autoComplete='off'
/>
</div>
<div className='form-group'>
<input
type='text'
placeholder='Tags'
name='tags'
value={meta.tags || ''}
onChange={e => handleChange(e, index)}
autoComplete='off'
/>
</div>
</Fragment>
);
};
我感谢任何解决此问题的尝试。谢谢!
解决方案
尝试删除|| ''
您的输入值。它们的价值应该始终与您的状态相关联(应该是''
当您添加新元时)。
推荐阅读
- windows - 使用批处理文件打开超过 32 个 Windows 命令行控制台
- mysql - Jenkins 管道抛出 CLIENT_PLUGIN_AUTH 是 mysql 连接所需的错误
- visualization - 无法在 Apache Superset 中显示箱线图
- mysql - MySQL:如何识别我关注的用户或从其他人的关注者中关注我的用户?
- javascript - 使用 Freeze Table jQuery 插件的 HTML 表的粘性左列中遇到奇怪的填充问题
- laravel - Laravel 验证值列表中数组中的值
- date - Mule 4 - 将日期时间解析为 DD/MM/YYYY 24HH:MM:SS 格式?
- swift - scrollViewDidScroll 未在具有自定义布局的 CollectionView 中调用
- javascript - 使用 javascript 正则表达式替换时忽略 html 实体
- user-interface - Custom Shape in Flutter