开发者问题收集

React Hooks 按 ID 查找并返回无法读取未定义的属性“params”

2021-08-09
503

我正在尝试学习 React Hooks,因为它似乎是事情未来发展的方向,我想与时俱进。我已经研究了几个小时,试图弄清楚到底发生了什么。在 React Dev Tools 中,我甚至没有看到任何组件,这让我相信我显然是无能的,没有在代码中正确传递某些内容。我真的尽了最大的努力重新开始,我已经用尽了 YouTube、谷歌和 Stack Overflow 文章上的资源。我现在已经不知所措,崩溃了,求助哈哈。

问题:

我正尝试使用简单的 GET by ID 请求从后端获取一项任务。错误消息是:TypeError:无法读取未定义的属性“params”。

我的代码:

import React, { useEffect, useState } from 'react';
import axios from 'axios';

function SingleTask (props) {
//Setting state
const initialTaskState = {
    _id: "",
    title: "",
    created_by: "",
    description: "",
    __v: 0
}

const [singleTask, setTask] = useState(initialTaskState)

//Axios GEt request to pull by ID from the DB
const fetchSingTask = (id) => {
    axios.get(`/api/tasks/${id}`, id)
    .then((res) => {
        setTask(res.data)
        console.log(res.data)
    })
    .catch (err => {
        console.log(err)
    })
}

useEffect(() => {
    fetchSingTask(props.match.params.id)
}, [props.match.params.id]) 

return(
    <div>
        <h1>
            {singleTask.title}
        </h1>
    </div>
)
}

export default SingleTask;

我尝试了多种方式来传递 ID,但似乎都没有用。我真的很困惑,如果大家能给我一些见解,我将不胜感激。我非常有信心,如果我能让它工作起来,我就能搞清楚 PUT 和 DELETE。我可以使用类组件轻松完成这项工作,但总的来说,我对这个还很陌生,如果大家能给我一些见解,我将不胜感激。

编辑 App.js:

import './App.css';
import AllTasks from './components/AllTasks';
import AddTask from './components/AddTask';
import SingleTask from './components/SingleTask';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';


function App() {

  return (
    <Router>
      <div>
        <Switch>
          <Route exact path="/">
            <AllTasks />
          </Route>
          <Route exact path="/create">
            <AddTask />
          </Route>
          <Route exact path="/task/:id">
            <SingleTask />
          </Route>
        </Switch>
      </div>
    </Router>
  )
}

export default App;
1个回答

假设您正在使用 react-router 和 React Hooks,那么您应该使用 useParams()

示例 - 这是您的路线: <Route exact path="/task/:id"> ,因此在这种情况下,使用 const { id } = useParams() 。现在,如果您执行 console.log(id) ,它将为您提供该网址的确切 ID。

解决方案:

import React, { useEffect, useState } from 'react';
import axios from 'axios';
import { useParams } from "react-router-dom"; //import useParams

function SingleTask (props) {
//Setting state
const initialTaskState = {
    _id: "",
    title: "",
    created_by: "",
    description: "",
    __v: 0
}
const { id } = useParams(); //it must equal with your url parameters ( :id )

const [singleTask, setTask] = useState(initialTaskState)

//Axios GEt request to pull by ID from the DB
const fetchSingTask = (id) => {
    axios.get(`/api/tasks/${id}`, id)
    .then((res) => {
        setTask(res.data)
        console.log(res.data)
    })
    .catch (err => {
        console.log(err)
    })
}

useEffect(() => {
    fetchSingTask(id)
}, [id]) 

return(
    <div>
        <h1>
            {singleTask.title}
        </h1>
    </div>
)
}

export default SingleTask;

在此处 了解有关 React Router 和钩子的更多信息

Ala Hamadi
2021-08-09