1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| 4 路由表 上边<Routes>里的这些可以全部省略,写成 const element = useRoutes([ {path:'/about',element:(<About/>)}, {path:'/',element:(<Navigate to='/about' replace/>)}, ]) 在需要路由组件的位置使用{element},在App.jsx注册组件用一次即可,相当于vue中的router-view, 子级路由可以用<Outlet>可以不用再 引入useRoutes+{element}
项目规范:把路由表写到单独的js,组件里引入const element =useRoutes(routes) 再使用{element}
5 嵌套路由 {path:'/about',element:(<About/>),children:[ {path:'son',element:(<Son/>)}, ]}
子级path的写法:'/about/son' 或'son'不带斜杠 或'./son' (NavLink里to同样)
NavLink有个end属性,当子级高亮时让父级不再高亮 NavaLink里activeClassName属性废弃不能用了,需要自己写判断className={isTure ? 'aaa' :'bbb'}
6 路由传参 <NavLink to='/home/001/张三' children='首页'/> {path:'/home/:id/:name',element:(<Home/>)} params传参不变,路由表里path还是要声明接收,取值使用useParams或useMatch const {id,name}= useParams() 或const { id,name } =useMatch('/home/:id/:name').params 要传路径,不推荐用这个
<NavLink to='/home/?id=001&name=张三' children='首页'/> search传参不变,取值使用useSearchParams()和useLocation(),但结果是数组,数组里search,setSearch都是函数 const [search,setSearch]= useSearchParams() const id= search.get('id') 拿值 onClick={()=>setSearch('id=002&name=李四')} 改值 或const search=useLocation().search 这里是'?id=002&name=李四' 需要用qs解码,比较麻烦
旧版state传参 <NavLink to='{{ pathname:'/home',state:{id:01} }}' children='首页'/> 新版state传参 <NavLink to='/home' state={{id:01}}/> 取值使用useLocation() const {state} = useLocation() 拿到state是{id:01}
7 编程式路由 旧版使用路由组件的props.history实现 新版使用useNavigate(),废弃了withRouter const navigate = useNavigate() navigate('/home') navigate('/home',{ state:{id:01},replace:false }) params和search参数直接写到url里 navigate(-1) 前进后退
8 Hook-不常用 useInRouterCnntext() 返回布尔值,是否处于路由器包裹中,不区分是否路由组件,(用于第三方库,想知道是否在路由器里) useNavigationType() 返回3种类型之一:pop刷新页面、push、replace const result = useOutlet() 用来在/home路径下把它的子路由/home/son组件显示出来,如果还没挂载子路由 result=null,如果挂载了,result=子路由对象 useResolvedPath() 给定一个任意URL值,解析其中的path、search、hash值
总结 组件:BrowserRouter\HashRouter、Routes\Route、Link\NavLink、Navigate、Outlet Hook:useRoutes\useNavigate、useParams\useSearchParams\useLocation\useMatch、4个不常用的
|