react中TS类组件的写法

类组件最多的就是Typescript接口类型的应用,限制组件状态或者属性符合接口定义

  1. state.tsx
state = { name: 'xx' }
setState({
    name: 100 // 这个值如果是后台返回的,你不知道类型,运行时才能看到报错;或者调用别人的函数的返回结果
})
// 换种写法再试试
interface IState {
    name: string
}
export ...
state: IState = { name: 'xx' }
//
setState({ // 此时这样改并不会提示,因为不是直接改, this.state.name = 100这样才有提示
    name: 100
}
// react有专门的写法
export default class App extends Component<约定属性,约定状态>
export default class App extends Component<any,IState> { // 属性不约束,状态约束
    state = {
        name: 'xxx' // 这时就会提示类型校验
    }
    render() {
        return (
            // ...
            setState({name: "yyy"})
            // ...
        )
    }
}
  1. todo.tsx
interface IState {
  text: string,
  list: string[]
}
export default class App extends Component<any, IState> {
    state = {
        text: "",
        list: []
    }
    myRef = React.createRef<HTMLInputElement>() // 需要指定ref的类型
    render() {
        return (
            <div>
                // <input type="text" value={this.state.text}onChange={
                //     (evt) => {
                //         setState({
                //             text: evt.target.value
                //         })
                //     }
                // }>
                // 或者试试ref
                <input ref={this.myRef}>
                <button onClick={
                    // console.log(state.name)
                    // console.log(this.myRef.current.value)
                    console.log((this.myRef.current as HTMLInputElement).value) // 需要加类型断言
                    this.setSate({
                        list: [...this.sate.list, (this.myRef.current as HTMLInputElement).value]
                    })
                }></button>
                {
                    this.state.list.map(item=>
                        <li key={item}>{item}</li>
                    )
                }
            </div>
        )
    }
}
  1. props.tsx
export default class App extends Component {
    render() {
        return (
            <div>
                <Child name="aaa">
            </div>
        )
    }
}
interface IProps {
    name: string
}
class Child extends Component<IProps, any> {
    render() {
        return <div>
            {this.props.name}
        </div>
    }
}

  1. drawer.tsx
export default class App extends Component {
  state = {
    isShow: true,
  };
  render() {
    return (
      <div>
        app
        <Navbar
          title="first page"
          cb={() => {
            this.setState({
              isShow: !this.state.isShow,
            });
          }}
        />
        {this.state.isShow && <Sidebar></Sidebar>}
      </div>
    );
  }
}
interface IProps {
  title: string;
  cb: () => void;
}
class Navbar extends Component<IProps, any> {
  render() {
    return (
      <div>
        Navbar-{this.props.title}
        <button
          onClick={() => {
            this.props.cb();
          }}
        ></button>
      </div>
    );
  }
}
class Sidebar extends Component {
  render() {
    return <div>Sidebar</div>;
  }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ICPunk

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

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

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

打赏作者

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

抵扣说明:

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

余额充值