【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') 查询参数
相关推荐
FakeOccupational1 小时前
【电路笔记 信号】传输线方程:从RLGC推导传输线特性阻抗
笔记
tyqtyq221 小时前
营养餐单规划:AI 科学饮食规划系统的鸿蒙实现
人工智能·学习·华为·职场和发展·生活·harmonyos
鱼听禅2 小时前
Ubuntu学习笔记-安装docker容器
学习·ubuntu·docker
YFF菲菲兔3 小时前
React 事件系统:addTrappedEventListener
react.js
Loving_enjoy3 小时前
DFT可测试性设计规则与检查:确保芯片可测试性的关键步骤
学习
r_oo_ki_e_3 小时前
Java反射机制学习笔记
java·笔记·学习
Nontee3 小时前
数据类型与包装类 — 一个新手学Java的数据类型笔记
java·笔记·python
ysa0510303 小时前
【板子】树上启发式合并
数据结构·c++·笔记·算法
hengcaib4 小时前
金税四期下盐城企业财税合规技术路径:代理记账选型的技术思维
笔记
小妖6664 小时前
React input 输入卡顿问题
前端·javascript·react.js