React - Невозможно прочитать свойства неопределенного (чтение 'params')
Подобный вопрос об этом же учебнике уже задавался здесь. К сожалению, это более продвинутая часть учебника, и я, похоже, не понимаю этого
Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'params')
at fetchProduct (ProductScreen.js:16:1)
at ProductScreen.js:19:1
at commitHookEffectListMount (react-dom.development.js:23150:1)
at commitPassiveMountOnFiber (react-dom.development.js:24926:1)
at commitPassiveMountEffects_complete (react-dom.development.js:24891:1)
at commitPassiveMountEffects_begin (react-dom.development.js:24878:1)
at commitPassiveMountEffects (react-dom.development.js:24866:1)
at flushPassiveEffectsImpl (react-dom.development.js:27039:1)
at flushPassiveEffects (react-dom.development.js:26984:1)
at performSyncWorkOnRoot (react-dom.development.js:26076:1)
Мой ProductScreen.js:
function ProductScreen({ match }) {
const [product, setProduct] = useState([])
useEffect(() =>{
async function fetchProduct() {
const { data } = await axios.get(`/api/products/${match.params.id}`)
setProduct(data)
}
fetchProduct()
},[])
My App.js:
function App() {
return (
<Router>
<Header />
<main className="py-5">
<Container>
<Routes>
<Route path='/' element={<HomeScreen />} exact/>
<Route path='/product/:id' element={<ProductScreen />} />
</Routes>
</Container>
</main>
<Footer/>
</Router>
);
}
export default App;
Спасибо за помощь!
Проблема связана с match
реквизитом. Не совсем понятно, откуда вы это взяли. Чтобы лучше ответить на этот вопрос, может быть, вы можете добавить ссылку, например, на codesandbox или что-то подобное, где мы можем воспроизвести проблему.
Если вы используете react-router-dom
(react-router 6), то вы можете сделать что-то вроде этого.
import { useParams } from "react-router-dom";
function ProductScreen() {
const [product, setProduct] = useState([])
const { id } = useParams();
useEffect(() =>{
async function fetchProduct() {
const { data } = await axios.get(`/api/products/${id}`)
setProduct(data)
}
fetchProduct()
},[])
return (<div></div>);
}