umijs / umi

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

请问 `history.location.pathname` 和 `useLocation` 不一样 有办法全局处理掉吗? #10849

Closed hyzx86 closed 1 year ago

hyzx86 commented 1 year ago

请问 history.location.pathnameuseLocation 不一样 有办法全局处理掉吗?

history.location.pathnameuseLocation 不一样是一些历史问题,目前可以自己把 base 的部分定义成环境变量再自己拼一下或者 trim 下:

// .umirc.ts

export default {
  base: '/some/',
  define: {
      BASE_URL: '/some'
  }
}
  // use
  history.location.pathname.slice(BASE_URL.length)
// typings.d.ts
declare global {
 const BASE_URL: string;
}

文档不用修改,写的没问题,使用 runtimePublicPath 的时候是在 runtime 修改 publicPath ,你这个场景是固定的 publicPath ,所以和这个选项无关。

Originally posted by @fz6m in https://github.com/umijs/umi/issues/10189#issuecomment-1368703068

hyzx86 commented 1 year ago

如果官方不能接受的话 就先用 pnpm patch 处理下了

https://github.com/umijs/umi/pull/9529

fz6m commented 1 year ago

有 Breaking change ,所以现在就先不改了,全用 useLocation 就可以,base 也不是我们需要关注的。

hyzx86 commented 1 year ago

有 Breaking change ,所以现在就先不改了,全用 useLocation 就可以,base 也不是我们需要关注的。

关键 。。useLocation 不是随处可用的。比如 请求拦截的地方 用不了 hook

wenlei0617 commented 11 months ago

有 Breaking change ,所以现在就先不改了,全用 useLocation 就可以,base 也不是我们需要关注的。

umi4和umi3文档中并未提及到此处的不兼容,建议可以补充到文档中。当前全部升级后才发现这里是不兼容的。 导致进退两难

fz6m commented 11 months ago

如果用到了 history.location.pathname ,自己修改一下所有代码引用的地方去掉 basename 就可以了,basename 可以用 define 注入到项目里:

- history.location.pathname
+ import { getPathname } from '@/location'
+ getPathname()
// src/location.ts

export const getPathname = () => {
  return history.location.pathname ? history.location.pathname.slice(__BASE__.length) : history.location.pathname
}
// .umirc.ts

  base: '/base-path',
  define: {
    __BASE__: '/base-path'
  }

现在 react router v6 已经全面切换到 hooks 方式获取 location 和 navigate 了,不外置 history ,之所以可以用 history 只是 umi 现在的一个 hack ,未来肯定是 hooks 方向的,要尽早摆脱直接使用 history ,尽量使用原生 react router 的 hooks 方法(useLocation / useNavigate 等)。