背景
开发新项目的时候想找一个自己写的getQueryString的替代品,发现react-router-dom在6.0版本更新了useSearchParams的hooks,可以方便的获得浏览器地址里的query参数,故顺便将项目里的react-router-dom更新到了6.0
过程
更新package
将package.json中的react-router和react-router-dom更新到v6.0以上(当前是v6.3.0)
删除package中的history包,当前react-router直接引用该包,不需要单独引入
替换路由组件
Redirect
首先,将所有的Switch中直接包裹的Redirect都替换为Route包裹的Redirect
1
2
3
4
5
6
7
8
9
10
11
12// 修改前:
<Switch>
<Redirect from="about" to="about-us" />
</Switch>
// 修改后:
<Switch>
<Route path="about" render={() => <Redirect to="about-us" />} />
</Switch>
然后将所有的被Route包裹的Redirect修改为Navigate
1
2
3
4
5
6
7
8
9// 修改前
<Switch>
<Route path="about" render={() => <Redirect to="about-us" />} />
</Switch>
// 修改后
<Switch>
<Route path="about" element={<Navigate replace to="about-us" />} />
</Switch>Switch
将所有Switch改为Routes
1
2
3
4
5
6
7
8
9
10
11
12
13// 修改前
<Switch>
{
// ...Route
}
</Switch>
// 修改后
<Routes>
{
// ...Route
}
</Routes>
替换自定义hooks
将所有 useHistory 替换为 useNavigate
1
2
3
4
5
6
7//修改前
const history = useHistory()
history.push('/')
//修改后
const navigate = useNavigate()
navigate('/')注意⚠️:原来的useHistory中可以获得location(history.location),升级v6之后通过useLocation获得
useSearchParams
新增useSearchParams hook,可以直接获取query的内容
1
2
3
4
5
6//修改前
const queryA = getQueryString('queryA') // 自己实现的方法
//修改后
const [query] = useSearchParams()
const queryA = query.get('queryA')优势:这样可以用useEffect监听query变化,query里也有getAll方法可以获得一个query的key有多个的情况下的全部值
问题
- 截止现在(2022-4-18),@types/react-router-dom仍未更新到v6,在ts项目里使用的时候会比较不舒服
- Redirect其实官方推荐的方法是服务端进行处理 ,如果有服务端项目的话可以优先进行服务端处理
参考: