【React】打卡笔记,入门学习02:react-router

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

提示:这里可以添加本文要记录的大概内容:


提示:以下是本篇文章正文内容,下面案例可供参考

一、react-router的跳转

js 复制代码
import { useNavigate } from 'react-router';

export default function GoodsList() {
  	const navigate = useNavigate();
	return (
		<Button onClick={() => navigate('/product/base-goods/form')}>新增商品</Button>
	)
}

分析对比

navigate就跟uniapp的那个push跳转一样

1、Vue2

js 复制代码
// Vue 2
this.$router.push('/product/base-goods/form')
this.$router.replace('/product/base-goods/form')

// Vue 3 Composition API
import { useRouter } from 'vue-router'
const router = useRouter()
router.push('/product/base-goods/form')
router.replace('/product/base-goods/form')

2、React

js 复制代码
// React Router
import { useNavigate } from 'react-router'
const navigate = useNavigate()
navigate('/product/base-goods/form')  // 类似 router.push()
navigate('/product/base-goods/form', { replace: true })  // 类似 router.replace()

二、react-router的获取参数

1.params 例如:/form/1

代码如下(示例):

js 复制代码
// Vue 2
this.$route.params.id

// Vue 3 Composition API
import { useRoute } from 'vue-router'
const route = useRoute()
route.params.id

//-------------------------------------

// React Router
import { useParams } from 'react-router'
const { id } = useParams()
// id 就是路由参数值

标准用法

js 复制代码
import { useParams } from 'react-router';
import { Button } from '@/components/ui/button';

export default function BaseGoodsForm() {
  const { id } = useParams();
  const isEditMode = !!id; // 如果有id就是编辑模式,否则是新增模式

  return (
    <div>
      <div className="flex justify-between items-center mb-2.5">
        <h1 className="text-foreground text-xl font-bold">{isEditMode ? '编辑商品' : '添加商品'}</h1>
        <Button variant="outline">保存</Button>
      </div>
      <div className="grid grid-cols-12 gap-6">
        <div className="col-span-8">
         
        </div>
        <div className="col-span-4">{/* 右侧内容 - 占据4份 */}</div>
      </div>
    </div>
  );
}

2.query 例如:form?id=1

代码如下(示例):

js 复制代码
// Vue 2
this.$route.query.keyword

// Vue 3
import { useRoute } from 'vue-router'
const route = useRoute()
route.query.keyword

//-------------------------------------

// React Router
import { useSearchParams } from 'react-router'
const [searchParams, setSearchParams] = useSearchParams()
const keyword = searchParams.get('keyword')

三、组件标签

1. 跳转到其他页面

html 复制代码
<!-- Vue 2/3 -->
<router-link to="/product/base-goods/form">新增商品</router-link>
<router-link :to="{ path: '/product/base-goods/form' }">新增商品</router-link>

//-------------------------------------

// React Router
import { Link } from 'react-router'
<Link to="/product/base-goods/form">新增商品</Link>

2. 多链接接判断

经常是多个链接,判断选中高亮,类似于menu菜单项

html 复制代码
<!-- Vue 需要手动处理 -->
<router-link 
  to="/product/base-goods" 
  :class="{ active: $route.path === '/product/base-goods' }"
>
  商品
</router-link>
js 复制代码
// React Router - 自动处理active状态
import { NavLink } from 'react-router'
<NavLink 
  to="/product/base-goods"
  className={({ isActive }) => isActive ? 'active' : ''}
>
  商品
</NavLink>

四、其他

js 复制代码
// Vue 3
router.push('/product/base-goods/form')           // 跳转
router.push({ path: '/product/base-goods/form' }) // 对象形式
router.replace('/product/base-goods/form')         // 替换历史记录
router.back()                                      // 返回上一页
router.go(-1)                                      // 返回上一页

// React Router
navigate('/product/base-goods/form')                          // 跳转
navigate('/product/base-goods/form', { replace: true })       // 替换历史记录
navigate(-1)                                                   // 返回上一页
navigate(1)                                                    // 前进一页

路由配置

js 复制代码
// Vue Router 路由配置
const routes = [
  {
    path: '/product/base-goods/form/:id?',  // 可选参数
    component: BaseGoodsForm,
    name: 'baseGoodsForm'
  }
]

// React Router 路由配置
route('base-goods/form/:id?', 'routes/product/base-goods-form.tsx', { 
  id: 'baseGoods/form' 
})

示例对比,以及参数相关

场景1:列表页跳转到详情页

js 复制代码
// Vue 3
const goToDetail = (id: string) => {
  router.push(`/product/base-goods/form/${id}`)
}

// React Router
const goToDetail = (id: string) => {
  navigate(`/product/base-goods/form/${id}`)
}

场景2:带查询参数跳转

js 复制代码
// Vue 3
router.push({
  path: '/product/base-goods',
  query: { page: 1, keyword: 'test' }
})

// React Router
navigate('/product/base-goods?page=1&keyword=test')
// 或者
navigate({
  pathname: '/product/base-goods',
  search: '?page=1&keyword=test'
})

场景3:获取当前路径

js 复制代码
// Vue 3
import { useRoute } from 'vue-router'
const route = useRoute()
const currentPath = route.path

// React Router
import { useLocation } from 'react-router'
const location = useLocation()
const currentPath = location.pathname

场景4:监听路由变化

js 复制代码
// Vue 3
watch(() => route.params.id, (newId) => {
  // 路由参数变化时执行
})

// React Router
useEffect(() => {
  // 当id变化时执行
}, [id])
Vue Router React Router 说明
useRouter() useNavigate() 获取导航函数
router.push() navigate() 跳转
router.replace() navigate(path, { replace: true }) 替换历史
router.back() navigate(-1) 返回
useRoute() useParams() + useLocation() 获取路由信息
route.params.id useParams().id 路由参数
route.query.keyword useSearchParams().get('keyword') 查询参数
相关推荐
小飞大王6666 小时前
前端React实战项目 全球新闻发布系统
前端·react.js·前端框架
壹号用户6 小时前
python学习之正则表达式
python·学习·正则表达式
deng-c-f6 小时前
Linux C/C++ 学习日记(34):协程(四):服务器向Mysql请求数据的三种编程方式:同步、线程、协程
学习
摸鱼仙人~6 小时前
一文深入学习Java动态代理-JDK动态代理和CGLIB
java·开发语言·学习
Starry_hello world7 小时前
进程的替换
linux·笔记·有问必答
敲敲了个代码7 小时前
为什么 Electron 项目推荐使用 Monorepo 架构 [特殊字符][特殊字符][特殊字符]
前端·javascript·学习·架构·electron·github
俊俊谢8 小时前
【序章】金融量化入门级学习——暨一颗韭菜的茁壮成长
学习·金融
Ro Jace8 小时前
“透彻式学习”与“渗透式学习”
学习
✎ ﹏梦醒͜ღ҉繁华落℘8 小时前
freeRTOS学习笔记(十二)--信号量
笔记·学习