React 之 Router - 路由详解

news2024/11/22 16:11:02

一、Router的基本使用

1. 安装react-router

react-router会包含一些react-native的内容,web开发并不需要

npm install react-router-dom

2. 设置使用模式

BrowserRouter或HashRouter

  • Router中包含了对路径改变的监听,并且会将相应的路径传递给子组件
  • BrowserRouter      =>      使用history模式
  • HashRouter           =>      使用hash模式
import React 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>
      <App />
    </HashRouter>
  </React.StrictMode>
);

3. 路由映射配置

Routes

包裹所有的Route,在其中匹配一个路由

<Routes>
  <Route path='/' element={<div>home</div>} />
  <Route path='/about' element={<div>about</div>} />
</Routes>

Router5.x使用的是Switch组件

<Switch>
  <Route path='/home' component={Home} />
  <Route path='/about' component={About} />
  {/* 重定向 */}
  <Redirect to='/home' />
</Switch>

Route

Route用于路径的匹配 

  • path属性:用于设置匹配到的路径;
  • element属性:设置匹配到路径后,渲染的组件
    • Router5.x使用的是component属性
  • exact:精准匹配,只有精准匹配到完全一致的路径,才会渲染对应的组件
    • Router6.x不再支持该属性

二、路由组件跳转

1. Link

 to属性:Link中最重要的属性,用于设置跳转到的路径

import React, { PureComponent } from 'react';

import { Route, Routes, Link } from 'react-router-dom';
import Home from './pages/Home.jsx';
import About from './pages/About.jsx';

export class App extends PureComponent {
  render() {
    return (
      <div className='app'>
        <div className='header'>
          {/* 设置组件跳转 */}
          <Link to='/home'>首页</Link>
          <Link to='/about'>关于</Link>
        </div>
        <hr />
        <div className='content'>
          {/* 映射关系 : path => Component */}
          <Routes>
            <Route path='/' element={<Home />} />
            <Route path='/home' element={<Home />} />
            <Route path='/about' element={<About />} />
          </Routes>
        </div>
        <hr />
        <div className='footer'>footer</div>
      </div>
    );
  }
}

export default App;

2. NavLink

NavLink是在Link基础之上增加了一些样式属性

认匹配成功时,NavLink就会添加上一个动态的active class

import React, { PureComponent } from 'react';

import { Route, Routes, NavLink } from 'react-router-dom';
import Home from './pages/Home.jsx';
import About from './pages/About.jsx';

export class App extends PureComponent {
  render() {
    return (
      <div className=' app'>
        <div className='header'>
          {/* 设置组件跳转 */}
          <NavLink to='/home'>首页</NavLink>
          <NavLink to='/about'>关于</NavLink>
        </div>
        <hr />
        <div className='content'>
          {/* 映射关系 : path => Component */}
          <Routes>
            <Route path='/' element={<Home />} />
            <Route path='/home' element={<Home />} />
            <Route path='/about' element={<About />} />
          </Routes>
        </div>
        <hr />
        <div className='footer'>footer</div>
      </div>
    );
  }
}

export default App;

三、Navigate导航

Navigate用于路由的重定向,当这个组件出现时,就会执行跳转到对应的to路径中

Router5.x使用的 Redirect

用法一 

import React, { PureComponent } from 'react';
import { Navigate } from 'react-router-dom';

export class Mine extends PureComponent {
  constructor(props) {
    super(props);

    this.state = {
      isLogin: false
    };
  }
  login() {
    this.setState({
      isLogin: true
    });
  }
  render() {
    const { isLogin } = this.state;
    return (
      <div>
        <h2>Mine</h2>
        {/* 一旦出现Navigate,会自动跳转到对应页面 */}
        {!isLogin ? <button onClick={(e) => this.login()}>登录</button> : <Navigate to='/home' />}
      </div>
    );
  }
}

export default Mine;

用法二

用于显示默认显示的页面

<Routes>
  
  {/* <Route path='/' element={<Home />} /> */}
  <Route path='/' element={<Navigate to='/home' />} />

  <Route path='/home' element={<Home />} />
  <Route path='/about' element={<About />} />
  <Route path='/mine' element={<Mine />} />
</Routes>

四、Not Found页面配置

