使用ts搭建一個(gè)react class組件

  1. 在父組件中給子組件傳參
    在父組件中引入子組件,然后直接傳入?yún)?shù)休讳,子組件通過React.Component<Iprops>讲婚,它里面的第一個(gè)泛型參數(shù)就是你父組件傳來(lái)的參數(shù)
  • App.tsx
import React, { Component } from 'react';
import Button from './componets/button'

class App extends Component {
  render() {
    return (
      <div className="App">
        <Button>小改改</Button>
      </div>
    )
  }
}

  • button.tsx
import React from 'react'
import './button.css'
interface Iprops {
    size: string
}
class Button extends React.Component<Iprops>{
    render() {
        return (
            <div className="button">{this.props.children}</div>
        )
    }
}
export default Button
  1. 設(shè)置組件里的私有屬性
    組件中的私有屬性就是React.Component<>里面的第二個(gè)參數(shù)
interface IState {
    n: number
}
class Button extends React.Component<Iprops, IState>{
    constructor(props: Iprops) {
        super(props)
        this.state = {
            n: 1
        }
    }
    render() {
        return (
            <div className="button">
                {this.state.n}
            </div>
        )
    }
}
  1. 修改react開發(fā)者工具里組件的名字

我們現(xiàn)在的組件名字是Button,如果我們想修改它只需要在對(duì)應(yīng)組件中修改它靜態(tài)資源的displayName

class Button extends React.Component<Iprops, IState>{
    static displayName = 'LifaButton'
}
  1. 設(shè)置組件的props的默認(rèn)值
    當(dāng)我們沒有在父組件中傳給子組件props時(shí)俊柔,我們可以在子組件中通過defaultProps來(lái)設(shè)置它的默認(rèn)值
class Button extends React.Component<Iprops, IState>{
    static defaultProps = {
        size: 'normal'
    }
}

問題:在我們不傳的時(shí)候筹麸,我們?cè)O(shè)置默認(rèn)值,可能在使用的時(shí)候會(huì)報(bào)錯(cuò)雏婶,比如

它會(huì)報(bào)size有可能是undefined物赶,解決方法強(qiáng)制指定類型為string

this.props.size as string + 1
  1. 觸發(fā)父組件中的點(diǎn)擊事件
    (1). 在子組件中的props對(duì)應(yīng)的接口里定義onClick類型為React.MouseEventHandler
    (2). 父組件中傳入onClick,并聲明對(duì)應(yīng)的onClick事件留晚,事件里的event類型指定為React.MouseEvent
    (3). 子組件里的onClick調(diào)用父組件傳來(lái)的onClick
  • App.tsx
class App extends Component {
  onClick(e: React.MouseEvent) {
    console.log(e)
  }
  render() {
    return (
      <div className="App">
        <Button onClick={this.onClick}>哈哈哈小改改</Button>
      </div>
    )
  }
}
  • button.tsx
interface Iprops {
    onClick: React.MouseEventHandler
}
class Button extends React.Component<Iprops> {
  render(
    <div className="button" onClick={this.props.onClick}></div>
   )
}

問題:
上面的e: React.MouseEvent酵紫,我們直接打印出e.target是當(dāng)前的div標(biāo)簽,div可以設(shè)置style错维,所以我們嘗試打印出e.target.style憨闰,但是我們發(fā)現(xiàn)會(huì)報(bào)錯(cuò),因?yàn)樗J(rèn)為e.target有可能是undefined需五。
解決辦法:

  1. 指定e.target類型為HTMLDIVElement
e.target as HTMLDivElement).style
  1. 直接為e指定React.MouseEvent<HTMLDivElement>
onClick(e: React.MouseEvent<HTMLDivElement>) {
    const div = e.currentTarget
    console.log(div.style.width)
 }
  1. this問題鹉动,react里默認(rèn)this是undefined,如果需要對(duì)屬性進(jìn)行操作宏邮,需要使用箭頭函數(shù)泽示,或者綁定它的this
    寫法1:
