国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【前端知識(shí)】React 基礎(chǔ)鞏固(四十一)——手動(dòng)路由跳轉(zhuǎn)、參數(shù)傳遞及路由配置

這篇具有很好參考價(jià)值的文章主要介紹了【前端知識(shí)】React 基礎(chǔ)鞏固(四十一)——手動(dòng)路由跳轉(zhuǎn)、參數(shù)傳遞及路由配置。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

React 基礎(chǔ)鞏固(四十一)——手動(dòng)路由跳轉(zhuǎn)、參數(shù)傳遞及路由配置

一、實(shí)現(xiàn)手動(dòng)跳轉(zhuǎn)路由

  1. 利用 useNavigate 封裝一個(gè) withRouter(hoc/with_router.js)
import { useNavigate } from "react-router-dom";
// 封裝一個(gè)高階組件
function withRouter(WrapperComponent) {
  return function (props) {
    const navigate = useNavigate();
    const router = { navigate };
    return <WrapperComponent {...props} router={router} />;
  };
}

export default withRouter;
  1. 添加到hoc/index.js文件中
import withRouter from "./with_router";
export { withRouter };
  1. 利用withRouter,攔截Home組件,實(shí)現(xiàn)手動(dòng)跳轉(zhuǎn)路由
import React, { PureComponent } from "react";
import { Link, Outlet } from "react-router-dom";
import { withRouter } from "../hoc";

export class Home extends PureComponent {
  navigateTo(path) {
    const { navigate } = this.props.router;
    navigate(path);
  }

  render() {
    return (
      <div>
        <h1>Home</h1>
        <div className="nav">
          <Link to="/home/recommend">推薦</Link>
          <Link to="/home/ranking">排行榜</Link>
          <button onClick={(e) => this.navigateTo("/home/songmenu")}>
            歌單
          </button>
        </div>
        {/* 占位組件 */}
        <Outlet />
      </div>
    );
  }
}

export default withRouter(Home);

二、路由參數(shù)傳遞

路由參數(shù)傳遞包括:1.動(dòng)態(tài)路由傳參;2.查詢字符串傳參

改造withRouter,通過useParams()useSearchParams()來接收兩種參數(shù)傳遞:

import {
  useLocation,
  useNavigate,
  useParams,
  useSearchParams,
} from "react-router-dom";
// 封裝一個(gè)高階組件
function withRouter(WrapperComponent) {
  return function (props) {
    // 1.導(dǎo)航
    const navigate = useNavigate();

    // 2.動(dòng)態(tài)路由參數(shù)
    const params = useParams();

    // 3.查詢字符串的參數(shù):/user?name=test&age=18
    const location = useLocation();
    const [searchParams] = useSearchParams();
    const query = Object.fromEntries(searchParams)
    console.log(query);

    const router = { navigate, params, location, query };

    return <WrapperComponent {...props} router={router} />;
  };
}

export default withRouter;

在界面中,通過params來接收(Detail.js):

import React, { PureComponent } from "react";
import { withRouter } from "../hoc";

export class Detail extends PureComponent {
  render() {
    const { router } = this.props;
    const { params } = router;

    return (
      <div>
        <h2>Detail</h2>
        <h2>id:{params.id}</h2>
      </div>
    );
  }
}

export default withRouter(Detail);

通過 query 來接收(User.jsx):

import React, { PureComponent } from "react";
import { withRouter } from "../hoc";

export class User extends PureComponent {
  render() {
    const { router } = this.props;
    const { query } = router;

    return (
      <div>
        <h1>
          用戶:{query.name} - {query.age}
        </h1>
      </div>
    );
  }
}

export default withRouter(User);

三、路由配置文件

當(dāng)前App.jsx文件中,包含Routes相關(guān)信息,過于臃腫,我們可以將Routes通過配置的形式進(jìn)行引入。

構(gòu)建router/index.js,將所有的路由配置在此處:

import Home from "../pages/Home";
import About from "../pages/About";
import Login from "../pages/Login";
import NotFound from "../pages/NotFound";
import HomeRecommend from "../pages/HomeRecommend";
import HomeRanking from "../pages/HomeRanking";
import Category from "../pages/Category";
import Order from "../pages/Order";
import HomeSangMenu from "../pages/HomeSangMenu";
import Detail from "../pages/Detail";
import User from "../pages/User";
import { Navigate } from "react-router-dom";

