使用React Hook Form提交表单后如何将数据同步到AlbumList组件展示
问题根因
- 你代码中自定义的
cover/name/artist/year四个state变量没有和表单输入做绑定,也没有任何更新逻辑,始终是空值,你构造新专辑对象时用了这些空值,自然传递给列表的都是无效数据 - React Hook Form已经将所有表单输入的结果收集到
onSubmit回调的第一个参数data中,不需要额外自己维护state - 文件类型的输入值是File对象,不能直接作为img标签的src属性使用,需要转换为本地临时URL才能正常渲染
修复步骤
- 删除
AddAlbum组件中无用的四个state定义:
// 直接删掉下面这四行代码即可 const [cover] = useState(); const [name] = useState(''); const [artist] = useState(''); const [year] = useState('');
- 修改
onSubmit逻辑,从data中取表单值,处理文件字段:
const onSubmit = (data, e) => { console.log(data, e); // 处理封面文件,转成可渲染的临时URL const coverUrl = URL.createObjectURL(data.cover[0]); const newAlbum = { id: albums.length + 1, cover: coverUrl, name: data.name, // 对应你表单中名称输入框register的参数名 artist: data.artist, // 对应你表单中艺术家输入框register的参数名 year: data.year, // 对应你表单中年份输入框register的参数名 }; addAlbum(newAlbum); history.push('/'); };
- 修复
AlbumList组件的JSX语法问题:- 把HTML属性
class改成React规范的className - img标签改写成JSX要求的单标签写法:
<img src={album.cover} alt="album cover" /> - 把HTML属性
额外提示
如果后续需要持久化存储专辑信息,本地临时的ObjectURL会在页面刷新后失效,这时你需要把文件上传到服务器或者转成base64格式存储。
内容的提问来源于stack exchange,提问作者bexarKnuckles
相关产品推荐
相关产品推荐

