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>);}
}

 

转载于:https://www.cnblogs.com/V587Chinese/p/11520674.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246977.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab内存溢出的解决方案

&#xff08;1&#xff09; 增加虚拟内存&#xff1a;cmd -> taskmgr 打开任务管理器&#xff0c;查看物理内存和虚拟内存&#xff0c;可观察matlab在运行过程中是否超过物理内存和虚拟内存。若超过&#xff0c;增加虚拟内存的方法是不可行的。物理内存不足的时候可以通过将…

c++MMMMM:oo

1.union&#xff0c;struct和class的区别 转载于:https://www.cnblogs.com/invisible2/p/11524465.html

matlab调用Java程序时出现 Java.lang.OutOfMemoryErrot: GC overhead limit exceeded

matlab调用Java程序时出现 java.lang.OutOfMemoryError: GC overhead limit exceeded JDK1.6.0_37和JDK_1.7.0_60版本&#xff0c;这2个版本中JVM默认启动的时候-XX:UseGCOverheadLimit&#xff0c;即启用了该特性。这其实是JVM的一种推断&#xff0c;如果垃圾回收耗费了98%的…

[FY20 创新人才班 ASE] 第 1 次作业成绩

作业概况 条目备注作业链接【ASE高级软件工程】热身作业&#xff01;提交人数19未完成人数2满分10分作业情况总结 本次作业作为大家软工课程的第一次作业&#xff0c;完成度相当不错&#xff08;尤其是在国外暑研/赶论文的同学也在尽力完成作业&#xff0c;很感动&#xff09;。…

JVM 参数设置

1、集成开发环境下启动并使用JVM&#xff0c;如eclipse需要修改根目录文件eclipse.ini&#xff1b; 2、Windows服务器下安装版Tomcat&#xff0c;可使用Tomcat8w.exe工具&#xff08;tomcat目录下&#xff09;和直接修改注册表两种方式修改Jvm参数&#xff1b; 3、Windows服务…

从筛选简历和面试流程讲起,再给培训班出身的程序员一些建议

本人最近几年一直在外企和互联网公司承担Java技术面试官的职责&#xff0c;大多面试的是Java初级和高级开发&#xff0c;其中有不少是培训班出身的候选人。 在我之前的博文里&#xff0c;从面试官的角度聊聊培训班对程序员的帮助&#xff0c;同时给培训班出身的程序员一些建议&…

马普所机器学习课程 CMU701

马普所机器学习课程 Max-Planck-Institut fr Informatik: Machine Learning https://www.mpi-inf.mpg.de/departments/computer-vision-and-multimodal-computing/teaching/courses/ 马普所 GVV project http://gvv.mpi-inf.mpg.de/GVV_Projects.html CMU701 Tom Mitchel…

Random Forest 实用经验(转)

总结两条关于random forest的实用经验。给定数据和问题&#xff0c;对于算法选择有参考价值。 小样本劣势&#xff0c;大样本优势 小样本情况下&#xff08;1k~100k&#xff09;&#xff1a; RF相对与经典算法&#xff08;SVM or Boosting&#xff09;没优势&#xff0c;一般…

pytorch 查看中间变量的梯度

pytorch 为了节省显存&#xff0c;在反向传播的过程中只针对计算图中的叶子结点(leaf variable)保留了梯度值(gradient)。但对于开发者来说&#xff0c;有时我们希望探测某些中间变量(intermediate variable) 的梯度来验证我们的实现是否有误&#xff0c;这个过程就需要用到 te…

hbase数据迁移到hive中

描述&#xff1a; 原先数据是存储在hbase中的&#xff0c;但是直接查询hbase速度慢&#xff08;hbase是宽表结构&#xff09;&#xff0c;所以想把数据迁移到hive中&#xff1b; 1.先hbase 和 hive创建 外部表链接&#xff0c; 可以在hive直接查询&#xff1b; 2.利用创建的外部…

weka 学习总结(持续)

机器学习之 Weka学习&#xff08;一&#xff09;weka介绍&#xff0c;安装和配置环境变量 机器学习之 Weka学习&#xff08;二&#xff09;算法说明 Weka数据挖掘处理流程介绍 机器学习之 weka学习&#xff08;五&#xff09;示例用法 Weka数据处理结果分析 http://blog.c…

作为IT面试官,我如何考核计算机专业毕业生?作为培训班老师,我又如何提升他们?...

我最近几年一直在做技术面试官&#xff0c;除了面试有一定工作经验的社会人员外&#xff0c;有时还会面试在校实习生和刚毕业的大学生。同时&#xff0c;我也在学校里做过兼职讲师&#xff0c;上些政府补贴课程&#xff08;这些课程有补贴&#xff0c;学生不用出钱&#xff09;…

memcpy函数的实现

1.按1个字节拷贝 &#xff08;1&#xff09;不要直接使用形参&#xff0c;要转换成char* &#xff08;2&#xff09;目标地址要实现保存 &#xff08;3&#xff09;要考虑源和目标内存重叠的情况 void * mymemcpy(void *dest, const void *src, size_t count) {if (dest NULL …

MATLAB中调用Weka设置方法(转)及示例

本文转自&#xff1a; http://blog.sina.com.cn/s/blog_890c6aa30101av9x.html MATLAB命令行下验证Java版本命令 version -java 配置MATLAB调用Java库 Finish Java codes.Create Java library file, i.e., .jar file.Put created .jar file to one of directories Matlab …

webpack4配置基础

前言 为什么要使用构建工具&#xff1f; 1.转换ES6语法&#xff08;很多老版本的浏览器不支持新语法&#xff09; 2.转换JSX 3.CSS前缀补全/预处理器 4.压缩混淆&#xff08;将代码逻辑尽可能地隐藏起来&#xff09; 5.图片压缩 6. .... 为什么选择webpack&#xff1f; 社区…

RESTful API概述

什么是REST REST与技术无关&#xff0c;代表的是一种软件架构风格&#xff0c;REST是Representational State Transfer的简称&#xff0c;中文翻译为“表征状态转移”。这里说的表征性&#xff0c;就是指资源&#xff0c;通常我们称为资源状态转移。 什么是资源&#xff1f; 网…

AI 《A PROPOSAL FOR THE DARTMOUTH SUMMER RESEARCH PROJECT ON ARTIFICIAL INTELLIGENCE》读后总结

本文转载&#xff1a; http://www.cnblogs.com/SnakeHunt2012/archive/2013/02/18/2916242.html 《A Proposal for the Dartmouth Summer Research Project on Artificial Intelligence》&#xff0c;这是AI领域的开山之作&#xff0c;是当年达特茅斯会议上各路大牛们为期两个月…

第94:受限玻尔兹曼机

转载于:https://www.cnblogs.com/invisible2/p/11565179.html

安装完Ubuntu桌面后要做的(待续)

1. 为了快速而顺畅的更新&#xff0c;打开终端并输入以下命令来让系统使用新软件库&#xff1a; $ sudo apt-get update 2. 更改系统外观和行为 如果你想要更改桌面背景或图标大小&#xff0c;依次打开System Settings –> Appearance –> Look&#xff0c;并对桌面进…

算法第二章上机实践报告

一、实践题目 改写二分搜索算法 二、问题描述 这道题目主要是考验同学们在熟练掌握二分搜索法的前提下&#xff0c;对二分搜索的结构和运用有一个更加深刻的掌握。首先是要了解二分搜索的结构&#xff0c;其次&#xff0c;要了解二分搜索中的分治方法每一个步骤的用意&#xff…