react常見的ts類型實踐解析
正文
ts
在中在react
用處很是很廣泛,本文是一篇關(guān)于在react
中常用的類型總結(jié),希望能帶來一些思考和幫助。
- 一個函數(shù)組件
import React from "react"; type Props = { } const Header: React.FC<Props> = (props) => { return (<> <div>header</div> {props.children} </>) }
我們注意在Header
組件中有使用到props.children
如果Props
沒有申明類型那么此時就會報這樣的錯誤
此時我們需要加個類型就行,并且children
是可選的
import React from "react"; interface Props { children?: React.ReactNode; }
除了children
,有時我想給Header
組件傳入一個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
我們似乎對每一個可選項都有做?
可選,有沒有一勞永逸的辦法
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
申明了一個children?: React.ReactNode
,如果你不想這么寫,react
也提供了一個屬性PropsWithChildren
interface ChildProps {} export const SubHeader: React.FC = ( props: PropsWithChildren<{}> & Partial<ChildProps> ) => { return <div className={`sub-header`}>{props.children}</div>; };
在dom節(jié)點上的類型
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> </> ); };
傳入子組件的方法
我想傳入一個方法到子組件里去
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"); });
一個doms上的類型
在sure
按鈕上用ref綁定一個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> </> ); };
此時我們需要給sureRef
申明類型,并且?
訪問可選屬性
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)入一個組件需要的多個類型
// userInterfence.ts export type UserInfo = { name: string; age: number; }; export type Menu = { title: string; price: number; isChecked: boolean; items: Array<{ name: string; price: number; }>; };
在另外一個組件引入
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> </> ); };
選擇一個組件的指定的幾個屬性
在兩個類似的組件,我們有一些公用的屬性,此時我們的類型可以借用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
來選擇指定的屬性
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> </> ); };
另一個組件中使用
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
,比如如何申明一個組件的返回的類型,以及接收props
的參數(shù)
如何申明一個dom上的類型,以及如何傳入一個函數(shù)到子組件的類型
!
與?
的使用,當(dāng)我們知道一定有該屬性時,你可以使用!
,如果一個屬性是可選的那么就用?
Omit
與Pick
在組件中的使用,更多typescript參考官方文檔學(xué)習(xí)
以上就是react常見的ts類型實踐解析的詳細(xì)內(nèi)容,更多關(guān)于react常見的ts類型的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
ReactiveCocoa代碼實踐之-UI組件的RAC信號操作
這篇文章主要介紹了ReactiveCocoa代碼實踐之-UI組件的RAC信號操作 的相關(guān)資料,需要的朋友可以參考下2016-04-04React?Refs?的使用forwardRef?源碼示例解析
這篇文章主要為大家介紹了React?之?Refs?的使用和?forwardRef?的源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11使用React-Window實現(xiàn)虛擬滾動效果的示例代碼
React-Window?是一個為?React?應(yīng)用程序中高效渲染大數(shù)據(jù)集而設(shè)計的庫,它基于窗口化或虛擬化的原則運行,本文將使用React-Window實現(xiàn)虛擬滾動效果,感興趣的可以了解下2024-01-01React函數(shù)組件hook原理及構(gòu)建hook鏈表算法詳情
這篇文章主要介紹了React函數(shù)組件hook原理及構(gòu)建hook鏈表算法詳情,每一個?hook?函數(shù)都有對應(yīng)的?hook?對象保存狀態(tài)信息,更多詳細(xì)分析,需要的朋友可以參考一下2022-07-07解決React報錯Property does not exist on 
這篇文章主要為大家介紹了React報錯Property does not exist on type 'JSX.IntrinsicElements'解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12