代码之家  ›  专栏  ›  技术社区  ›  George Mauer

react router如何在刷新页面时保持位置状态?

  •  7
  • George Mauer  · 技术社区  · 6 年前

    我只是很困惑。

    /product 然后,在您填写了一段时间后,url将转移到 /product/123

    所以基本上我有

    <Route path={`/product`} exact component={CreateProduct} />
    

    <Route exact={true} path="/product/:productId" render={({
          match: {params: {productId}},
          location: {state: {data}={}}
      }) => (
        <EditProduct productId={productId} initialData={data} 
      )} />
    

    const id = await apiFetch(`/api/product`, data, {method: `POST`})
    this.props.history.push({pathname: `/product/${id}`, state: {data} })
    

    <EditProduct> 我拥有的组件

    constructor({productId, initialData}) {
       this.super()
       this.state = {}
       if(initialData)
         this.setState({data: initialData})
       else
         getProduct(productId).then(({data}) => this.setState({data}))
    }
    

    通过这样做,初始数据进入 < 是从 <CreateProduct>

    我现在可以继续编辑 <编辑产品> initialData undefined

    但是

    如果我代替 原作 制表符 事情变得很奇怪。保存后累积的任何更改都将丢失。在调试器中深入研究我发现问题在于 初始数据 location.state.data 对象不是空的-它是产品首次创建时的初始对象。

    那么它到底是从哪里来的呢?我只是做了一个完整的页面刷新(即使是没有打开缓存和devtools的“硬”刷新)。该数据不在URL中(事实上,将URL粘贴到同一窗口中的另一个选项卡中并不存在此问题)。

    我知道的唯一一种机制可以跨刷新保存数据,但不能保存到像这样的新选项卡 sessionStorage ,但当我在控制台中检查时,我被告知

    > sessionStorage
    < Storage {length: 0}
    

    我甚至认为react router可能在页面卸载之前和加载之后操作会话存储,但是在javascript包的第一行中断显示了完全相同的事情。

    那么,这种坚持到底是怎么发生的呢!?

    0 回复  |  直到 6 年前
        1
  •  1
  •   pederk    5 年前

    我有一个非常相似的问题,同样的困惑。

    解决了它 window.history.replaceState()

    我有一个简单的搜索表单,它重定向到第二页,并使用路由器的位置状态在第二页重新填充搜索输入。

    在我的案例中,这发生在:

    1. 在第一页上搜索“foo”->重定向到第二页,然后查看“foo”的搜索+结果。
    2. 点击刷新。期待?要么是空的搜索栏,要么是搜索+结果的“栏”。->相反,请参阅“foo”(??)

    我解决这个问题的方法是,每次用户在第二页进行搜索时,我都使用 window.history.replaceState