class Button extends React.Component<Iprops, IState>{
    static displayName = 'LifaButton'
    static defaultProps = {
        size: 'normal'
    }
    constructor(props: Iprops) {
        super(props)
        this.state = {
            n: 1
        }
    }
    // 使用箭頭函數(shù)讓this等于外界的this
    onClick= ()=> {
        this.setState({
            n: this.state.n + 1
        })
    }
    render() {
        return (
            <div className="button" onClick={this.onClick}>
                {this.props.children}
                {this.state.n}
            </div>
        )
    }
}

寫法2:

onClick(){
        this.setState({
            n: this.state.n + 1
        })
    }
    render() {
        return (
            <div className="button" onClick={this.onClick.bind(this)}>
                {this.props.children}
                {this.state.n}
            </div>
        )
    }

總結(jié):

  1. React.Compoent<>里的第一個(gè)參數(shù)是props的類型缸血,第二個(gè)是state的類型
  2. 如果需要綁定click事件,你需要聲明onClick類型為React.Mouse(事件類型)EventHandler
  3. onClick兩種寫法:
    (1). 舊語(yǔ)法加bind this.onClick.bind(this)
    (2). 直接箭頭函數(shù)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末械筛,一起剝皮案震驚了整個(gè)濱河市捎泻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌埋哟,老刑警劉巖笆豁,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異赤赊,居然都是意外死亡闯狱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門抛计,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)哄孤,“玉大人,你說(shuō)我怎么就攤上這事吹截∈莩拢” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵波俄,是天一觀的道長(zhǎng)晨逝。 經(jīng)常有香客問我,道長(zhǎng)懦铺,這世上最難降的妖魔是什么捉貌? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮阀趴,結(jié)果婚禮上昏翰,老公的妹妹穿的比我還像新娘。我一直安慰自己刘急,他們只是感情好棚菊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著叔汁,像睡著了一般统求。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上据块,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天码邻,我揣著相機(jī)與錄音,去河邊找鬼另假。 笑死像屋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的边篮。 我是一名探鬼主播己莺,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼奏甫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了凌受?” 一聲冷哼從身側(cè)響起阵子,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胜蛉,沒想到半個(gè)月后挠进,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡誊册,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年领突,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片解虱。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡攘须,死狀恐怖漆撞,靈堂內(nèi)的尸體忽然破棺而出殴泰,到底是詐尸還是另有隱情,我是刑警寧澤浮驳,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布悍汛,位于F島的核電站,受9級(jí)特大地震影響至会,放射性物質(zhì)發(fā)生泄漏离咐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一奉件、第九天 我趴在偏房一處隱蔽的房頂上張望宵蛀。 院中可真熱鬧,春花似錦县貌、人聲如沸术陶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)梧宫。三九已至,卻和暖如春摆碉,著一層夾襖步出監(jiān)牢的瞬間塘匣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工巷帝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留忌卤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓楞泼,卻偏偏與公主長(zhǎng)得像驰徊,于是被迫代替她去往敵國(guó)和親历谍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 作為一個(gè)合格的開發(fā)者辣垒,不要只滿足于編寫了可以運(yùn)行的代碼望侈。而要了解代碼背后的工作原理;不要只滿足于自己的程序...
    六個(gè)周閱讀 8,441評(píng)論 1 33
  • HTML模版 之后出現(xiàn)的React代碼嵌套入模版中勋桶。 1. Hello world 這段代碼將一個(gè)一級(jí)標(biāo)題插入到指...
    ryanho84閱讀 6,232評(píng)論 0 9
  • 40脱衙、React 什么是React?React 是一個(gè)用于構(gòu)建用戶界面的框架(采用的是MVC模式):集中處理VIE...
    萌妹撒閱讀 1,014評(píng)論 0 1
  • React 核心思想 —— 組件化React 將界面分成了一個(gè)個(gè)組件例驹,通過組件的組合捐韩、嵌套構(gòu)成頁(yè)面。其中鹃锈,組件可復(fù)...
    sylvia_yue閱讀 1,049評(píng)論 1 2
  • 深入JSX date:20170412筆記原文其實(shí)JSX是React.createElement(componen...
    gaoer1938閱讀 8,061評(píng)論 2 35