【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') 查询参数
相关推荐
会编程的李较瘦18 小时前
【Spark学习】数据清洗
学习·ajax·spark
RisunJan19 小时前
【行测】实词辨析
学习
m0_6265352020 小时前
双线性插值学习
学习
YJlio20 小时前
进程和诊断工具学习笔记(8.24):Handle——谁占着不放?句柄泄漏排查、强制解锁与检索技巧
服务器·笔记·学习
charlie11451419120 小时前
面向C++程序员的JavaScript 语法实战学习4
开发语言·前端·javascript·学习·函数
IUGEI20 小时前
【后端开发笔记】JVM底层原理-内存结构篇
java·jvm·笔记·后端
wdfk_prog20 小时前
[Linux]学习笔记系列 -- [kernel]trace
linux·笔记·学习
郭小铭21 小时前
React Suite v6:面向现代化的稳健升级
react.js·前端框架·github
charlie11451419121 小时前
勇闯前后端Week2:后端基础——HTTP与REST
开发语言·网络·笔记·网络协议·学习·http
一 乐21 小时前
学习辅导系统|数学辅导小程序|基于java+小程序的数学辅导小程序设计与实现(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·学习·小程序