react常見(jiàn)的ts類型實(shí)踐解析
正文
ts在中在react用處很是很廣泛,本文是一篇關(guān)于在react中常用的類型總結(jié),希望能帶來(lái)一些思考和幫助。
- 一個(gè)函數(shù)組件
import React from "react";
type Props = {
}
const Header: React.FC<Props> = (props) => {
return (<>
<div>header</div>
{props.children}
</>)
}
我們注意在Header組件中有使用到props.children如果Props沒(méi)有申明類型那么此時(shí)就會(huì)報(bào)這樣的錯(cuò)誤

此時(shí)我們需要加個(gè)類型就行,并且children是可選的
import React from "react";
interface Props {
children?: React.ReactNode;
}
除了children,有時(shí)我想給Header組件傳入一個(gè)className,并且是可選的
import React from "react";
type Props = {
children?: React.ReactNode;
className?: string;
}
const Header: React.FC<Props> = (props) => {
const { className } = props;
return (<>
<div className={`App-header ${className}`}>header</div>
{props.children}
</>)
}
在Props我們似乎對(duì)每一個(gè)可選項(xiàng)都有做?可選,有沒(méi)有一勞永逸的辦法
Partial<T>所有屬性都是可選
import React from "react";
type Props = {
children: React.ReactNode;
className: string;
}
const Header: React.FC<Partial<Props>> = (props) => {
const { className = '' } = props;
return (<>
<div className={`App-header ${className}`}>header</div>
{props.children}
</>)
}
在以上我們給Props申明了一個(gè)children?: React.ReactNode,如果你不想這么寫(xiě),react也提供了一個(gè)屬性PropsWithChildren
interface ChildProps {}
export const SubHeader: React.FC = (
props: PropsWithChildren<{}> & Partial<ChildProps>
) => {
return <div className={`sub-header`}>{props.children}</div>;
};
在dom節(jié)點(diǎn)上的類型
import React, { PropsWithChildren, useRef } from "react";
const Input: React.FC = () => {
const inputRef = useRef<HTMLInputElement>(null);
const sureRef = useRef<HTMLDivElement>(null);
return (
<>
<input type="text" ref={inputRef} />
<div ref={sureRef}>確定</div>
</>
);
};
傳入子組件的方法
我想傳入一個(gè)方法到子組件里去
type InputProps = {
onSure: () => void;
};
const Input: React.FC<InputProps> = (props) => {
const inputRef = useRef<HTMLInputElement>(null);
const sureRef = useRef<HTMLDivElement>(null);
return (
<>
<input type="text" ref={inputRef} />
<div ref={sureRef} onClick={props?.onSure}>
確定
</div>
</>
);
};
const Index: React.FC<Partial<Props>> = (props) => {
const { className } = props;
const handleSure = () => {};
return (
<header className={`App-header ${className}`}>
<Input onSure={handleSure} />
{props.children}
</header>
);
};
!非空斷言,一定有該方法或者屬性
const body = document!.getElementsByTagName("body")[0];
body.addEventListener("click", () => {
console.log("body");
});
一個(gè)doms上的類型
在sure按鈕上用ref綁定一個(gè)dom
const Input: React.FC<InputProps> = (props) => {
const inputRef = useRef<HTMLInputElement>(null);
const sureRef = useRef(null);
const body = document!.getElementsByTagName("body")[0];
body.addEventListener("click", () => {
console.log(sureRef.current?.style);
console.log("body");
});
return (
<>
<input type="text" ref={inputRef} />
<div ref={sureRef} onClick={props?.onSure}>
確定
</div>
</>
);
};

此時(shí)我們需要給sureRef申明類型,并且?訪問(wèn)可選屬性
const inputRef = useRef<HTMLInputElement>(null);
const sureRef = useRef<HTMLDivElement>(null);
const body = document!.getElementsByTagName("body")[0];
body.addEventListener("click", () => {
console.log(sureRef.current?.style);
console.log("body");
});
導(dǎo)入一個(gè)組件需要的多個(gè)類型
// userInterfence.ts
export type UserInfo = {
name: string;
age: number;
};
export type Menu = {
title: string;
price: number;
isChecked: boolean;
items: Array<{
name: string;
price: number;
}>;
};
在另外一個(gè)組件引入
import type { UserInfo, Menu } from "./userInterfence";
const Input: React.FC<InputProps> = (props) => {
const [userInfo, setUserInfo] = useState<UserInfo>({
name: "Web技術(shù)學(xué)苑",
age: 10,
});
const inputRef = useRef<HTMLInputElement>(null);
const sureRef = useRef<HTMLDivElement>(null);
const body = document!.getElementsByTagName("body")[0];
body.addEventListener("click", () => {
console.log(sureRef.current?.style);
console.log("body");
});
return (
<>
<input type="text" ref={inputRef} value={userInfo.name} />
<input type="text" value={userInfo.age} />
<div ref={sureRef} onClick={props?.onSure}>
確定
</div>
</>
);
};

選擇一個(gè)組件的指定的幾個(gè)屬性
在兩個(gè)類似的組件,我們有一些公用的屬性,此時(shí)我們的類型可以借用Omit去掉一些不需要的屬性類型
import type { UserInfo, Menu } from "./userInterfence";
const MenuComp: React.FC<Omit<Menu, "items" | "isChecked">> = (props) => {
return (
<>
<p>{props.price}</p>
<p>{props.title}</p>
</>
);
};
在header組件中引入
<header className={`App-header ${className}`}>
<MenuComp price={10} title={"menuA"} />
{props.children}
</header>
或者你可以使用Pick來(lái)選擇指定的屬性
import type { UserInfo, Menu } from "./userInterfence";
const MenuSubComp: React.FC<Pick<Menu, "items">> = (props) => {
return (
<>
<p>{props.items[0].name}</p>
<p>{props.items[0].price}</p>
</>
);
};
另一個(gè)組件中使用
const Index: React.FC<Partial<Props>> = (props) => {
const { className } = props;
const subInfo: Pick<Menu, "items"> = {
items: [
{
name: "Web技術(shù)學(xué)苑",
price: 10,
},
],
};
return (
<header className={`App-header ${className}`}>
<MenuComp price={10} title={"menuA"} />
<MenuSubComp items={subInfo.items} />
{props.children}
</header>
);
};
總結(jié)
在react高頻常用的ts,比如如何申明一個(gè)組件的返回的類型,以及接收props的參數(shù)
如何申明一個(gè)dom上的類型,以及如何傳入一個(gè)函數(shù)到子組件的類型
!與?的使用,當(dāng)我們知道一定有該屬性時(shí),你可以使用!,如果一個(gè)屬性是可選的那么就用?
Omit與Pick在組件中的使用,更多typescript參考官方文檔學(xué)習(xí)
以上就是react常見(jiàn)的ts類型實(shí)踐解析的詳細(xì)內(nèi)容,更多關(guān)于react常見(jiàn)的ts類型的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
react-native 配置@符號(hào)絕對(duì)路徑配置和絕對(duì)路徑?jīng)]有提示的問(wèn)題
本文主要介紹了react-native 配置@符號(hào)絕對(duì)路徑配置和絕對(duì)路徑?jīng)]有提示的問(wèn)題,文中通過(guò)圖文示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01
react配置webpack-bundle-analyzer項(xiàng)目?jī)?yōu)化踩坑記錄
這篇文章主要介紹了react配置webpack-bundle-analyzer項(xiàng)目?jī)?yōu)化踩坑記錄,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
詳解如何在React中監(jiān)聽(tīng)鼠標(biāo)事件
React可以通過(guò)使用React事件系統(tǒng)來(lái)監(jiān)聽(tīng)鼠標(biāo)事件,您可以在React組件中通過(guò)使用特定的事件處理函數(shù)來(lái)注冊(cè)和處理鼠標(biāo)事件,本文小編講給大家詳細(xì)介紹一下如何在React中監(jiān)聽(tīng)鼠標(biāo)事件,需要的朋友可以參考下2023-09-09
React Form組件的實(shí)現(xiàn)封裝雜談
這篇文章主要介紹了React Form組件的實(shí)現(xiàn)封裝雜談,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05

