重定向到新选项卡时通过链接传递状态

IT技术 reactjs react-router
2021-04-28 15:07:29

情况 1: 重定向到同一选项卡中的新路由。

<Link to={{ pathname: "/modify_items", state: { foo: "bar" } }} >

当我输入时console.log(this.props.location.state);,状态{ foo: "bar" }会被打印出来。

情况 2: 重定向到新选项卡中的新路由。

<Link to={{ pathname: "/modify_items", state: { foo: "bar" } }} target="_blank" >

当我输入时console.log(this.props.location.state);,状态变为undefined.

我的目标是将数据传递到新选项卡。如果在 React.js 中还有其他方法可以实现这一点,请指导我。我只想将数据传递到新选项卡。

3个回答

我认为这在链接状态下是不可能的。因为如果您离开该页面,您的记忆将是干净的。如果您想在不同的选项卡上共享状态,您可能需要使用查询或路径参数。

对于路径参数: 在 react-router v4 中获取路径参数

对于查询变量:设置链接如下:

<Link to={{ pathname: '/foo', query: { foo: "bar" } }}/>

并使用一个库来获取查询参数。例如https://www.npmjs.com/package/query-string

不可能通过React Router.

但是您可以localStorage在重定向到新选项卡之前在那里保存一些内容,然后检查localStorage新选项卡上是否存在某些内容

由于_blank打开了一个新选项卡,因此它是您的应用程序的另一个实例,即使该应用程序是同一个应用程序,内部也有所不同。但是您可以使用类似localStorage.

由于它们将被持久化并为同一来源共享,因此您可以在应用程序的新选项卡或任何选项卡或窗口中访问它。您需要在组件安装中或在第一次渲染之后查询它,并useEffect使用第二个参数可能是空数组[]. 如果你使用钩子,请查看 React 文档。

另一种方法是使用querystring. 您可以从打开的组件实例接收查询字符串。

我相信您可以使用任何其他持久机制,例如Indexed DBCookies等。

在伞式网络消息传递下,我想到了其他一些方法;您可以使用的广播频道 APIWindow.postMessage频道消息 API

如果您的状态相对较小,使用查询字符串可能会更好,或者 localStorage 是最简单的方法。如果您的数据更大,您可以使用索引数据库。它是异步的。只有在完成写入时要小心,然后才能在新窗口、选项卡中获取它。

在持久性用例中,在导航之前写入持久性,如果它是异步的,则在导航之前等待写入过程(通过在特定用例中打开新选项卡/窗口)。

人们可以通过右键单击并从上下文菜单中选择来导航到新选项卡。在这种情况下,页面可见性 API可以在 React 效果中的右键单击页面上使用(将其效果附加到 React 效果中,并为 React 效果提供一个空的第二个参数),并且数据可以再次写入持久性机制,上述之一提到的,其余的我的意思是打开选项卡中的操作将是相同的。

由于写入机制可能会延迟,即使它是同步的,如果不是以编程方式打开新选项卡,则可能会在写入完成之前发生。在这种情况下,打开选项卡的 React 效果读取写入的数据可能会提前读取。要绕过这些解决方法,例如setTimeout可以简单地使用等待读取,但是,编程正确且有保证的定时方式将使用我上面提到的适当的 Web 消息传递 API 之一例如Broadcast ChannelpostMessageChannel Messaging API