【React+ts】 react项目中引入bootstrap、ts中的接口

ops/2025/2/3 16:46:49/

bootstrap_0">一、在react项目中引入bootstrap

这个直接用npm下载包然后在index.js中引入就可以了。

npm install bootstrap react-bootstrap

后面那个必须要下载,应该有什么联动的包要用。
然后在index.tsx中引入

import "bootstrap/dist/css/bootstrap.min.css";
import "bootstrap/dist/js/bootstrap";

二、ts中的interface接口

2.1 对象类型接口

ts中的interface是用来描述对象或函数的。是一种代码协作必须遵守的契约。我的理解就是规范里面的数据,比如说,在实例化的时候哪些东西必须要,哪些东西可以不要,以及哪些东西可以任意类型。
里面的数据可以定义以下几种类型。

  1. 确定类型:必须要有的数据。
  2. 可选属性:可以没有的属性。
  3. 任意属性:说明属性类型可以更改,名字可定义。
  4. 只读属性:实例化后不可更改。
interface Person {age: number,           // 确定属性name?: string,         // 可选属性(加问号即可)[propName: string]: any, // 任意属性readonly sex: string,  // 只读属性
}

2.2 函数类型接口

列出参数列表和返回值类型的定义。

// 函数类型接口
interface Func {// 定义接收两个必选 number 类型参数,和一个可选字符串参数 desc,该函数返回 number 类型(x: number, y: number, desc?: string): number
}

三、react中定义组件的方式

有两种定义组件方式,一种是函数式组件,一种是类式组件。

3.1函数式组件

//基本定义方式
import React from "react";export default function Discovery() {return <div>发现页</div>;
}//组件传参数
import React from "react";export default function Discovery(props: any) {console.log(props);return <div>{props.text}</div>;
}//类型定义,说明是个函数式组件也可以简写FC
import React, { memo } from "react”;
Import type {FunctionComponent} from "react”;const Discovery: FunctionComponent<any> = (props) => {console.log(props);return <div>{props.text}</div>;
};//memo函数的作用是判断组件是否发生变化,如果没有发生变化则不重新渲染
export default memo(Discovery);

3.2 类式组件

//基本定义方式
import React, { Component } from "react";class Discovery extends Component {render() {return <div>发现页</div>;}
}export default Discovery;//类式组件传参
import React, { Component } from "react”;
//这里两个any定义的一个是props type,一个是state typeclass Discovery extends Component<any, any> {  constructor(props: any) {super(props);console.log(props);this.state = { text: props.text };}render() {return <div>{this.props.text}</div>;}
}
export default Discovery;

3.3interface与类式组件的互动

ReactNode和ReactElement 与 children属性
这里的ReactNode包含了ReactElement,如下图所示。
在这里插入图片描述
InterfaceTest.tsx

import React, { ReactNode } from "react";interface Iprops {name: string;age: number;children: ReactNode;height?: number;
}export default function InterfaceTest(props: Iprops) {return (<div><div>name:{props.name}</div><div>age:{props.age}</div>{/* 三目运算符来条件渲染 */}{props.height ? <div>height:{props.height}</div> : null}<div>{props.children}</div></div>);
}

Discovery.tsx

import React, { Component } from "react";
import InterfaceTest from "./InterfaceTest";
class Discovery extends Component<any, any> {constructor(props: any) {super(props);console.log(props);this.state = { text: props.text };}render() {return (<div>{this.props.text}<InterfaceTest name="Carling" age={21} height={187}><div>这里是子元素</div></InterfaceTest></div>);}
}export default Discovery;

在这里插入图片描述

3.4代码中遇到的问题

(1)如果是类组件,子组件是否重新渲染由props和state决定;如果子组件是函数式组件,那么只要父组件渲染,子组件就会无条件进行渲染。
answer:使用memo函数对组件进行包裹。这个方法只能解决子组件属性不是函数时的情况,如果子组件是函数,则需要使用useCallback进行包裹。

这个问题出现的原因是因为,函数式组件每次重新渲染时,都会把函数体里的所有代码执行一遍。
useCallback函数

let newFunction = useCallback(oldFunction,[dependentValue])

我的理解是只有当后面的依赖值发生变化时,前面的函数才会被运行。否则返回一样的值。
因此如果传的是空数组则oldFunction只会被定义一次。

export default () => {console.log("父组件");const [count, setCount] = useState(1);let changeCount = () => {setCount(count + 1);}let increment = useCallback(()=>{console.log("increment");},[]) // 该函数永远不会重新定义(没有依赖)return (<><h1>useCallback</h1><p>{count}</p><input type="button" value="修改count" onClick={changeCount} /><hr/><SonFn onMyClick={increment} /></>)
}

四、组件的懒加载–webpack中的分包处理,性能优化问题–哪个需要查看下载哪个。

这个的原理就是将所有组件拆分,不放在一个文件里,哪个需要被加载去服务器下载哪个文件。
这里使用的是react库中的lazy函数,用来引入组件。
路由表定义:

import React, { lazy } from "react";
import { Navigate } from "react-router-dom";//懒加载定义
const Discovery = lazy(() => import("../components/Discovery"));
const My = lazy(() => import("../components/My"));
const Follow = lazy(() => import("../components/Follow"));
const Mall = lazy(() => import("../components/Mall"));
const Musician = lazy(() => import("../components/Musician"));
const Recommended = lazy(() => import("../components/Recommended"));
const Download = lazy(() => import("../components/Download"));const routes: any[] = [{path: "/discovery",element: <Discovery text="发现页" />,},{path: "/my",element: <My />,},{path: "follow",element: <Follow />,},{path: "mall",element: <Mall />,},{path: "musician",element: <Musician />,},{path: "recommended",element: <Recommended />,},{path: "download",element: <Download />,},{path: "/",element: <Navigate to="/discovery" />,},
];
export default routes;