const routes = [
  {
    path: "/",
    element: <Navigate to="/home" />,
  },
  {
    path: "/home",
    element: <Home />,
    children: [
      {
        path: "/home",
        element: <Navigate to="/home/recommend" />,
      },
      {
        path: "/home/recommend",
        element: <HomeRecommend />,
      },
      {
        path: "/home/ranking",
        element: <HomeRanking />,
      },
      {
        path: "/home/sangmenu",
        element: <HomeSangMenu />,
      },
    ],
  },
  {
    path: "/about",
    element: <About />,
  },
  {
    path: "/login",
    element: <Login />,
  },
  {
    path: "/category",
    element: <Category />,
  },
  {
    path: "/order",
    element: <Order />,
  },
  {
    path: "/detail",
    element: <Detail />,
  },
  {
    path: "/user",
    element: <User />,
  },
  {
    path: "*",
    element: <NotFound />,
  },
];
export default routes;

改寫App.jsx,通過useRoutes(routes)引入路由:

import React from "react";
import {
  Link,
  NavLink,
  useNavigate,
  useRoutes,
} from "react-router-dom";
import "./style.css";
// import Home from "./pages/Home";
// import About from "./pages/About";
// import Login from "./pages/Login";
// import NotFound from "./pages/NotFound";
// import HomeRecommend from "./pages/HomeRecommend";
// import HomeRanking from "./pages/HomeRanking";
// import Category from "./pages/Category";
// import Order from "./pages/Order";
// import HomeSangMenu from "./pages/HomeSangMenu";
// import Detail from "./pages/Detail";
// import User from "./pages/User";
import routes from "./router";

export function App(props) {
  const navigate = useNavigate();

  function navigateTo(path) {
    console.log(path);

    navigate(path);
  }

  return (
    <div className="app">
      <div className="header">
        <span>header</span>
        <div className="nav">
          <NavLink to="/home">首頁</NavLink>
          <NavLink to="/about">關(guān)于</NavLink>
          <NavLink to="/login">登陸</NavLink>

          <button onClick={(e) => navigateTo("/category")}>分類</button>
          <span onClick={(e) => navigateTo("/order ")}>訂單</span>

          <Link to="/user?name=test&age=18">用戶</Link>
        </div>
        <hr />
      </div>
      <div className="content">
        {/* 映射關(guān)系: path => Component */}

        {/* <Routes>
          <Route path="/" element={<Navigate to="/home" />} />
          <Route path="/home" element={<Home />}>
            <Route path="/home" element={<Navigate to="/home/recommend" />} />
            <Route path="/home/recommend" element={<HomeRecommend />} />
            <Route path="/home/ranking" element={<HomeRanking />} />
            <Route path="/home/songmenu" element={<HomeSangMenu />} />
          </Route>
          <Route path="/about" element={<About />} />
          <Route path="/login" element={<Login />} />
          <Route path="/category" element={<Category />} />
          <Route path="/order" element={<Order />} />
          <Route path="/detail/:id" element={<Detail />} />
          <Route path="/user" element={<User />} />
          <Route path="*" element={<NotFound />} />
        </Routes> */}

        {useRoutes(routes)}
      </div>
      <div className="footer">Footer</div>
    </div>
  );
}

export default App;

