import React, { useEffect, useState } from 'react' // DO NOT DELETE import { BreedsSelect } from './BreedsSelect' export const DogListContainer = () => { const [breedsurl, setBreedsurl] = useState() const fetchImages = async breed => { const response = await fetch( `https://dog.ceo/api/breed/${breed}/images/random/12`, ) const data = await response.json() setBreedsurl(data.message) } const [breeds, setBreeds] = useState({}) useEffect(() => { const fetchAll = async () => { try { const data = await fetch('https://dog.ceo/api/breeds/list/all') if (!data.ok) throw new Error('error') return data } catch (error) { return error } } fetchAll() .then(res => res.json()) .then(data => { setBreeds(data.message) }) }, []) return ( <div> <BreedsSelect breeds={breeds} onFormSubmit={fetchImages} /> <div className="columns is-vcentered is-multiline"> {breedsurl?.map(url => { return ( <div key={url} className="column is-3"> <Image src={url} /> </div> ) })} </div> </div> ) }
import React, { useState } from 'react' export const BreedsSelect = props => { const [selectedBreed, setSelectedBreed] = useState(null) function handleSubmit(event) { event.preventDefault() props.onFormSubmit(selectedBreed) } const options = props.breeds return ( <div> <form onSubmit={handleSubmit}> <select value={selectedBreed} onChange={e => setSelectedBreed(e.target.value)} > {Object.keys(options).map(breed => ( <option value={breed}>{breed}</option> ))} </select> <button type="submit">表示</button> </form> </div> ) }
I would like to have a “View” button next to the dropdown that, when clicked, displays a list of images for the dog breed selected in the dropdown.
- Place a “Show” button next to the dropdown.
- When the “Display” button is clicked, get the image list of the dog breed selected in the dropdown using the Dog API.
- Depending on the dog breed, more than 100 records will be returned, so limit the number of records to be acquired (eg: 12 records).
- Use useState to manage the obtained list in state (write the definition of state in DogListContainer)
- Based on the acquired dog breed image list, display the images as a list.
I thought of the above two codes to realize this, but I get the error Failed to construct ‘Image’: Please use the ‘new’ operator, this DOM object constructor cannot be called as a function. How can I resolve it?
Advertisement
Answer
Your Image
tag should be in lowercase img
.
or if you are using NextJs import Image from "next/image"
return ( <div> <BreedsSelect breeds={breeds} onFormSubmit={fetchImages} /> <div className="columns is-vcentered is-multiline"> {breedsurl?.map(url => { return ( <div key={url} className="column is-3"> <img src={url} /> //here </div> ) })} </div> </div> )