在 React 中使用 TypeScript 创建组件

函数组件

在 TypeScript 中不再需要导入 Props 类来限制 props 的类型,而是使用 type 来限制。自定义函数组件 Info 的类型是一个带有泛型的函数,我们需要把 Props 传入到泛型中。并将 {name, age}放进参数列表中,对从父组件接收到的 props 解构赋值。

import React, {FC} from 'react';

// 限制 props 类型
type Props = {
    name: string
    age: number
}

// 自定义函数组件 Info
const Info: FC<Props> = ({name, age}) => (
    <h1>I'm {name}, my age is {age}</h1>
)

export default Info

可以利用 TypeScript 的类型推断进一步简化。

import React from 'react';

type Props = {
    name: string
    age: number
}

const Info = ({name, age} : Props) => (
    <h1>I'm {name}, my age is {age}</h1>
)

export default Info

可以用 Info.defaultProps对 props 设置默认值。

import React from 'react';

type Props = {
    name: string
    age?: number // 可选的 props
}

const Info = ({name, age} : Props) => (
    <h1>I'm {name}, my age is {age}</h1>
)

Info.defaultProps = {
    age: 100
}

export default Info

设置默认值的方式也可以通过 js 的语法进一步简化。当解构赋值没有从父组件传递过来的 props 上得到age的值时,对其赋默认值。

import React from 'react';

type Props = {
    name: string
    age?: number
}

const Info = ({name, age = 100} : Props) => (
    <h1>I'm {name}, my age is {age}</h1>
)

export default Info

class 组件

class 既可以有 props ,又可以有 state ,情况稍微复杂一些。根据有无 props 和 state 排列组合可以分为下面四种。

import React from 'react';

type Props = { message?: string }
type State = { count: number }

class C1 extends React.Component {}
class C2 extends React.Component<Props> {}
class C3 extends React.Component<{}, State> {}
class C4 extends React.Component<Props, State> {}

类组件使用static defaultProps提供默认属性值。其需要在Props中选择一部分字段添加默认值,所以这是Partial<Props>类型的。

import React from 'react';

type Props = { message?: string }

class Counter extends React.Component<Props, State> {

    static defaultProps: Partial<Props> = {
        message: 'no message'
    }

    render() {
        return (
            <div>
                <h1>message: {this.props.message}</h1>
            </div>
        )
    }
}

export default Counter

同理,可以像上面的函数组件一样通过解构赋值语法简化。

import React from 'react';

type Props = { message?: string }

class Counter extends React.Component<Props, State> {

    render() {

        const {message = 'no message'} = this.props // 解构赋值同时设置默认值

        return (
            <div>
                <h1>message: {message}</h1>
            </div>
        )
    }
}

export default Counter

下面加上 state

import React from 'react';

type Props = { message?: string }
type State = { count: number }

class Counter extends React.Component<Props, State> {
	
	// 定义 state
    state: State = {
        count: 0
    }
	
	// 更新 state
    handleClick = () => {
        this.setState({
            count: this.state.count + 1
        })
    }
    
    render() {

        const {message = 'no message'} = this.props
        const {count} = this.state

        return (
            <div>
                <h1>message: {message}</h1>
                <h1>count: {count}</h1> 
                <button onClick={this.handleClick}></button>
            </div>
        )
    }
}

export default Counter
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FengLing255

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值