日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

React + TypeScript 默认 Props 的处理

發(fā)布時間:2024/8/26 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 React + TypeScript 默认 Props 的处理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

React 中的默認 Props

通過組件的 defaultProps 屬性可為其 Props 指定默認值。

以下示例來自 React 官方文檔 - Default Prop Values:

class Greeting extends React.Component {render() {return (<h1>Hello, {this.props.name}</h1>);} }// Specifies the default values for props: Greeting.defaultProps = {name: 'Stranger' };// Renders "Hello, Stranger": ReactDOM.render(<Greeting />,document.getElementById('example') );

如果編譯過程使用了 Babel 的 transform-class-properties 插件,還可以這么寫:

class Greeting extends React.Component {static defaultProps = {name: 'stranger'}render() {return (<div>Hello, {this.props.name}</div>)} }

加入 TypeScript

加入 TypeScript 后

interface Props {name?: string; }class Greeting extends React.Component<Props, {}> {static defaultProps = {name: "stranger",};render() {return <div>Hello, {this.props.name}</div>;} }

此時不支持直接通過類訪問 defaultProps 來賦值以設置默認屬性,因為 React.Component 類型上并沒有該屬性。

// ?Property 'defualtProps' does not exist on type 'typeof Greeting'.ts(2339) Greeting.defualtProps = {name: "stranger", };

默認屬性的類型

上面雖然實現(xiàn)了通過 defaultProps 來指定屬性的默認值,但 defaultProps 的類型是不受約束的,和 Props 沒有關聯(lián)上。以至于我們可以在 defaultProps 里面放任何值,顯然這是不科學的。

class Greeting extends React.Component<Props, {}> {static defaultProps = {name: "stranger",// 并不會報錯 + foo: 1, + bar: {},};// ... }

同時對于同一字段,我們不得不書寫兩次代碼。一次是定義組件的 Props,另一次是在 defaultProps 里。如果屬性有增刪或名稱有變更,兩個地方都需要改。

為了后面演示方便,現(xiàn)在給組件新增一個必填屬性 age:number。

interface Props {age: number;name?: string; }class Greeting extends React.Component<Props, {}> {static defaultProps = {name: "stranger",};render() {const { name, age } = this.props;return (<div>Hello, {name}, my age is {age}</div>);} }

通過可選屬性抽取出來,利用 typeof 獲取其類型和必傳屬性結合來形成組件的 Props 可解決上面提到的兩個問題。

所以優(yōu)化后的代碼成了:

const defaultProps = {name: "stranger", };type Props = {age: number; } & Partial<typeof defaultProps>;class Greeting extends React.Component<Props, {}> {static defaultProps = defaultProps;render() {const { name, age } = this.props;return (<div>Hello, {name}, my age is {age}</div>);} }

注意我們的 Props 是通過和 typeof defaultProps 組合而形成的,可選屬性中的 name 字段在整個代碼中只書寫了一次。

當我們更新了 defaultProps 時整個組件的 Props 也同步更新,所以 defaultProps 中的字段一定是組件所需要的字段。

默認值的判空檢查優(yōu)化

講道理,如果屬性提供了默認值,在使用時,可不再需要判空,因為其一定是有值的。但 TypeScript 在編譯時并不知道,因為有默認值的屬性是被定義成可選的 ?。

比如我們嘗試訪問 name 屬性的長度,

class Greeting extends React.Component<Props, {}> {static defaultProps = defaultProps;render() {const { name } = this.props;return (<div>{/* ?Object is possibly 'undefined'.ts(2532) */}name length is {name.length}</div>);} }

因為此時我們的 Props 實際上是:

type Props = {age: number; } & Partial<typeof defaultProps>; // 相當于: type Props = {age: number;name?: string; };

修正方法有多個,最簡單的是使用非空判定符/Non-null assertion operator。

非空判定符

- name length is {name.length} + name length is {name!.length}

這意味著每一處使用的地方都需要做類似的操作,當程序復雜起來時不太可控。但多數(shù)情況下應付日常使用,這樣已經(jīng)夠了。

類型轉換

因為組件內(nèi)部有默認值的保證,所以字段不可能為空,因此,可對組件內(nèi)部使用非空的屬性類型來定義組件,而對外仍暴露原來的版本。

const Greeting = class extends React.Component< - Props, + Props & typeof defaultProps,{} > {static defaultProps = defaultProps;render() {const { name } = this.props;return (<div> - name length is {name!.length} + name length is {name.length}</div>);} -}; +} as React.ComponentClass<Props>;

通過 as React.ComponentClass<Props> 的類型轉換,對外使用 Greeting 時屬性中 name 還是可選的,但組件內(nèi)部實際使用的是 Props & typeof defaultProps,而不是 Partial<T> 版本的,所以規(guī)避了字段可能為空的報錯。

通過高階組件的方式封裝默認屬性的處理

通過定義一個高階組件比如 withDefaultProps 將需要默認屬性的組件包裹,將默認值的處理放到高階組件中,同樣可解決上述問題。

function withDefaultProps<P extends object, DP extends Partial<P>>(dp: DP,component: React.ComponentType<P>, ) {component.defaultProps = dp;type RequiredProps = Omit<P, keyof DP>;return (component as React.ComponentType<any>) as React.ComponentType<RequiredProps & DP>; }

然后我們的組件則可以這樣來寫:

const defaultProps = {name: "stranger", };interface Props {name: string;age: number; }const _Greeting = class extends React.Component<Props, {}> {public render() {const { name } = this.props;return <div>name length is {name.length}</div>;} };export const Greeting = withDefaultProps(defaultProps, _Greeting);

這種方式就比較通用一些,將 withDefaultProps 抽取成一個公共組件,后續(xù)其他組件都可使用。但此種情況下就沒有很好地利用已經(jīng)定義好的默認值 defaultProps 中的字段,書寫 Props 時還需要重復寫一遍字段名。

相關資源

