簡體   English   中英

React.js:如何從表單提交更新 API 調用

[英]React.js: How to update API call from form submit

制作一個天氣應用程序,我正在嘗試從表單提交時更新我的​​ api 調用。 這是我制作自己的程序的第一次嘗試,但我遇到了障礙。 我正在從 useState 設置我的 API 調用,想法是用戶在城市中鍵入,點擊按鈕,API 調用再次運行並顯示來自城市的新數據。 我是程序員的新手,所以我幾乎可以肯定我錯過了一些非常簡單的東西。

import React, { useState, useEffect } from 'react';
import {Card} from 'react-bootstrap';
import Aux from '../../hoc/Aux';
// import classes from './wCard.css';
// import {Button} from 'react-bootstrap';


function WCard () {
        const [city,setCity] = useState('Queens');
        // const key = 'APP_KEY';
        const [feels_like,setFeelsLike] = useState('');
        const [mainTemp,setMainTemp] = useState('');
        const [description,setDescription] = useState('');
        const [main,setMain] = useState('');
        const [iconID,setIconID] = useState('');
        
        // useEffect(() => {
            


        const handleChange = (event) => {
            event.preventDefault()
            setCity(event.target.value)
        }

        const handleSubmit = (event) => {
            event.preventDefault()
            setCity(document.getElementsByName("city")[0].value)
            fetch(
                'https://api.openweathermap.org/data/2.5/weather?q=' + (city) + '&appid&units=imperial'
            )
                .then((res) => res.json())
                .then((data) => {
                    console.log(data);
                    setFeelsLike(data.main.feels_like);
                    setMainTemp(data.main.temp);
                    setDescription(data.weather[0].description);
                    setMain(data.weather[0].main);
                    setIconID(data.weather[0].icon);
                })
        },[city])
        
        
       
    return (
        <Aux>
            <div>
                <label>City</label>
                <form onSubmit={handleSubmit} >
                    <input type="text" placeholder="Ayyy" onChange={handleChange} />
                    <button type="submit">Weather time</button>
                </form>
            </div>

        <div style={{ display:'flex', justifyContent:'center', padding:'5em' }} >
            <Card style={{ width: '24rem', marginTop: '-3em' }}>
                <Card.Img variant="top" src={"http://openweathermap.org/img/wn/" + iconID + "@2x.png"} />
                <h1 style={{ textAlign:'center', color:'#00BFFF' }} >{city}</h1>
                <Card.Body>
                    <Card.Title>{mainTemp}°, feels like {feels_like}°</Card.Title>
                    <Card.Text style={{ textTransform:'capitalize' }} >
                    {description}
                    </Card.Text>
                </Card.Body>
            </Card>
            </div>
        </Aux>
    )    
}

export default WCard;

我相信您的 useEffect 不會再次被調用,因為您傳入了 [] 作為您的依賴項數組。 嘗試做useEffect(..., [city]) 這樣, useEffect 將在city更新時被調用

const handleSubmit = (event) => {
            event.preventDefault()
            setCity(event.target.value.city)
            
        }

有一個錯字。 它應該是 event.target.value 而不是 event.target.value.city

並且不需要 onChange 方法。

正如你現在從 Victor 所說的那樣,如果給定的依賴項發生變化, useEffect 將被調用。

在 useEffect 上使用它

useEffect(..., [city])

而在handleSubmit中存在的問題是event.target是點擊被觸發的地方,所以在這種情況下,按鈕,你必須針對輸入

const handleSubmit = (event) => {
        event.preventDefault()
        setCity(document.getElementsByName("city")[0].value)
    }

其余的代碼沒問題

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM