有没有任何方法可以在路由器中传递id而不在URL中提及。就像下面的路由一样,它的URL将有一个idabc.com/abc/1
<Route exact path="/abc/:vid" component={AbcComponent} />
我希望URL是abc.com/abc
,并且id
应该在AbcComponent
中可用。我尝试了以下,但我在App.js中没有ID可以通过。
<Route exact path="/SpRides"
render={(props) => <SpRides vid={vid} spId={spId} depId={depId} {...props} />} />
如果您真的不希望id显示在url中(既不作为查询字符串也不作为哈希(,我认为唯一的解决方案是将其设置为位置状态:https://reactrouter.com/web/api/location
您可以设置通过链接";至";道具作为对象:https://reactrouter.com/web/api/Link/to-object
这里有一个函数方法来解决它:
你可以通过";状态";prop(它将在历史中推送状态(,然后使用useLocation((钩子在目标组件中访问它。
<Link to='/abc/' state={{ id:your-id }}>
click here
</Link>
现在在App.js:中
<Route exact path="/abc" component={AbcComponent} />
然后在AbcComponent文件中:
import { useLocation} from 'react-router-dom';
const AbcComponent= () => {
const location = useLocation();
console.log({location });
return <div> the id is : {location.state.id }</div>;
export default AbcComponent;
奖金:
您也可以像往常一样添加查询参数,并使用useParams((访问它。只需在链接中添加一个状态道具。在AbcComponent中,使用useParams((和useLocation((来获取参数和状态。
喜欢@sohaib Nasir给出的答案。在此基础上,我使用了以下解决方案。
-
在功能组件中添加下面的代码,该代码将由点击按钮触发
props.history.push({pathname: '/abc', state: { id: 'some_value' }})
-
在目标组件中添加以下内容
this.props.location.state.id
访问变量 -
然后使用
useEffect
将变量保存在localStorage
中。这也解决了在出现问题时保持状态的问题。解决了@S0haib Nasir提到的关于刷新的缺陷。
您可以使用:
<Route exact path="/abc/:vid?" component={AbcComponent} />