  • React docs - Default Prop Values
  • Default property value in React component using TypeScript
  • React, TypeScript and defaultProps dilemma

轉載于:https://www.cnblogs.com/Wayou/p/react_typescript_default_props.html

總結

以上是生活随笔為你收集整理的React + TypeScript 默认 Props 的处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久精彩免费视频 | 在线精品亚洲欧美日韩国产 | ts人妖另类精品视频系列 | 日韩狠狠 | a级片一区二区 | 美女脱了内裤喂我喝尿视频 | 亚洲永久免费 | 黄色成年人 | 亚洲综合av网| 精品视频免费在线观看 | 国产精品高潮呻吟久久aⅴ码 | 久久久福利| 国产男男chinese网站 | 超污巨黄的小短文 | 最新版天堂资源在线 | 欧美专区日韩专区 | 91国产一区 | 不卡视频国产 | 欧洲最强rapper网站直播 | 日韩在线视频在线 | 精品在线一区二区 | 久久国产精品免费看 | 中文幕无线码中文字蜜桃 | 2022天天操 | 久久人人草| 国产精品一级 | 可以免费看污视频的网站 | 成人高潮片免费 | 青青视频免费观看 | 51精品| 最好看的2019年中文在线观看 | 亚洲AV成人无码久久 | 99国产成人精品 | 大肉大捧一进一出视频 | 草久视频在线观看 | 丰满人妻一区二区三区53 | 国产免费自拍 | 久久久77 | 亚洲播播 | 日韩在线视屏 | 国产成人在线观看免费 | 欧美乱论 | 色宗合| 一区二区91 | 麻豆疯狂做受xxxx高潮视频 | 国产区一区二区三 | 久久久青 | 奇米四色7777 | www.狠狠艹 | 久久久久一区二区精码av少妇 | 久久久综合 | 高清日韩| 97在线免费公开视频 | 黄色一级片国产 | 99久久久无码国产精品性青椒 | 欧美一区二区二区 | 亚洲第一页色 | 国产极品91 | 91国产免费观看 | 国产亚洲综合av | 欧美xxxx18国产 | 精品久久久久久中文字幕 | 欧美在线一区视频 | 国产大屁股喷水视频在线观看 | 91精品国产高清91久久久久久 | 欧洲成人av | 福利社av| 国产精品一区二区三区在线看 | 亚洲第一毛片 | 大j8黑人w巨大888a片 | 少妇高潮露脸国语对白 | 四虎影视成人永久免费观看亚洲欧美 | 日产av在线播放 | 男女视频免费看 | 秋霞无码一区二区 | 亚洲最大福利网站 | 密臀久久| 国内精品一区二区三区 | 亚欧色视频 | 亚洲视频精品 | 国产精品99久久免费黑人人妻 | 免费黄色大片 | 亚洲国产精品影院 | 欧美三级一级片 | 中文字幕av网站 | 国产精品99久久久久久人 | 丁香久久婷婷 | 麻豆传媒网页 | 精品免费在线观看 | 色天堂在线视频 | 久久男人精品 | 免费看成人片 | 国产视频你懂得 | 国产后入清纯学生妹 | 日韩视频二区 | 成人黄性视频 | 久久免费电影 | 人成在线视频 | 婷婷射图|