当随意输入一个地址,该地址无法匹配,则显示一个Not Found的页面

<Routes>
  <Route path='/' element={<Navigate to='/home' />} />
  <Route path='/home' element={<Home />} />
  <Route path='/about' element={<About />} />
  <Route path='/mine' element={<Mine />} />
  {/* 当前面的路由未匹配到时, 显示 NotFound 组件 */}
  <Route path='*' element={<NotFound />} />
</Routes>

五、路由嵌套

1. 创建嵌套组件

这里创建home组件的嵌套

2. 配置映射关系

在App.jsx中,统一配置,router6.x之后路由配置最好写在一起

3. 跳转Link && 占位组件

在home组件中进行配置

<Outlet>组件用于在父路由元素中作为子路由的占位元素

import React, { PureComponent } from 'react';
import { Link, Outlet } from 'react-router-dom';

export class Home extends PureComponent {
  render() {
    return (
      <div>
        <h1>Home</h1>
        {/* 跳转按钮 */}
        <Link to='/home/recommand'>推荐</Link>
        <Link to='/home/ranking'>排行</Link>

        {/* 占位组件 */}
        <Outlet />
      </div>
    );
  }
}

export default Home;

4. 效果 

 六、手动路由跳转

在Router6.x版本之后,代码类的API都迁移到了hooks的写法 => useNavigate的Hook

1. 函数式组件

hook只能在函数式组件中使用

import React from 'react';

import { Route, Routes, NavLink, Navigate, useNavigate } from 'react-router-dom';
import Home from './pages/Home.jsx';
import Recommand from './pages/components/Recommand.jsx';
import Ranking from './pages/components/Ranking.jsx';
import About from './pages/About.jsx';
import Mine from './pages/Mine.jsx';
import NotFound from './pages/NotFound.jsx';
// 1. 导入组件
import Category from './pages/Category.jsx';
import Profily from './pages/Profily.jsx';

export function App(props) {
  // hooks 只能放在顶层中使用,不能放在嵌套函数、条件判断、循环中使用,否则会报错
  const navigate = useNavigate();

  function routerJump(path) {
    // 4. 跳转
    navigate(path);
  }
  return (
    <div className=' app'>
      <div className='header'>
        <NavLink to='/home'>首页</NavLink>
        <NavLink to='/about'>关于</NavLink>
        <NavLink to='/mine'>我的</NavLink>
        {/* 3. 点击跳转 */}
        <button onClick={(e) => routerJump('/category')}>分类</button>
        <button onClick={(e) => routerJump('/profily')}>我的</button>
      </div>
      <hr />
      <div className='content'>
        {/* 映射关系 : path => Component */}
        <Routes>
          <Route path='/' element={<Navigate to='/home' />} />
          <Route path='/home' element={<Home />}>
            <Route path='/home' element={<Navigate to='/home/recommand' />} />
            <Route path='/home/recommand' element={<Recommand />} />
            <Route path='/home/ranking' element={<Ranking />} />
          </Route>
          <Route path='/about' element={<About />} />
          <Route path='/mine' element={<Mine />} />
          {/* 2. 配置映射关系 */}
          <Route path='/category' element={<Category />} />
          <Route path='/profily' element={<Profily />} />

          {/* 当前面的路由未匹配到时, 显示 NotFound 组件 */}
          <Route path='*' element={<NotFound />} />
        </Routes>
      </div>
      <hr />
      <div className='footer'>footer</div>
    </div>
  );
}

export default App;

2. 类组件 

如果要在类组件中使用,则需弄一个高级组件包裹一下

路由高阶组件封装

// 让类组件可以使用路由组件的API进行跳转

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