查看運(yùn)行效果,與之前保持一致:

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-AByH8LHr-1690721021332)(https://gitee.com/outmanm78/markdown-image/raw/master/img/202307302029353.png)]

雖然成功抽離了路由配置信息,但是目前的方式,會(huì)導(dǎo)致路由統(tǒng)一打包,沒有分包處理。我們可以進(jìn)行改造一下,針對(duì)部分配置進(jìn)行分包處理,實(shí)現(xiàn)路由懶加載:

import React from "react";
import Home from "../pages/Home";
// import About from "../pages/About";
// import Login from "../pages/Login";
import NotFound from "../pages/NotFound";
import HomeRecommend from "../pages/HomeRecommend";
import HomeRanking from "../pages/HomeRanking";
import Category from "../pages/Category";
import Order from "../pages/Order";
import HomeSangMenu from "../pages/HomeSangMenu";
import Detail from "../pages/Detail";
import User from "../pages/User";
import { Navigate } from "react-router-dom";

// 通過React.lazy實(shí)現(xiàn)About和Login界面的路由懶加載
const About = React.lazy(() => import("../pages/About"));
const Login = React.lazy(() => import("../pages/Login"));

在src/index.js中,用Suspense對(duì)App進(jìn)行包裹,實(shí)現(xiàn)對(duì)分包加載的等待:

import React, { Suspense } from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
import { HashRouter } from "react-router-dom";

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
  <React.StrictMode>
    <HashRouter>
      <Suspense fallback={<h3>Loading...</h3>}>
        <App />
      </Suspense>
    </HashRouter>
  </React.StrictMode>
);

查看效果,與之前保持一致,懶加載實(shí)現(xiàn)成功:

【前端知識(shí)】React 基礎(chǔ)鞏固(四十一)——手動(dòng)路由跳轉(zhuǎn)、參數(shù)傳遞及路由配置,前端知識(shí),React,前端,react.js,javascript文章來源地址http://www.zghlxwxcb.cn/news/detail-619377.html

