首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >React.js:仅在刷新页面后才更新组件[Post请求]

React.js:仅在刷新页面后才更新组件[Post请求]
EN

Stack Overflow用户
提问于 2022-02-15 09:46:28
回答 2查看 159关注 0票数 2

嗨,伙计们还没反应过来,正在开发一个小的反应应用程序,用来显示仓鼠的照片。在AddHamster组件中,我有一个Post请求,似乎运行良好;“对象被传递到数据库!”我的问题是,对象只有在刷新页面后才会显示。我需要仓鼠对象直接显示在页面后,按下添加按钮,连接到表单。

有线索吗?

代码语言:javascript
复制
import React, {useState} from "react";
import HamsterCard from './HamsterCard'
import './AddHamster.css';

const AddHamster = () => {


    const [name, setname ] = useState('')
    const [age, setage ] = useState('')
    const [favFood, setfavFood ] = useState('')
    const [imgName, setImgName ] = useState('')
    const [hamsterItems, setHamsterItems] = useState([])
    
        async function handleAddHamster(){

            const newHamster = {
            name: name,
            age: Number(age),
            favFood: favFood,
            imgName: imgName
           }
           console.log(newHamster, 'newHamster')
   
        const response = await fetch('/hamsters ', {method: 'POST',
        headers: {'Content-Type': 'application/json'},
        body: JSON.stringify(newHamster) 
        })
        const data = await response.json()
        console.log(data, "this is a data response");
        if (response.status === 200){
            setHamsterItems([...hamsterItems,name, age, favFood, imgName])
            setname('')
            setage('')
            setfavFood('')
            setImgName('') 
        
        }       
    }

  return(
        <div className="add-todo-wrapper">
            <form onSubmit={(e) => e.preventDefault()}>
            <label>name
                <input type="text" 
                name="id"  
                value={name}
                onChange={e => setname(e.target.value)} />
            </label>
                <label>age
                <input type="text" 
                name="id" 
                value={age}
                onChange={e => setage(e.target.value)} />
            </label>
            <label>favFood
                <input type="text" 
                name="id" 
                value={favFood}
                onChange={e => setfavFood(e.target.value)} />
            </label>
            <label>Image
                <input type="text" 
                name="id" 
                value={imgName}
                onChange={e => setImgName(e.target.value)} />
            </label>
            <div className="message">{hamsterItems ? <p>{[...hamsterItems]}</p> : null}</div>
            </form>
            <button onClick={() => handleAddHamster()}>ADD</button>
            <HamsterCard />
        </div>
        
    )

}
export default AddHamster;
代码语言:javascript
复制
import React, {useState, useEffect} from "react";
import './HamsterCard.css';


const HamsterCard = () => {
    const [hamsters, setHamsters] = useState([])

    useEffect(() => {
        async function get(){
        const response = await fetch('/hamsters', {method: 'GET',})
        const data = await response.json() 
        setHamsters(data)
        console.log(data)
     
        } 
       get()    
    }, []  );
    
    return (
        <div className="container"> 
           <div className="hamster-card">
            {hamsters.map((hamster) => (
            <Hamster hamster={hamster}  
            key={hamster.id} />  
            ))
            }
          </div>
         
        </div>    
     
    )
}

export default HamsterCard;
代码语言:javascript
复制
import React, {useState} from "react";
const Hamster = ({name, age, favFood, hamster}) => {
 
   const [hamsterDeleted, setHamsterDeleted] = useState(false)

    async function deleteHamster(id) {
        const response = await fetch(`/hamsters/${id}`, { method: "DELETE" });
        setHamsterDeleted(true)
    
        }
         return (
                hamsterDeleted ? null : (  
                    <div>
                <button onClick={() => deleteHamster(hamster.id)}>Delete</button>
                <h2>{hamster.name}</h2> 
                <p>Ålder:{hamster.age}</p> 
                <p>Favorit mat:{hamster.favFood}</p> 
                <img src={'./img/' + hamster.imgName} alt="hamster"/> 
                </div>
              ))
        }
    
       
    

export default Hamster;

更改代码后

setHamsterItems(...hamsterItems,姓名,年龄,favFood,imgName)

setHamsterItems(...hamsterItems,newHamster)

我收到以下错误消息:

EN

回答 2

Stack Overflow用户

发布于 2022-02-15 10:33:16

在AddHamster组件中,当您更新hamsterItems时,它会呈现整个组件,但是在Hamstercard中,您将使用useEffect从数据库中获取最新仓鼠,该数据库仅在HamsterCard组件首次挂载以重新呈现HamsterCard时运行,您必须在useEffect of HamsterCard中添加一些依赖项,所以每次单击add按钮时,这将重新呈现HamesterCard。

为此,您可以将hamsterItems作为道具发送到HamsterCard,并将其传递给useEffect依赖数组。

代码语言:javascript
复制
 <HamsterCard hamsterItems={hamsterItems}/>
代码语言:javascript
复制
function HamsterCard({  hamsterItems }) {
代码语言:javascript
复制
  useEffect(() => {
        async function get(){
        const response = await fetch('/hamsters', {method: 'GET',})
        const data = await response.json() 
        setHamsters(data)
        console.log(data)
     
        } 
       get()    
    }, [hamsterItems]  );
票数 0
EN

Stack Overflow用户

发布于 2022-02-15 11:10:55

现在起作用了..。问题是这条线:

代码语言:javascript
复制
<div className="message">{hamsterItems ? <p>{[...hamsterItems]}</p> : null}</div>

试图将一个对象直接呈现到jsx中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71124256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档