export default function withRouter(WrapperComponent) {
  return (props) => {
    const navigate = useNavigate();

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

类组件使用

import React, { PureComponent } from 'react';

import { Route, Routes, NavLink, Navigate } from 'react-router-dom';
import About from './pages/About.jsx';
import NotFound from './pages/NotFound.jsx';
// 1. 导入组件
import Category from './pages/Category.jsx';
import Profily from './pages/Profily.jsx';

// 2. 导入高阶组件
import withRouter from './hoc/withRouter.js';

export class App extends PureComponent {
  routerJump(path) {
    // 5. 拿到增强到的router,设置跳转
    const { router } = this.props;
    router.navigate(path);
  }
  render() {
    return (
      <div className=' app'>
        <div className='header'>
          <NavLink to='/about'>关于</NavLink>
          {/* 4. 点击跳转 */}
          <button onClick={(e) => this.routerJump('/category')}>分类</button>
          <button onClick={(e) => this.routerJump('/profily')}>我的</button>
        </div>
        <hr />
        <div className='content'>
          {/* 映射关系 : path => Component */}
          <Routes>
            <Route path='/' element={<Navigate to='/about' />} />
            <Route path='/about' element={<About />} />
            {/* 2. 配置映射关系 */}
            <Route path='/category' element={<Category />} />
            <Route path='/profily' element={<Profily />} />

            {/* 当前面的路由未匹配到时, 显示 NotFound 组件 */}
            <Route path='*' element={<NotFound />} />
          </Routes>
        </div>
        <hr />
        <div className='footer'>footer</div>
      </div>
    );
  }
}

// 3. 使用高阶组件
export default withRouter(App);

七、路由参数传递

1. 动态路由的方式

效果

配置

<Route path='/detail/:id' element={<Detail />} />

组件内跳转触发 

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

export class Category extends PureComponent {
  constructor(props) {
    super(props);
    this.state = {
      arrList: [22222, 33333, 44444, 55555]
    };
  }
  itemClick(id) {
    const { router } = this.props;
    // 跳转到详情页
    router.navigate(`/detail/${id}`);
  }
  render() {
    const { arrList } = this.state;
    return (
      <>
        <div>Category</div>
        <ul className='nav'>
          {arrList.map((item, index) => {
            return (
              <li onClick={(e) => this.itemClick(item)} key={index}>
                {item}
              </li>
            );
          })}
        </ul>
      </>
    );
  }
}

export default withRouter(Category);

路由高阶组件进一步封装

// 让类组件可以使用路由组件的API

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

export default function withRouter(WrapperComponent) {
  return (props) => {
    // 1. 跳转对象
    const navigate = useNavigate();
    // 2. 动态路由的参数 /detail/:id
    const params = useParams();

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

显示的组件

import React, { PureComponent } from 'react';

import withRouter from '../hoc/withRouter';
export class Detail extends PureComponent {
  render() {
    // 1. 通过 withRouter 高阶组件,可以获取到路由信息
    const { router } = this.props;
    return (
      <>
        <div>Detail</div>
        {/* 2. 通过 router.params 获取到路由参数 */}
        <h1>id: {router.params.id}</h1>
      </>
    );
  }
}

export default withRouter(Detail);

2. search传递参数

效果

配置

import React, { PureComponent } from 'react';

import { Route, Routes, NavLink, Navigate } from 'react-router-dom';

// 2. 导入高阶组件
import withRouter from './hoc/withRouter.js';
import Detail from './pages/Detail.jsx';
import Category from './pages/Category.jsx';

export class App extends PureComponent {
  routerJump(path) {
    const { router } = this.props;
    router.navigate(path);
  }
  render() {
    return (
      <div className=' app'>
        <div className='header'>
          <NavLink to='/category'>分类</NavLink>
          {/* 5. 携带参数,使用query传参 */}
          <NavLink to='/detail?name=coder&age=18'>详情</NavLink>
        </div>
        <hr />
        <div className='content'>
          {/* 4. 映射关系 : path => Component */}
          <Routes>
            <Route path='/' element={<Navigate to='/category' />} />
            <Route path='/category' element={<Category />} />
            <Route path='/detail' element={<Detail />} />
          </Routes>
        </div>
        <hr />
        <div className='footer'>footer</div>
      </div>
    );
  }
}

// 3. 使用高阶组件
export default withRouter(App);

路由高阶组件再进一步封装

// 让类组件可以使用路由组件的API

import { useNavigate, useParams, useLocation, useSearchParams } from 'react-router-dom';

export default function withRouter(WrapperComponent) {
  return (props) => {
    // 1. 跳转对象
    const navigate = useNavigate();
    // 2. 动态路由的参数 /detail/:id
    const params = useParams();

    // 3. 查询字符串的参数 /detail?id=1&name=jack
    // 3.1.1 通过useLocation获取查询字符串
    // const lacationSearchs = useLocation().search;
    // console.log('searchParams', lacationSearchs); // ?name=coder&age=18 => 不太好用
    // 3.1.2 通过URLSearchParams获取查询字符串
    // const lacationSearchParams = new URLSearchParams(lacationSearchs);
    // console.log('searchParams', lacationSearchParams.get('name')); // coder

    // 3.2.1 通过useSearchParams获取查询字符串
    const [searchParams, setSearchParams] = useSearchParams();
    // console.log('searchParams', searchParams.get('name')); // coder
    const query = Object.fromEntries(searchParams.entries()); // 可直接转换为对象,Object.fromEntries(searchParams)
    // console.log('searchParams', query); // {name: "coder", age: "18"}

    return <WrapperComponent {...props} router={{ navigate, params, query }} />;
  };
}

显示的组件

import React, { PureComponent } from 'react';

import withRouter from '../hoc/withRouter';
export class Detail extends PureComponent {
  render() {
    // 1. 通过 withRouter 高阶组件,可以获取到路由信息
    const { router } = this.props;
    const { name, age } = router.query;
    return (
      <>
        <div>Detail</div>
        {/* 2. 通过 router.params 获取到路由参数 */}
        <h1>name: {name}</h1>
        <h1>age: {age}</h1>
      </>
    );
  }
}

export default withRouter(Detail);

八、路由配置文件

目前所有的路由定义都是直接使用Route组件,并且添加属性来完成的

但是这样的方式会让路由变得非常混乱,我们希望将所有的路由配置放到一个地方进行集中管理

  • 在早期的时候,Router并且没有提供相关的API,我们需要借助于react-router-config完成
  • 在Router6.x中,为我们提供了useRoutes API可以完成相关的配置;

1. 创建router文件夹

index.js

const routes = [];

export default routes;

2. 在App.jsx中使用

import React from 'react';

import { NavLink, useNavigate, useRoutes } from 'react-router-dom';
// 1. 导入路由相关的组件
import routes from './router';

export function App(props) {
  const navigate = useNavigate();
  function routerJump(path) {
    navigate(path);
  }
  return (
    <div className=' app'>
      <div className='header'>
        <NavLink to='/home'>首页</NavLink>
        <NavLink to='/about'>关于</NavLink>
        <NavLink to='/mine'>我的</NavLink>
        <button onClick={(e) => routerJump('/category')}>分类</button>
        <button onClick={(e) => routerJump('/profily')}>我的</button>
      </div>
      <hr />
      <div className='content'>
        {/* <Routes>
          <Route path='/' element={<Navigate to='/home' />} />
          <Route path='/home' element={<Home />}>
            <Route path='/home' element={<Navigate to='/home/recommand' />} />
            <Route path='/home/recommand' element={<Recommand />} />
            <Route path='/home/ranking' element={<Ranking />} />
          </Route>
          <Route path='/about' element={<About />} />
          <Route path='/mine' element={<Mine />} />
          <Route path='/category' element={<Category />} />
          <Route path='/profily' element={<Profily />} />
          <Route path='*' element={<NotFound />} />
        </Routes> */}
        {/* 2. 使用路由组件,渲染路由,并且传入路由配置 */}
        {useRoutes(routes)}
      </div>
      <hr />
      <div className='footer'>footer</div>
    </div>
  );
}

export default App;

3. 对比

4. 路由懒加载

1. index.js中配置

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

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    {/* 
      Suspense组件用于在组件渲染时显示一个fallback组件,直到该组件加载完成为止 
      fallback属性用于指定fallback组件,可以是任何react元素,可以是一个加载动画,也可以是一个加载提示文字
      当异步组件加载完成后,fallback组件会被卸载,然后渲染异步组件
    */}
    <HashRouter>
      <Suspense fallback={<div>Loading...</div>}>
        <App />
      </Suspense>
    </HashRouter>
  </React.StrictMode>
);

2. router中配置

// Desc: 路由配置文件

// 同步路由配置,没进行分包处理
// import Home from '../pages/Home.jsx';
import Recommand from '../pages/components/Recommand.jsx';
import Ranking from '../pages/components/Ranking.jsx';
import About from '../pages/About.jsx';
import Mine from '../pages/Mine.jsx';
import NotFound from '../pages/NotFound.jsx';

import Category from '../pages/Category.jsx';
import Profily from '../pages/Profily.jsx';
import { Navigate } from 'react-router-dom';

// 异步路由配置,进行了分包处理 => 一般用于比较大的页面,比如登录页、注册页、首页等
import { lazy } from 'react';
// import => 会将整个文件加载进来,然后再从中导出需要的部分, 会导致整个文件被加载进来,会增加首屏加载时间 => 是webpack的语法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/893995.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

优化视频流:利用美颜SDK提升直播质量的方法

随着互联网的迅猛发展&#xff0c;视频直播已成为人们分享、交流和娱乐的重要方式。然而&#xff0c;在实际的直播过程中&#xff0c;视频画质可能受到诸多因素的影响&#xff0c;例如摄像头品质、网络状况等。为了提升观众的体验和吸引更多的观众&#xff0c;美颜技术逐渐成为…

8.18号transformer 系列文章阅读

文章目录 STGM: Spatio-Temporal Graph Mixformer for Traffic ForecastingAttention Is Not All You Need AnymoreLEARNING IMAGE DERAINING TRANSFORMER NETWORK WITH DYNAMIC DUAL SELF-ATTENTIONSST: A Simplified Swin Transformer-based Model for Taxi Destination Pred…

zookeeper安装配置采坑流程

安装 wget https://dlcdn.apache.org/zookeeper/zookeeper-3.8.2/apache-zookeeper-3.8.2-bin.tar.gz解压&#xff1a; tar -zxvf apache-zookeeper-3.8.2-bin.tar.gz如下 bin目录下文件是可执行文件 conf目录文件是配置文件 修改zoo.cfg&#xff08;复制zoo_sample&#x…

python生成器有几种写法,python生成器函数例子

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python生成器有几种写法&#xff0c;python生成器函数例子&#xff0c;今天让我们一起来看看吧&#xff01; 本文部分参考&#xff1a;Python迭代器&#xff0c;生成器–精华中的精华 https://www.cnblogs.com/deeper/p…

C#接化发:串口通信

文章目录 框架准备串口准备接、化、发测试 源码地址&#xff1a;C# 串口通信测试软件 框架准备 出于简单考虑&#xff0c;首先创建一个Winform项目&#xff0c;本文项目名称为portTest。 串口通信&#xff0c;至少有两个串口才能通信&#xff0c;所以拖动两个GroupBox&#…

Python 3 使用Hive 总结

启动HiveServer2 服务 HiveServer2 是一种可选的 Hive 内置服务&#xff0c;可以允许远程客户端使用不同编程语言向 Hive 提交请求并返回结果。 Thrift服务配置 假设我们已经成功安装了 Hive&#xff0c;如果没有安装&#xff0c;请参考&#xff1a;Hive 一文读懂 。在启动 H…

SAP后台表SE16和SE16N修改后台表数据方法

SAP后台表SE16和SE16N修改后台表数据方法 SAP中直接修改表、视图的Tcode有SE16N和SM30。 一 . SE16N界面输入&SAP_EDIT 其中使用SE16N修改表需要先输入命令&SAP_EDIT,回车左下角显示激活SAP编辑功能后&#xff0c;就可以对相应的表进行新增、删除、修改的操作。 有…

剑指offer44.数字序列中某一位的数字

最后一道题&#xff0c;我一定要自己做出来&#xff0c;想了不到一个小时想法差不多成熟了&#xff0c;但是有一个小细节出问题了&#xff0c;这个问题我在idea上debug都没debug出来。我先讲我的题解然后再讲我这个小问题出在哪里吧。以下是我的代码&#xff1a; class Soluti…

基于.Net Core开发的医疗信息LIS系统源码

SaaS模式.Net Core版云LIS系统源码 医疗信息LIS系统是专为医院检验科设计的一套实验室信息管理系统&#xff0c;能将实验仪器与计算机组成网络&#xff0c;使病人样品登录、实验数据存取、报告审核、打印分发&#xff0c;实验数据统计分析等繁杂的操作过程实现了智能化、自动化…

Mac m1芯片基于parallesls desktop安装Ubuntu

1.Ubuntu镜像下载 访问Ubuntu官网自行选择版本进行下载&#xff0c;可进行以下操作进行版本选择 对于Mac系统&#xff0c;不论VM/PD都需要用arm架构镜像&#xff0c;所以点击arm架构的镜像进行下载 2.准备PD PD安装包&#xff1a; 链接&#xff1a;https://pan.quark.cn/s/46…

深入了解Maven

目录 一.Maven介绍与功能 二.依赖管理 1.依赖的配置 2.依赖的传递性 3.排除依赖 4.依赖的作用范围 一.Maven介绍与功能 maven是一个项目管理和构建工具&#xff0c;是基于对象模型POM实现。 Maven的作用&#xff1a; 便捷的依赖管理&#xff1a;使用Maven可以简化依赖管…

FPGA GTP全网最细讲解,aurora 8b/10b协议,HDMI板对板视频传输,提供2组4套工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的 GT 高速接口解决方案3、GTP 全网最细解读GTP 基本结构GTP 发送和接收处理流程GTP 的参考时钟GTP 发送接口GTP 接收接口GTP IP核调用和使用 4、设计思路框架HDMI输入视频配置及采集视频数据组包GTP aurora 8b/10b数据对齐视频数据解包图像…

四层和七层负载均衡的区别

一、四层负载均衡 四层就是ISO参考模型中的第四层。四层负载均衡器也称为四层交换机&#xff0c;它主要时通过分析IP层和TCP/UDP层的流量实现的基于“IP端口”的负载均衡。常见的基于四层的负载均衡器有LVS、F5等。 以常见的TCP应用为例&#xff0c;负载均衡器在接收到第一个来…

《HeadFirst设计模式(第二版)》第九章代码——组合模式

上一章链接&#xff1a; 《HeadFirst设计模式(第二版)》第九章代码——迭代器模式_轩下小酌的博客-CSDN博客 前面说到&#xff0c;当一个菜单里面出现了子菜单的时候&#xff0c;前面的迭代器模式得换成组合模式。 组合模式&#xff1a; 允许将对象组合成树形结构来表现部分-整…

PyTorch训练深度卷积生成对抗网络DCGAN

文章目录 DCGAN介绍代码结果参考 DCGAN介绍 将CNN和GAN结合起来&#xff0c;把监督学习和无监督学习结合起来。具体解释可以参见 深度卷积对抗生成网络(DCGAN) DCGAN的生成器结构&#xff1a; 图片来源&#xff1a;https://arxiv.org/abs/1511.06434 代码 model.py impor…

跨境电商平台风控揭秘:如何应对刷单风险?

跨境电商平台内部对比被举报的买家信息时&#xff0c;会进行一系列分析来确认是否存在刷评行为。系统会追溯买家的购买记录和留评记录&#xff0c;根据留评率等信息来判断是否存在刷评的行为。如果系统确认买家存在刷评行为&#xff0c;那么该买家曾经留下的所有评价都有可能被…

我国出租车行业的发展伪历史(依赖倒置)

一、前言 既然是“伪历史”&#xff0c;大家就暂且不要纠结故事的真实性了&#xff0c;因为我们今天主要讲的并非是中国出租车的发展史&#xff0c;而是希望通过这个伪历史的例子来用日常生活中的例子&#xff0c;来深入理解一下什么叫依赖倒置。 还是按照惯例&#xff0c;我…

【从零开始学习Linux】常用命令及操作

哈喽&#xff0c;哈喽&#xff0c;大家好~ 我是你们的老朋友&#xff1a;保护小周ღ 本期给大家带来的是 Linux 常用命令及操作&#xff0c;主要有三个分类&#xff1a;文件操作&#xff0c;目录操作&#xff0c;网络操作&#xff0c;创建文件 touch , 创建目录 mkdir , 删除…

【了解一下常见的设计模式】

文章目录 了解一下常用的设计模式(工厂、包装、关系)导语设计模式辨析系列 工厂篇工厂什么是工厂简单工厂「模式」&#xff08;Simple Factory「Pattern」&#xff09;简单工厂代码示例&#xff1a;简单计算器优点&#xff1a;缺点&#xff1a; 静态工厂模式特点&#xff1a; 工…

基于Spring Boot的社区诊所就医管理系统的设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的社区诊所就医管理系统的设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java …