我目前正在尝试使用展开运算符将项目推送到 React 中的数组中,但是收到以下错误。
该错误发生在 PlacesForm.jsx 内的 PhotoUploader 组件中。我已将代码包含到下面的组件中。
PlacesForm.jsx:
import axios from 'axios'
import React, { useEffect, useState } from 'react'
import { useNavigate, useParams } from 'react-router-dom'
import AccountNav from './AccountNav'
import Perks from './Perks'
import PhotosUploader from './PhotosUploader'
function PlacesForm() {
const {id} = useParams()
const [title, setTitle] = useState("")
const [address, setAddress] = useState("")
const [addedPhotos, setAddedPhotos] = useState([]) //state in question
const [description, setDescription] = useState("")
const [perks, setPerks] = useState([])
const [extraInfo, setExtraInfo] = useState("")
const [checkIn, setCheckIn] = useState("")
const [checkOut, setCheckOut] = useState("")
const [maxGuests, setMaxGuests] = useState(1)
useEffect(() => {
if (!id) return
const getPlace = async () => {
try {
const {data} = await axios.get(`/places/${id}`)
setTitle(data.title)
setAddress(data.address)
setAddedPhotos(data.addedPhotos)
setDescription(data.description)
setPerks(data.perks)
setExtraInfo(data.extraInfo)
setCheckIn(data.checkIn)
setCheckOut(data.checkOut)
setMaxGuests(data.maxGuests)
} catch (e) {
console.log(e)
}
}
getPlace()
}, [id])
const navigate = useNavigate()
const inputHeader = (text) => {
return (
{text}
)
}
const inputDescription = (text) => {
return (
{text}
)
}
const preInput = (header, description) => {
return (
<>
{inputHeader(header)}
{inputDescription(description)}
>
)
}
const handleSubmit = async (e) => {
e.preventDefault()
const placeData = {
title,
address,
addedPhotos,
description,
perks,
extraInfo,
checkIn,
checkOut,
maxGuests
}
if (id) {
//update
try {
const res = await axios.put('/places', {
id,
...placeData,
})
navigate('/account/places')
} catch (error) {
console.log(error)
}
} else {
//create new place
try {
const res = await axios.post('/places', placeData)
navigate('/account/places')
} catch (error) {
console.log(error)
}
}
}
return (
<>
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
在React中,一般不建议传递状态更新函数
这样做的一个原因是它可能导致不必要的重新渲染并使代码更难以推理。如果子组件接收 setAddedPhotos 函数作为 prop 并调用它,它将触发父组件中的状态更新,进而触发父组件及其所有子组件的重新渲染。如果组件树很大和/或状态频繁更改,这可能会成为问题,因为它可能导致大量不必要的重新渲染。
另一个原因是它可能违反封装原则,而封装原则是使用 React 的主要好处之一。封装意味着每个组件应该有自己独立的状态和行为,并且不应该直接修改其父组件或兄弟组件的状态。当子组件接收状态更新器函数作为 prop 时,它可以访问并修改其父组件的状态,这可能会使推理组件树的行为变得更加困难。
而不是将 setAddedPhotos 函数传递给子组件。你可以像这样传递行为函数。
import React from 'react'; function PlacesForm() { const [addedPhotos, setAddedPhotos] = useState([]); const handleAddedPhotos = (newStates) => { setAddedPhotos(prev => [...prev, ...newStates]); }; return (
);
}
function PhotosUploader({ addedPhotos, handleAddedPhotos }) {
const uploadPhoto = async (e) => {
const files = e.target.files
const data = new FormData()
for (let i = 0; i >
);
}