React路由器,以编程方式导航时传递数据?

IT技术 reactjs react-router react-redux
2021-03-24 05:51:20

我们可以使用导航到不同的路径

this.props.router.push('/some/path')

有没有办法在导航时发送参数(对象)?

我还能想到其他选择,但想知道是否object有可能通过

  • 我可以嵌入对象的 id 并从新页面从服务器重新获取对象。

  • 或者我可以将对象存储在像 redux 存储这样的全局存储中。(这个对象需要尽快从商店中移除。所以我认为首先把它放在那里可能不太好)

6个回答

React Router 使用location对象。location对象的属性之一state

this.props.router.push({
  pathname: '/other-page',
  state: {
    id: 7,
    color: 'green'
  }
})

在导航到的页面上,当前location将被注入到路由匹配的组件中,因此您可以使用this.props.location.state.

要记住的一件事是,state如果用户直接导航到页面,则没有,因此当数据不存在时,您仍然需要某种机制来加载数据。

也对如何优雅地处理用户直接导航到路由且状态未定义的场景感兴趣。理想情况下,它会渲染加载组件,然后仅在数据可用时将其作为道具传递给组件,因此组件行为可以始终假设所需状态在它需要时存在
2021-05-23 05:51:20
您是否对此任何解决方案? 要记住的一件事是,如果用户直接导航到页面,将没有状态,因此您仍然需要某种机制来在数据不存在时加载数据。
2021-05-24 05:51:20
因此,假设我们有请求数据的PageA,当服务器响应时,PageA 重定向到PageB并将数据传递到那里。但是用户决定直接打开PageB。这是我的解决方案(理论上,我还没有实现它):当 PageB 打开时,它检查是否有状态,如果没有,它从会话(无论是本地会话还是服务器会话)请求数据,如果有那里也没有数据,它重定向回 pageA。
2021-05-31 05:51:20
@MattMazzola 我不确定是否有一种“优雅”的方式,但我只会使用默认道具并使用componentWillMountcomponentDidMount获取数据。location.state尽可能不再使用
2021-06-13 05:51:20
@Anil 有解决方案吗?
2021-06-18 05:51:20

当前的答案已经过时。

react-router 6

使用useNavigate钩子:

const navigate = useNavigate();
navigate('/other-page', { state: { id: 7, color: 'green' } });

然后,您可以通过useLocation钩子访问“/other-page”中的状态数据

const {state} = useLocation();
const { id, color } = state; // Read values passed on state

react-router 4 或 5

调用 history.push,并传递一个对象作为第二个参数来传递状态:

props.history.push('/other-page', { id: 7, color: 'green' }))

然后,您可以通过以下方式访问“/other-page”中的状态数据:

props.location.state

@Suleka_28 - 我只是在答案中添加了该信息。
2021-05-27 05:51:20
如果另一个页面推送其他状态,例如{size: 'big'},所有存储的状态都将被 this 替换{size: 'big'},如何在有效推送另一个状态时保持之前的状态?
2021-06-05 05:51:20
如何从 /other-page 访问状态数据?
2021-06-15 05:51:20

您可以使用 react-router-dom 的 useHistory 钩子。

下面的代码是让您将数据传递到指定的路线,即"/dashboard"

let history = useHistory();

history.push({
            pathname: '/dashboard',
            state:{
                tags: 'your-value' 
            }
    });

“/dashboard”你可以使用 useHistory() 来接收上述数据。

下面的代码用于接收您的数据。

const Dashboard =()=>{

 let {location} = useHistory();

 return (<>{location.state.tags}</>)
}
您可以访问使用 useHistory 挂钩传递的状态。代码示例: let {location} = useHistory(); 控制台日志(位置。状态)
2021-06-07 05:51:20
如何使用History()来接收以上数据,能否给它添加具体的代码?
2021-06-15 05:51:20

对于功能组件,react-router-dom:^5.2.0让我们举一个非常简单的例子来使概念精确

import { useHistory } from "react-router-dom";

  function Sender(){ 
  
  const history = useHistory();

  const goToReceiver = () => {
    history.push("/receiver", { name:'Mr',age:23 });
  }

  return <button onClick={goToReceiver}>Go To Receiver</button>
  }

现在让我们看看数据是怎么来的 receiver route

  import { useLocation } from "react-router-dom";

  function Receiver(){ 
  
  const location = useLocation();

    return <div>
             <p>{location.state.name}</p>
             <p>{location.state.age}</p>
           </div>
  }

在react-router中以编程方式导航时传递查询参数

可以使用 history.push 和 history.replace 以编程方式使用历史对象来更改当前位置。

    history.push('/home?the=query', { some: 'state' })

如果我们将历史对象作为props传递给组件。然后我们可以使用历史对象上可用的react-router方法以编程方式导航。

现在让我们假设您将历史对象作为名为“路由器”的props传递下去。因此,它将在具有基于类的语法的组件内引用,例如:

this.props.router

使用推送或替换时,您可以将 URL 路径和状态指定为单独的参数,也可以将所有内容包含在一个类似位置的对象中作为第一个参数。

this.props.router.push('/some/path?the=query')

或者您可以使用一个类似位置的对象来指定 URL 和状态。这相当于上面的例子。

this.props.router.push({
  pathname: '/some/path',  //path
  search: '?the=query' // query param named 'search'
})

注意 - 当然要确保 this.props.router 实际上是来自 react-router api 的历史对象。