umijs / umi

A framework in react community ✨
https://umijs.org
MIT License
15.3k stars 2.65k forks source link

[Bug] history.push当前路由,改了下query参数,但是当前组件没有渲染 #10291

Closed henryzp closed 1 year ago

henryzp commented 1 year ago

What happens?

umi4,使用history.push方法,url是当前的url,改变了query参数。。希望组件能得到渲染,但事实上没渲染

Mini Showcase Repository(REQUIRED)

Please provide a minimal reproduction then upload to your GitHub. 请提供 最小重现,并上传到你的 GitHub 仓库

https://github.com/henryzp/my-umi4-test

点击按钮,会发现并没有打印

How To Reproduce

Steps to reproduce the behavior: 1. 2.

Expected behavior 1. 2.

umi3是正常的,在umi4下我通过加了一个useSearchParams的hooks,也可以解决这个问题。

但是我现在在做umi3升级umi4的工作,不确定这样的页面组件会有这样的问题。所以想问一下是否有全局的配置,还是只能够每个路由组件去加上上面提到的hooks?

Context

fz6m commented 1 year ago

react router v6 里没有 history 了,所以 umi4 的 history 是外置的,不可变的,不会触发重渲染,可以用 react router v6 的指定切换路由方法 useNavigate

import { useNavigate } from 'umi'
const nav = useNavigate()

nav({ search: '?a=1' })
henryzp commented 1 year ago

@fz6m ,问题是我不知道怎么的组件要改多少个地方。。

老代码系统特别庞大啊,之前用的一直是umi3呢。。。有没有一个统一的设置入口来进行处理?不然要改的地方,找到一处改一处,有一定的隐患

fz6m commented 1 year ago

在顶层 layout 里用 fullpath 处理一下:

import { useLocation } from 'umi';

export default function Layout() {
  const location = useLocation()
  const fullpath = location.pathname + location.search

  return (
    <div>
      <Outlet key={fullpath} />
    </div>
  );
}
henryzp commented 1 year ago

thx,回头我试试发自我的手机

pangxzi commented 1 year ago

react router v6 里没有 history 了,所以 umi4 的 history 是外置的,不可变的,不会触发重渲染,可以用 react router v6 的指定切换路由方法 useNavigate

import { useNavigate } from 'umi'
const nav = useNavigate()

nav({ search: '?a=1' })

我的路由是这这样的,nav('/user/123') 更换了id组件也没有重新渲染 image

fz6m commented 1 year ago

需要给一个最小复现。