使用路由表的时候要用Suspense组件进行包裹,Suspense组件是通过捕获异常来进行实现的,没看之前猜测是,捕获到异常就暂停该组件的渲染,等到完成再渲染。
工作原理:
使用React的Fiber架构进行实现。Fiber架构允许React将渲染工作拆分为一个个可中断的任务单元。当遇到需要暂停的操作时,Fiber可暂停当前任务,并显示fallback—Suspense组件中定义的在等待时渲染的过渡组件。

  1. 当组件抛出异常时,React标记该Fiber节点为“suspended”状态
  2. 触发重新渲染,一旦该Promise完成,React会尝试重新渲染组件。
  3. 等待Promise完成的期间会渲染fallback。
    用Suspense组件将所有懒加载的组件全包裹了就可以。
import React, { Suspense } from "react";
import routes from "./router/index";
import { NavLink, useRoutes } from "react-router-dom";function App() {const element = useRoutes(routes);return (<div className="App"><nav className="navbar navbar-dark bg-primary"><div className="container-fluid"><NavLink className="navbar-brand" to="/discovery">发现音乐</NavLink><NavLink className="navbar-brand" to="/my">我的音乐</NavLink><NavLink className="navbar-brand" to="/follow">关注</NavLink><NavLink className="navbar-brand" to="/mall">商城</NavLink><NavLink className="navbar-brand" to="/musician">音乐人</NavLink><NavLink className="navbar-brand" to="/recommended">云推歌</NavLink><NavLink className="navbar-brand" to="/download">下载客户端</NavLink></div></nav><Suspense fallback="loading…">{element}</Suspense></div>);
}export default App;

http://www.ppmy.cn/ops/155351.html

相关文章

AI大模型开发原理篇-1:语言模型雏形之N-Gram模型

N-Gram模型概念 N-Gram模型是一种基于统计的语言模型&#xff0c;用于预测文本中某个词语的出现概率。它通过分析一个词语序列中前面N-1个词的出现频率来预测下一个词的出现。具体来说&#xff0c;N-Gram模型通过将文本切分为长度为N的词序列来进行建模。 注意&#xff1a;这…

1.Template Method 模式

模式定义 定义一个操作中的算法的骨架&#xff08;稳定&#xff09;&#xff0c;而将一些步骤延迟&#xff08;变化)到子类中。Template Method 使得子类可以不改变&#xff08;复用&#xff09;一个算法的结构即可重定义&#xff08;override 重写&#xff09;该算法的某些特…

第一届“启航杯”网络安全挑战赛WP

misc PvzHE 去这个文件夹 有一张图片 QHCTF{300cef31-68d9-4b72-b49d-a7802da481a5} QHCTF For Year 2025 攻防世界有一样的 080714212829302316092230 对应Q 以此类推 QHCTF{FUN} 请找出拍摄地所在位置 柳城 顺丰 forensics win01 这个软件 云沙盒分析一下 md5 ad4…

FastDFS实用笔记 (Docker 搭建环境 + 整合 SpringBoot)

解决了大容量存储 和 负载均衡的问题&#xff0c;特别适合中小文件&#xff08;4KB < file_size < 500MB)。如相册网站&#xff0c;视频网站等 FastDFS 充分考虑了冗余备份&#xff0c;线程扩容机制&#xff0c;并注重高可用。高性能等指标。使用 FastDFS 很容易搭建一套…

Nginx 开发总结

文章目录 1. Nginx 基础概念1-1、什么是 Nginx1-2、Nginx 的工作原理1-3、Nginx 的核心特点1-4、Nginx 的常见应用场景1-5、Nginx 与 Apache 的区别1-6、 Nginx 配置的基本结构1-7、Nginx 常见指令 2. Nginx 配置基础2-1、Nginx 配置文件结构2-2、全局配置 (Global Block)2-3、…

云原生(五十三) | SQL查询操作

文章目录 SQL查询操作 一、数据库DDL操作 1、登陆数据库 2、创建DB数据库 二、数据表DDL操作 1、创建数据表 2、RDS中SQL查询操作 三、SQL查询操作 1、RDS中SQL查询操作 SQL查询操作 一、数据库DDL操作 1、登陆数据库 2、创建DB数据库 创建一个普通账号&#xff0c…

Hutool工具类

Hutool 是一个非常流行的 Java 工具类库&#xff0c;它提供了丰富的功能来简化开发中的常见任务&#xff0c;比如文件操作、加密、日期处理、字符串操作、数据库工具等。它是一个轻量级的工具库&#xff0c;可以减少开发者编写常用代码的工作量&#xff0c;提高开发效率。 主要…

Excel制作合同到期自动提醒!

大家好&#xff0c;我是小鱼。 今天分享一下如何利用Excel制作合同到期提醒表&#xff0c;实现Excel表格自动计算合同到期日和天数&#xff0c;根据合同状态和到期天数自动填充颜色提醒&#xff0c;超实用。先看一下效果&#xff0c;已经到期的合同会自动被填充为红色&#xf…