TypeScript && React
环境搭建
我们当然可以先用脚手架搭建React项目,然后手动配置成支持TypeScript的环境,虽然比较麻烦,但可以让你更清楚整个过程。这里比较麻烦,就不演示了,直接用命令配置好。
npx create-react-app appname --typescript
可以安装一些自己需要的库及其声明文件,例如react-router-dom、axios、ant Design等。如果要安装ant design,还需要在开发环境库中安装一些依赖库,以帮助实现按需加载。
使用
有类型约束的函数组件
import React from "react";
import { Button } from "antd"; interface Greeting {
name: string;
firstName?: string;
lastName?: string;
} // 没有使用React.FC
const HelloOld = (props: Greeting) => <Button>你好{props.name}</Button>; // 使用React.FC泛型类型
const Hello: React.FC<Greeting> = (props) => {
return (
<Button>Hello {props.name}</Button>
)
}; export { Hello, HelloOld };
定义函数组件时,使用React.FC与不使用没有太多区别,没有为我们带来明显的好处,建议使用常规定义方式。
有类型约束的类组件
import React,{Fragment} from "react";
import { Button } from "antd";
interface Greeting {
name: string;
firstName?: string;
lastName?: string;
}
interface State {
count: number
}
// 泛型类型,第一个传入参数约束属性props,第二个约束状态state(内部数据)
class HelloClass extends React.Component<Greeting, State> {
state: State = {
count: 0
};
static defaultProps = { // 属性默认值
firstName: "",
lastName: "",
};
render() {
return (
<Fragment>
<p>点击了{this.state.count}次</p>
<Button onClick={()=>{this.setState({count: this.state.count+1})}}>Hello{this.props.name}Class</Button>
</Fragment>
);
}
}
export default HelloClass;
有类型约束的高阶组件
import React from "react";
import HelloClass from "./HelloClass"; interface Loading {
loading: boolean;
} function HelloHoc<P>(params?: any) {
return function<P>(WrappedComponent: React.ComponentType<P>) { // P表示被包装组件的属性的类型
return class NewComponent extends React.Component<P & Loading>{ // 这里使用交叉类型,为新组件增加一些属性,接口Loading定义了新增的属性声明
render(){
return this.props.loading ? <div>Loading</div> : <WrappedComponent {...this.props as P}/> }
}
}
} export default HelloHoc()(HelloClass);
高阶组件在ts中使用会有比较多的类型问题,解决这些问题通常不会很顺利,而且会存在一些已知的bug,这不是高阶组件本身的问题,而是React声明文件还没有很好地兼容高阶组件的类型检查,更好的方式是使用Hooks
有类型约束的Hooks
import React, { useState, useEffect } from "react";
import { Button } from "antd";
interface Greeting {
name: string;
firstName?: string;
lastName?: string;
}
const HelloHooks = (props: Greeting) => {
const [ count, setCount ] = useState(0); // 设了初值,所以不用定义类型
const [ text, setText ] = useState<string | null>(null);
useEffect(()=>{
count > 5 && setText("休息一下");
},[count]); // 第二个参数的作用是,只有当count改变的时候,函数内的逻辑才会执行。
return (
<>
<p>你点击了Hooks {count} 次 {text}</p>
<Button onClick={()=>{setCount(count+1)}}>{props.name}</Button>
</>
);
};
export default HelloHooks;
事件绑定
class HelloClass extends React.Component<Greeting, State> {
state: State = {
count: 0
};
clickHandle = (e: React.MouseEvent) => { // 事件对象e的类型使用内置的合成事件。在回调函数中,e的属性都会无效
e.persist(); // 将该事件从池中删除合成事件,可以正常使用
console.log(e);
// this.setState({count: this.state.count+1})
};
inputHandle = (e: React.FormEvent<HTMLInputElement>) => {
// e.persist();
console.log(e.currentTarget.value); // 此时编译器报错,认为没有value属性,需要指定<HTMLInputElement>泛型类型
// console.log(e.target.value); // 仍然不行
};
render() {
return (
<Fragment>
<p>点击了{this.state.count}次</p>
<Button onClick={this.clickHandle}>Hello{this.props.name}Class</Button>
<input onChange={this.inputHandle}/>
</Fragment>
);
}
}
TypeScript && React的更多相关文章
- Nodejs生态圈的TypeScript+React
基于Nodejs生态圈的TypeScript+React开发入门教程 基于Nodejs生态圈的TypeScript+React开发入门教程 概述 本教程旨在为基于Nodejs npm生态圈的前端程 ...
- 基于Nodejs生态圈的TypeScript+React开发入门教程
基于Nodejs生态圈的TypeScript+React开发入门教程 概述 本教程旨在为基于Nodejs npm生态圈的前端程序开发提供入门讲解. Nodejs是什么 Nodejs是一个高性能Ja ...
- typescript+react+antd基础环境搭建
typescript+react+antd基础环境搭建(包含样式定制) tsconfig.json 配置 // 具体配置可以看上面的链接 这里module moduleResolution的配置都会影 ...
- TypeScript & React & Jest
TypeScript & React & Jest create-react-app Jest ``tsx import React from 'react'; import { re ...
- Typescript & React & Vue
Typescript & React & Vue Typescript & React https://facebook.github.io/create-react-app/ ...
- Typescript & React & optional parameters & default parameters
Typescript & React & optional parameters & default parameters Typescript & optional ...
- 从零开始配置TypeScript + React + React-Router + Redux + Webpack开发环境
转载请注明出处! 说在前面的话: 1.为什么不使用现成的脚手架?脚手架配置的东西太多太重了,一股脑全塞给你,我只想先用一些我能懂的库和插件,然后慢慢的添加其他的.而且自己从零开始配置也能学到更多的东西 ...
- webpack构建多页面react项目(webpack+typescript+react)
目录介绍 src:里面的每个文件夹就是一个页面,页面开发相关的组件.图片和样式文件就存放在对应的文件夹下. tpl:里面放置模板文件,当webpack打包时为html-webpack-plugin插件 ...
- TypeScript + React + Redux 实战简单天气APP全套完整项目
下载链接:https://www.yinxiangit.com/171.html 目录: 从面向过程的js到面向对象的js,让web前端更加高大尚.让你的前端步步日上,紧跟技术发展的前沿.让你构建更加 ...
随机推荐
- 码农"混子"的思想转变
首先介绍一下自己,在高中的时候学校对于我们这种普通班级采取的都是放养状态,所以高中的学习真是不咋地,可能除了自己擅长的数学以外其他也就考个三四十分,后来磕磕绊绊的在打游戏之余也会学习,第一次参加高考跟 ...
- 存在于文件名中的SQL手工注入
SQL注入已经在前一章为大家介绍了个大概,本文将讲述我遇到的本以为是文件上传漏洞,却是以文件名触发的SQL注入! 本文分享的内容同样来自于一道CTF题! 1. 直接进入正题 (1) 初步探测 先看一下 ...
- (八)c#Winform自定义控件-分割线
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...
- LD_PRELOAD和ld --wrap
前言 LD_PRELOAD和ld --wrap都能实现不修改原始代码,替换指定函数的实现.通常我们会使用这些方法,替换如malloc)()/free().read()/write()等函数,并在替换函 ...
- 本地VSCode编辑远程服务器文件
前言 先说下我的场景:服务器搭设了一系列复杂环境,然后需要使用PHP实现某些功能 选这种远程编辑的原因: 首先PHP打死我也不想装(这个现在是出了VB外最惹人厌的语言了) 然后环境比较复杂,本地装下比 ...
- jjyq app登录接口报:“内容类型不支持”???已解决
1.在 app上进行登录操作,成功. 2.通过fiddler抓包得到jjyq登录接口的url.param.header. 3.在pycharm中使用requests发起请求,运行报错:内容类型不支持?
- .net core redis的全套操作
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). Redis支持主从同步.数据可以从主服务器向任意数 ...
- Tomcat源码分析 (十)----- 彻底理解 Session机制
Tomcat Session 概述 首先 HTTP 是一个无状态的协议, 这意味着每次发起的HTTP请求, 都是一个全新的请求(与上个请求没有任何联系, 服务端不会保留上个请求的任何信息), 而 Se ...
- 综述 | SLAM回环检测方法
本文作者任旭倩,公众号:计算机视觉life成员,由于格式原因,公式显示可能出问题,建议阅读原文链接:综述 | SLAM回环检测方法 在视觉SLAM问题中,位姿的估计往往是一个递推的过程,即由上一帧位姿 ...
- Docker安装Skywalking APM分布式追踪系统
环境介绍 本文使用虚拟机unbutu18+docker.本unbutu18系统IP地址为:192.168.150.134 大家在使用时记得将此地址换成自己的实际地址. docker的安装可参考:htt ...