react-router-dom 实用技巧及3种传参方式

介绍

在传统网站中,浏览器从 Web 服务器请求文档,下载并评估 CSS 和 JavaScript 资源,并呈现从服务器发送的 HTML。当用户单击链接时,它会在新页面上重新启动该过程。

客户端路由允许您的应用程序通过链接点击更新 URL,而无需从服务器再次请求另一个文档。相反,您的应用程序可以立即呈现一些新的 UI 并发出数据请求,以fetch使用新信息更新页面。

这可以实现更快的用户体验,因为浏览器不需要请求全新的文档或重新评估下一页的 CSS 和 JavaScript 资源。它还通过动画等方式实现更动态的用户体验。

安装

npm install --save react-router-dom

配置

src 目录下创建 routers 文件,并创建 index.js 文件

lazy 懒加载

import { lazy } from "react"

const Login = lazy(() => import("../pages/Login"))
const Home = lazy(() => import("../pages/Home"))
const About = lazy(() => import("../pages/About/About"))
const Detail = lazy(() => import("../pages/About/AboutDetail"))

export const routers = [
  {
    path: "/login",
    element: <Login />
  },
  {
    path: "/",
    element: <Home />
  },
  {
    path: "/about",
    children: [
      {
        path: "",
        element: <About />,
      },
      {
        path: "detail/:id",
        element: <Detail />
      }
    ]
  },
]

注意点:子页面路由遵循父页面路由同源,父:/about;子:/about/detail

useRoutes

App.js

import { Suspense } from "react"
import { useRoutes } from "react-router-dom"
import { routers } from "./routers"

function App() {
  const element = useRoutes(routers)
  return (
    <div className="App">
      {
        <Suspense fallback={<div>loading...</div>}>{element}</Suspense>
      }
    </div>
  );
}

export default App;

通过 useRoutes 渲染路由树的有效 React 元素

路由跳转

useNavigate

useNavigate 钩子返回一个函数,允许您以编程方式导航

Home.js

import React from 'react';
import { useNavigate } from 'react-router-dom'

const Home = () => {

  const navigate = useNavigate()

  const handleLogin = () => {
    navigate('/login')
  }


  return (
    <div>
      <h1>首页</h1>
      <button onClick={handleLogin}>去登录</button>
    </div>
  );
}

export default Home;

返回上一个页面

navigate(-1)

state传参

通过 navigate 传值

navigate 可以接收第二个参数,state: { key: keyValue } ,以向目标页面传递参数

Login.js

import React, { useState, useRef, startTransition } from 'react'
import { useNavigate } from 'react-router-dom'

const Login = () => {
  const [value, setValue] = useState('')
  
  const navigate = useNavigate()

  const inputRef = useRef()

  const handleInput = () => {
    startTransition(()=> {
      setValue(inputRef.current.value)
    })
  }

  const handleLogin = () => {
    const id = Date.parse(new Date())
    navigate("/", {
      state: {
        id,
        name: inputRef.current.value
      }
    })
  }

  return (
    <div>
      <h1>登录页面</h1>
      <div>
        <input ref={inputRef} value={value} onChange={handleInput} />
        <button onClick={handleLogin}>登录</button>
      </div>
    </div>
  )
}

export default Login;

通过 useLocation 接收

useLocation 钩子返回当前 location 对象

Home.js

import React, { useState, useEffect } from 'react';
import { useLocation, useNavigate } from 'react-router-dom'

const Home = () => {
  const [user, setUser] = useState({
    name: '',
    id: ''
  })

  const location = useLocation().state
  const navigate = useNavigate()

  const handleLogin = () => {
    navigate('/login')
  }

  useEffect(() => {
    if (location) {
      setUser(location)
    }
  }, [])

  return (
    <div>
      <h1>首页</h1>
      {
        user.id ? <div>你好!{user.name}</div> : <button onClick={handleLogin}>去登录</button>
      }
      <button onClick={handleAbout}>关于我们</button>
    </div>
  );
}

export default Home;

search传参 (query格式, ? + &)

const handleAbout = () => {
    const id = Date.parse(new Date())
    // 写法一
    navigate({
      pathname: "/about",
      search: `?id=${id}`
    })
    // 写法二
    navigate(`/about?id=${id}`)
    // 写法三
    const params = { id: '1', grade: '2' }
    navigate({
        pathname: "/about",
        search: `?${createSearchParams(params)}`
    })
  }

通过 useSearchParams 接收

import React from 'react'
import { useSearchParams, useNavigate } from "react-router-dom"

const About = () => {
  const [searchParams] = useSearchParams()
  const id = searchParams.get("id") || ""

  const navigate = useNavigate()

  return (
    <div>
      <h1>关于我们</h1>
      id: {id}
      <button onClick={handleDetail}>详情</button>
    </div>
  )
}

export default About;

params传参 (restful格式)

路由定义参数值

{
    path: "detail/:id",
    element: <Detail />
}
  const handleDetail = () => {
    navigate(`/about/detail/${id}`)
  }

AboutDetail.js

通过 useParams 接收

import React from 'react'
import { useNavigate, useParams } from "react-router-dom"

const AboutDetail = () => {
  const params = useParams()
  const navigate = useNavigate()

  const handleBlack = () => {
    navigate(-1)
  }

  return (
    <div>
      <h1>关于我们 - 详情</h1>
      <p>id:{params.id}</p>
      <button onClick={handleBlack}>返回</button>
    </div>
  )
}

export default AboutDetail;

"sgmediation.zip" 是一个包含 UCLA(加利福尼亚大学洛杉矶分校)开发的 sgmediation 插件的压缩包。该插件专为统计分析软件 Stata 设计,用于进行中介效应分析。在社会科学、心理学、市场营销等领域,中介效应分析是一种关键的统计方法,它帮助研究人员探究变量之间的因果关系,尤其是中间变量如何影响因变量与自变量之间的关系。Stata 是一款广泛使用的统计分析软件,具备众多命令和用户编写的程序来拓展其功能,sgmediation 插件便是其中之一。它能让用户在 Stata 中轻松开展中介效应分析,无需编写复杂代码。 下载并解压 "sgmediation.zip" 后,需将解压得到的 "sgmediation" 文件移至 Stata 的 ado 目录结构中。ado(ado 目录并非“adolescent data organization”缩写,而是 Stata 的自定义命令存放目录)目录是 Stata 存放自定义命令的地方,应将文件放置于 "ado\base\s" 子目录下。这样,Stata 启动时会自动加载该目录下的所有 ado 文件,使 "sgmediation" 命令在 Stata 命令行中可用。 使用 sgmediation 插件的步骤如下:1. 安装插件:将解压后的 "sgmediation" 文件放入 Stata 的 ado 目录。如果 Stata 安装路径是 C:\Program Files\Stata\ado\base,则需将文件复制到 C:\Program Files\Stata\ado\base\s。2. 启动 Stata:打开 Stata,确保软件已更新至最新本,以便识别新添加的 ado 文件。3. 加载插件:启动 Stata 后,在命令行输入 ado update sgmediation,以确保插件已加载并更新至最新本。4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值