React.FC是函数式组件,是在TypeScript使用的一个泛型,FC就是FunctionComponent的缩写,事实上React.FC可以写成React.FunctionComponent:
使用了React.FC就是函数式组件,语法一致
3. enum 枚举
当引入antd的组件并且组件定义了已有的属性值时,比如Button的size,就需要枚举,因为size定义了已知的常量。
enum size {
large = "large",
small = "small"
}
// 使用
<Button size={props: size}>Button>
//必传x,y并且类型都为number,返回值为布尔
function fun1(x:number,y:number):boolean{
return x>y
}
fun1(1,3)
//不返回值,类型为void
function fun1(x:number,y:number):void{
console.log(x,y)
}
//x必传,y为可传可不传 默认值为1; 返回值为数组类型,数组的每个值为number
function fun1(x:number,y:number=1):number[]{
return [x,y]
}
fun1(2)
可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据。 这样用户就可以以自己的数据类型来使用组件。
function fun1<T, W>(x: T,y:W): W {
return y
}
fun1<string, boolean>('1',false)
interface Len{
length: number
}
//T继承接口Len,代表实参必须有length这个属性才可以
funtion fun<T extends Len>(args:T):T{
return args.length
}
fun("abc") // 3 字符串是有length属性的
fun({})//报错,因为对象本身没有length属性
fun({length:5}) //不报错
fun(4)//报错,number数据没有length属性
fun(null)//报错
type AppProps = {
message: string
}
const App: React.FC<AppProps> = ({ message, children }) => (
<div>
{message}
{children}
div>
)
type User = {
name: string
age: number
}
const [user, setUser] = React.useState<User | null>(null)
const ref1 = React.useRef<HTMLInputElement>(null)
const ref2 = React.useRef<HTMLInputElement | null>(null)
有几种引用方式:HTMLDivElement, HTMLInputElement, HTMLButtonElement
两种方式区别:
第一种方式的 ref1.current 只读的,并且可以传递给内置的 ref 属性,绑定 DOM 元素 ;
第二种方式的 ref2.current 是可变的(类似于声明类的成员变量)
const App: React.FC = () => {
const [state, setState] = React.useState('')
const onChange: React.ChangeEventHandler<HTMLInputElement> = e => {
setState(e.currentTarget.value)
}
return (
<div>
<input type="text" value={state} onChange={onChange} />
div>
)
}