跳到主要内容

react-router 前端路由传参方式

场景: 通过点击进入页面 url:tree/id,不是固定的路由,通过点击进入新页面的时候传递 treeId。

方案:

使用 state/query 传参的方式

  • router 设置:<Route path="/tree/:key" component={xx} />
  • 页面使用:
//起始页面
const From = (props) => {
const history = useHistory();
const handleClick = () => {
history.push({ pathname: "/tree/" + key, treeData:data });
//pathname是路由地址
//treeData是你传递给下个页面的参数,之前只能叫state,现在自定义名字

//也可以直接使用Link组件
return(<Link to={{pathname: "/tree/" + key, treeData}}>)
};
};

//目标页面

const To = (props)=>{
const treeData = props.location.treeData//读取到的参数
return <></>
}

可以传递对象,不是明文传递。但页面刷新则读不到 prop.location 上的参数,参数丢失。开始使用的这种方式,但由于刷新丢失参数的问题,选择了下一种使用 params 的方式。【哈希路由的情况下,参数丢失】在 hashRouter 情况下刷新会丢失参数,在 browerRouter 下刷新不会丢失参数。

使用 params 传参的方式

  • router 设置:<Route path="/tree/:key" component={xx} />,与上面一致
  • 页面使用,同上用 history 或 Link,不传 treeData,只有 path 起始页面: <Link to={{ pathname: "/treeStructure/" + key }}> 目标页面:const key = this.props.match.params.key,hook 方式使用useParams

只能传递字符串,且只能放在 url 上,明文传递。页面刷新不会丢失参数。可以传多个参数,也可以使参数可选。path="/tree/:key/:page?"


  • 搜到的相关内容总是提到 withRouter HOC,在这里记录下:

    路由组件(直接与路由相连),拿到路由的参数,可以直接从 props.history/location 中拿到,而非路由组件,不能直接获取路由的参数,需要用 withRouter 包裹,才能拿到路由中的这些属性。

Reference: