TS的基础知识可以看看我之前总结的 Typescript学习入门到精通(2023年超全)
基于Vite创建开发环境
useState与TypeScript
useState-自动推导
// react + ts
// 根据初始值自动推断
// 场景:明确的初始值
import { useState } from 'react'
function App() {
const [value, toggle] = useState(false)
const [list, setList] = useState([1, 2, 3])
const changeValue = () => {
toggle(true)
}
const changeList = () => {
setList([4])
}
return <>this is app {list}</>
}
export default App
useState-传递泛型参数
// react + ts
import { useState } from 'react'
type User = {
name: string
age: number
}
function App() {
// 1. 限制初始值的类型
// const [user, setUser] = useState<User>({
// name: 'jack',
// age: 18,
// })
// const [user, setUser] = useState<User>(() => {
// return {
// name: 'jack',
// age: 18,
// }
// })
const [user, setUser] = useState<User>({
name: 'jack',
age: 18,
})
const changeUser = () => {
setUser(() => ({
name: 'john',
age: 28,
}))
}
return <>this is app {user.name}</>
}
export default App
useState-初始值为null
// react + ts
import { useState } from 'react'
type User = {
name: string
age: number
}
function App() {
const [user, setUser] = useState<User | null>(null)
const changeUser = () => {
setUser(null)
setUser({
name: 'jack',
age: 18,
})
}
// 为了类型安全 可选链做类型守卫
// 只有user不为null(不为空值)的时候才进行点运算
return <>this is app {user?.age}</>
}
export default App
事件与TypeScript
Props与Typescript
// props + ts
// type Props = {
// className: string
// }
interface Props {
className: string
title?: string
}
function Button(props: Props) {
const { className } = props
return <button className={className}>click me </button>
}
function App() {
return (
<>
<Button className="test" title="this is title" />
</>
)
}
export default App
为children添加类型
// props + ts
type Props = {
className: string
children: React.ReactNode
}
function Button(props: Props) {
const { className, children } = props
return <button className={className}>{children} </button>
}
function App() {
return (
<>
<Button className="test">click me!</Button>
<Button className="test">
<span>this is span</span>
</Button>
</>
)
}
export default App
为事件prop添加类型
useRef与TypeScript
获取dom
引用稳定的存储器
// useRef + ts
import { useEffect, useRef } from 'react'
// 1. 获取dom
// 2. 稳定引用的存储器(定时器管理)
function App() {
const domRef = useRef<HTMLInputElement>(null)
const timerId = useRef<number | undefined>(undefined)
useEffect(() => {
// 可选链 前面不为空值(null / undefined)执行点运算
// 类型守卫 防止出现空值点运算错误
domRef.current?.focus()
timerId.current = setInterval(() => {
console.log('123')
}, 1000)
return () => clearInterval(timerId.current)
}, [])
return (
<>
<input ref={domRef} />
</>
)
}
export default App