【问题标题】:Re-Calling a react hook after a function is executed执行函数后重新调用反应钩子
【发布时间】:2020-09-12 21:12:21
【问题描述】:

我是反应钩子的新手,我有一个钩子函数,它从 API 接收一系列数据以显示在列表中:

function useJobs () {
  const [jobs, setJobs] = React.useState([])
  const [locations, setLocations] = React.useState({})
  const [departments, setDepartments] = React.useState({})
  const [tags, setTags] = React.useState({})

  React.useEffect(() => {
    fetchJSON('/api/jobs/list-jobs', { headers: headers })
      .then(setJobs)
  }, [])
  React.useEffect(() => {
....
  return [jobs, locations, departments, tags]
}

我还有另一个功能可以在按下按钮时删除作业:

function DeleteJob (jobid) {
  console.log('deletejob fired')
  console.log(jobid)
  axios({
    method: 'delete',
    url: '/api/jobs/delete-job/' + jobid,
    headers: headers
  })
}

...

export default function Jobs () {
  const classes = useStyles()
  const [jobs, locations, departments, tags] = useJobs()
  return (
      ...
{jobs.map(job => (
......
 <IconButton aria-label='delete' style={{ color: 'red' }} variant='outlined' onClick={() => DeleteJob(job.id)}>
                     <DeleteIcon />
 </IconButton>

问题是 DeleteJob 函数执行正确,我的作业被删除,但我的屏幕没有实时更新,需要刷新才能显示新数据。如何让我的useJob() 钩子在 DeleteJob 函数执行后接收新数据(作业)?

【问题讨论】:

  • 为什么你有两个useEffect 电话?
  • 我有多个,一个接收作业,另一个根据作业信息持有其他功能的异步函数

标签: javascript reactjs react-hooks use-effect use-state


【解决方案1】:

您的 DeleteJobs 函数还需要从状态中删除作业值,因为您的服务器数据仅在初始渲染时获取。为此,您可以从自定义钩子中公开一个方法并在调用 DeleteJobs 时使用它

function useJobs () {
  const [jobs, setJobs] = React.useState([])
  const [locations, setLocations] = React.useState({})
  const [departments, setDepartments] = React.useState({})
  const [tags, setTags] = React.useState({})

  const deleteJob = (id) => { // function that removes job from state
      setJobs(prevJobs => prevJobs.filter(job => job.id !== id));
  }
  React.useEffect(() => {
    fetchJSON('/api/jobs/list-jobs', { headers: headers })
      .then(setJobs)
  }, [])

  ....
  return [jobs, locations, departments, tags,deleteJob]
}


function DeleteJob (jobid) {
  console.log('deletejob fired')
  console.log(jobid)
  axios({
    method: 'delete',
    url: '/api/jobs/delete-job/' + jobid,
    headers: headers
  })
}

export default function Jobs () {
  const classes = useStyles()
  const [jobs, locations, departments, tags, deleteJob] = useJobs()
  return (
      ...
      {jobs.map(job => (
      ......
       <IconButton 
          aria-label='delete'
          style={{ color: 'red' }} 
          variant='outlined' 
          onClick={() => { 
              DeleteJob(job.id); 
              deleteJob(job.id); // locally delete from state
          }}
       >
           <DeleteIcon />
       </IconButton>

      ...
  )
}

【讨论】:

  • 不幸的是,我删除它后仍然没有更新。它仍然需要刷新
  • 您是否正确定义和调用了deleteJob?因为如果你这样做,你会看到状态被正确更新
  • const deleteJob = (id) => { setJobs(prevJobs => prevJobs.filter(job => job.id === id)) }
  • 也叫它onClick={() =&gt; { DeleteJob(job.id); deleteJob(job.id); // locally delete from state }}
  • onClick={() => { DeleteJob(job.id) deleteJobs(job.id) }}
猜你喜欢
  • 1970-01-01
  • 2021-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-29
  • 2020-12-02
  • 2021-03-19
  • 1970-01-01
相关资源
最近更新 更多