使用反应挂钩表单提交后显示输入
Display input after submit using react hook form
我在 AddAlbum
组件中有一个反应挂钩表单。提交输入后,我可以在控制台中看到该对象,但我不知道如何提取此信息以将其显示在 AlbumList
组件中。我有 initialState
显示所有内容(图像、名称、艺术家、年份),但是当我尝试显示我的输入时,我看到的只是一张空卡片,上面有我图像中的 alt
文本。
import React, { useState, useContext } from 'react';
import { useForm } from 'react-hook-form';
import { ErrorMessage } from '@hookform/error-message';
import { Link, useHistory } from 'react-router-dom';
import { GlobalContext } from '../context/GlobalState';
export const AddAlbum = () => {
let history = useHistory();
const { addAlbum, albums } = useContext(GlobalContext);
const [cover] = useState();
const [name] = useState('');
const [artist] = useState('');
const [year] = useState('');
const onSubmit = (data, e) => {
console.log(data, e);
const newAlbum = {
id: albums.length + 1,
cover,
name,
artist,
year,
};
addAlbum(newAlbum);
history.push('/');
};
const {
register,
handleSubmit,
formState: { errors },
} = useForm();
return (
<React.Fragment>
<div className="w-full max-w-sm container mt-20 mx-auto">
<form onSubmit={handleSubmit(onSubmit)}>
<div className="w-full mb-5">
<label
className="block uppercase tracking-wide text-gray-700 text-xs font-bold mb-2"
htmlFor="cover"
>
COVER
</label>
<input
className="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:text-gray-600"
type="file"
{...register('cover', { required: true })}
/>
</div>
...
<div className="flex items-center justify-between">
<button
className="mt-5 bg-green-400 w-full hover:bg-green-500 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline"
type="submit"
>
Add Album
</button>
</div>
</div>
</form>
</div>
</React.Fragment>
);
};
这是 AlbumList
组件...
import React, { useContext } from 'react';
import { Link } from 'react-router-dom';
import { GlobalContext } from '../context/GlobalState';
export const AlbumList = () => {
const { albums, removeAlbum } = useContext(GlobalContext);
return (
<React.Fragment>
{albums.length > 0 ? (
<React.Fragment>
{albums.map((album) => (
<div class="bg-white shadow p-3 m-3 rounded lg:w-64">
<div>
<img src={album.cover} alt="album cover"></img>
</div>
...
</React.Fragment>
) : (
<p className="text-center bg-gray-100 text-gray-500 py-5">
Add an album!
</p>
)}
</React.Fragment>
);
};
你必须像这样设置对象...
const onSubmit = (data, e) => {
const newAlbum = {
id: albums.length + 1,
cover: data.cover,
name: data.name,
artist: data.artist,
year: data.year,
};
addAlbum(newAlbum);
history.push('/');
};
或者你可以这样做
const onSubmit = (data, e) => {
const newAlbum = {
id: albums.length + 1,
...data,
};
addAlbum(newAlbum);
history.push('/');
};
我在 AddAlbum
组件中有一个反应挂钩表单。提交输入后,我可以在控制台中看到该对象,但我不知道如何提取此信息以将其显示在 AlbumList
组件中。我有 initialState
显示所有内容(图像、名称、艺术家、年份),但是当我尝试显示我的输入时,我看到的只是一张空卡片,上面有我图像中的 alt
文本。
import React, { useState, useContext } from 'react';
import { useForm } from 'react-hook-form';
import { ErrorMessage } from '@hookform/error-message';
import { Link, useHistory } from 'react-router-dom';
import { GlobalContext } from '../context/GlobalState';
export const AddAlbum = () => {
let history = useHistory();
const { addAlbum, albums } = useContext(GlobalContext);
const [cover] = useState();
const [name] = useState('');
const [artist] = useState('');
const [year] = useState('');
const onSubmit = (data, e) => {
console.log(data, e);
const newAlbum = {
id: albums.length + 1,
cover,
name,
artist,
year,
};
addAlbum(newAlbum);
history.push('/');
};
const {
register,
handleSubmit,
formState: { errors },
} = useForm();
return (
<React.Fragment>
<div className="w-full max-w-sm container mt-20 mx-auto">
<form onSubmit={handleSubmit(onSubmit)}>
<div className="w-full mb-5">
<label
className="block uppercase tracking-wide text-gray-700 text-xs font-bold mb-2"
htmlFor="cover"
>
COVER
</label>
<input
className="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:text-gray-600"
type="file"
{...register('cover', { required: true })}
/>
</div>
...
<div className="flex items-center justify-between">
<button
className="mt-5 bg-green-400 w-full hover:bg-green-500 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline"
type="submit"
>
Add Album
</button>
</div>
</div>
</form>
</div>
</React.Fragment>
);
};
这是 AlbumList
组件...
import React, { useContext } from 'react';
import { Link } from 'react-router-dom';
import { GlobalContext } from '../context/GlobalState';
export const AlbumList = () => {
const { albums, removeAlbum } = useContext(GlobalContext);
return (
<React.Fragment>
{albums.length > 0 ? (
<React.Fragment>
{albums.map((album) => (
<div class="bg-white shadow p-3 m-3 rounded lg:w-64">
<div>
<img src={album.cover} alt="album cover"></img>
</div>
...
</React.Fragment>
) : (
<p className="text-center bg-gray-100 text-gray-500 py-5">
Add an album!
</p>
)}
</React.Fragment>
);
};
你必须像这样设置对象...
const onSubmit = (data, e) => {
const newAlbum = {
id: albums.length + 1,
cover: data.cover,
name: data.name,
artist: data.artist,
year: data.year,
};
addAlbum(newAlbum);
history.push('/');
};
或者你可以这样做
const onSubmit = (data, e) => {
const newAlbum = {
id: albums.length + 1,
...data,
};
addAlbum(newAlbum);
history.push('/');
};