You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中matchUrl变量变化时如何更新useState 路由跳转后状态保留旧值

问题根因

useState 的初始值仅在组件首次挂载时计算赋值一次,后续组件因props变化重新渲染时,不会自动更新state的取值。你场景中路由跳转后match.params.name发生变化,组件重新渲染但listNames状态仍保留首次挂载时的旧值,因此出现不同步的问题。

解决方案

添加useEffect监听matchUrl的变化,当路由参数更新时主动重置listNames的状态值,同时修正原代码中的语法错误即可,修改后的完整代码如下:

import React, {useState, useEffect} from 'react'
import useInfinityScroll from './hooks/useInfinityScroll'
// 修正拼写错误 form -> from
import names from './data/names'    

function TableList({ match }) {
   let matchUrl = match.params.name

   const dataMatch = names.filter(name => name.occupation === matchUrl)

   const [listNames, setListNames] = useState(dataMatch.slice(0, 10))

   const [isFetching, setIsFetching] = useInfinityScroll(fetchMoreListItems) 

   // 新增useEffect监听matchUrl变化,同步更新state
   useEffect(() => {
     setListNames(dataMatch.slice(0, 10))
   }, [matchUrl])

   function fetchMoreListItems() {
    // 修正语法错误 缺少箭头函数标识
    setTimeout(() => {
      setListNames([...dataMatch.slice(0, 20)])
      setIsFetching(false)
    }, 2000)
   }

   return (
     <>
       <h1>{matchUrl}</h1>
       <div>
         {listNames.map(item => <Table key={item.id} name={item} />)}
       </div>
     </>
   )
}

export default TableList

额外优化说明

原渲染逻辑中listNames已经是按matchUrl筛选后的数据集,不需要在渲染时再次加过滤条件,直接遍历即可。

内容的提问来源于stack exchange,提问作者shanksu 218

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 12:21:03