到了這里,關(guān)于【前端知識(shí)】React 基礎(chǔ)鞏固(四十一)——手動(dòng)路由跳轉(zhuǎn)、參數(shù)傳遞及路由配置的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【前端知識(shí)】React 基礎(chǔ)鞏固(四十四)——其他Hooks(useContext、useReducer、useCallback)

    在類組件開發(fā)時(shí),我們通過 類名.contextType = MyContext 的方式,在類中獲取context,多個(gè)Context或者在函數(shù)式組件中通過 MyContext.Consumer 方式共享context: 可以看到,當(dāng)我們需要使用多個(gè)Context時(shí),存在大量繁瑣的嵌套代碼;而Context Hook能夠讓我們通過Hook直接獲取某個(gè)Context的值,如

    2024年02月14日
    瀏覽(26)
  • 【前端知識(shí)】React 基礎(chǔ)鞏固(三十一)——Redux的簡(jiǎn)介

    概念 純函數(shù)(確定的輸入一定產(chǎn)生確定的輸出,函數(shù)在執(zhí)行過程中不產(chǎn)生副作用): 在程序設(shè)計(jì)中,若一個(gè)函數(shù)符合以下條件,那么這個(gè)函數(shù)就被稱為純函數(shù) 此函數(shù)在相同的輸入值時(shí),需產(chǎn)生相同的輸出 函數(shù)的輸出和輸入值以外的其他隱藏信息或狀態(tài)無關(guān),也和由I/O設(shè)備產(chǎn)

    2024年02月16日
    瀏覽(24)
  • 【前端知識(shí)】React 基礎(chǔ)鞏固(三十一)——store數(shù)據(jù)的訂閱和Redux的優(yōu)化

    【前端知識(shí)】React 基礎(chǔ)鞏固(三十一)——store數(shù)據(jù)的訂閱和Redux的優(yōu)化

    store/index.js test.js redux代碼優(yōu)化: 將派發(fā)的action生成過程放到一個(gè)actionCreators函數(shù)中 將定義的所有actionCreators的函數(shù),放到一個(gè)獨(dú)立的文件中:actionCreators.js actionCreators 和 reducer 函數(shù)中使用字符串常量是一致的,所以將常量抽取到一個(gè)獨(dú)立的constants.js文件中 將reducer和默認(rèn)值(

    2024年02月15日
    瀏覽(37)
  • 【前端知識(shí)】React 基礎(chǔ)鞏固(十三)——列表渲染

    在 React 中沒有像 Vue 模塊語法中的 v-for 指令,而是需要我們通過 JS 代碼的方式組織數(shù)據(jù),轉(zhuǎn)成 JSX 在 React 中,展示列表最多的方式就是使用數(shù)組的 map 高階函數(shù) 在展示數(shù)組前,有時(shí)會(huì)進(jìn)行一些處理 過濾一些內(nèi)容(filter 函數(shù)) 截取數(shù)組中的一部分內(nèi)容(slice 函數(shù)) 列表中的

    2024年02月10日
    瀏覽(30)
  • 【前端知識(shí)】React 基礎(chǔ)鞏固(二十七)——Fragment

    【前端知識(shí)】React 基礎(chǔ)鞏固(二十七)——Fragment

    Fragment 允許將子列表分組,而無需向 DOM 添加額外節(jié)點(diǎn) 可以采用語法糖 / 來替代 Fragment,但在需要添加 key 的場(chǎng)景下不能使用此短語 查看Fragment應(yīng)用后的效果

    2024年02月16日
    瀏覽(28)
  • 【前端知識(shí)】React 基礎(chǔ)鞏固(二十八)——StrictMode

    【前端知識(shí)】React 基礎(chǔ)鞏固(二十八)——StrictMode

    StrictMode 是一個(gè)用來突出顯示應(yīng)用程序中潛在問題的工具 與 Fragment 一樣,StrictMode 不會(huì)渲染任何可見的 UI 為后代出發(fā)額外的檢測(cè)和警告 嚴(yán)格模式檢查僅在開發(fā)模式下運(yùn)行,不影響生產(chǎn)構(gòu)建 嚴(yán)格模式檢查什么? 識(shí)別不安全的生命周期 使用過時(shí)的 ref API 檢查意外的副作用 組件

    2024年02月16日
    瀏覽(57)
  • 【前端知識(shí)】React基礎(chǔ)鞏固(二)——JSX注意點(diǎn)

    createElement存在的問題: 繁瑣不簡(jiǎn)潔 不直觀,無法一眼看出所描述的結(jié)構(gòu) 不優(yōu)雅,開發(fā)體驗(yàn)不好 JSX 簡(jiǎn)介:JSX 是 JavaScript XML 的簡(jiǎn)寫,表示了在JS代碼中寫XML(HTML)格式的代碼 優(yōu)勢(shì):聲明式語法更加直觀,與HTML結(jié)構(gòu)相同,降低學(xué)習(xí)成本,提高開發(fā)效率 JSX 是 react 的核心內(nèi)容‘

    2024年02月09日
    瀏覽(28)
  • 【前端知識(shí)】React 基礎(chǔ)鞏固(二十三)——React 性能優(yōu)化 SCU相關(guān)

    React 的渲染流程 JSX - 虛擬 DOM - 真實(shí) DOM React 的更新流程 props/state 改變 - render函數(shù)重新執(zhí)行 - 產(chǎn)生新的DOM樹 - 新舊DOM樹進(jìn)行diff - 計(jì)算出差異進(jìn)行更新 - 更新到真實(shí)的DOM React 在 props 或 state 發(fā)生改變時(shí),會(huì)調(diào)用 React 的 render 方法,會(huì)創(chuàng)建一顆不同的樹 React 需要基于這兩顆不同的

    2024年02月15日
    瀏覽(39)
  • 【前端知識(shí)】React 基礎(chǔ)鞏固(十七)——組件化開發(fā)(一)

    什么是組件化開發(fā)? 分而治之的思想 將一個(gè)頁面拆分成一個(gè)個(gè)小的功能塊 將應(yīng)用抽象成一顆組件樹 React的組件相對(duì)于Vue更加的靈活和多樣 按照不同的方式可以分為很多類組件 根據(jù) 組件的定義方式 ,分為: 函數(shù)組件 、 類組件 根據(jù) 組件內(nèi)部是否有狀態(tài)需要維護(hù) ,分為:

    2024年02月12日
    瀏覽(54)
  • 【前端知識(shí)】React 基礎(chǔ)鞏固(三十五)——ReduxToolKit (RTK)

    【前端知識(shí)】React 基礎(chǔ)鞏固(三十五)——ReduxToolKit (RTK)

    Redux Tool Kit (RTK)是官方推薦的編寫Redux邏輯的方法,旨在成為編寫Redux邏輯的標(biāo)準(zhǔn)方式,從而解決上面提到的問題。 RTK的核心API主要有如下幾個(gè): configureStore:包裝createStore以提供簡(jiǎn)化的配置選項(xiàng)和良好的默認(rèn)值。它可以自動(dòng)組合你的slice reducer,添加你提供的任何Redux中間件

    2024年02月15日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包