用react的脚手架启动一个ts项目,会有一个tsconfig.json文件,这个是typescript的编译配置。
noImplicitAny,显示报错any,设为false后,当你的代码参数没有赋予类型时,也不会报any的错
target
lib
全部放上去吧
原react的js项目改成ts项目
只需安装几个库
typescript @type/node @type/react @type/react-dom @type/jest
安装后直接jsx改成tsx也能运行。
setState()是同步还是异步的,
有经验的小伙伴会知道setState()后面的代码中的state不是最新的。
但我们可以通过this.setState({},()=>{})通过setState的回调函数,第二个参数,可以拿到最新的state。
那么setState到底是同步还是异步的。
准确的说是 异步更新,同步执行
setState本身不是异步的,但是对state的处理机制让人感觉他是异步的。state处理y一般发生在生命周期变化的时候。
比如我们点击一个事件,调用两次同样的setState,但是他只会更新一个。比如加一操作。为什么呢,因为第二次this.setState时,拿到的this.state还是没有更新过的。所以就会造成两个是一样的。解决办法:
setState就提供了解决办法。
比如第一个参数不仅可以传入一个对象,也可以传入一个函数。(preState, preProps)=》{return {}}
这样就可以通过proState拿到最新的state的值。
react 17的变化
useState
这是useState的源码。可以看到useState可以传入一个初始值,值得类型为泛型S,或者传入一个函数返回S。然后对应的就是返回就是【S,】第二个是一个Dispatch一个action,接受一个值类型为S。学过redux的应该知道,dispatch aciton是为了改变state的状态。并且内部做了处理可以当state值改变时更新组件。
副作用
函数副作用。我们吃药的副作用可能是头晕,肚子疼。
而函数的副作用可能是如Date.now()http请求。带来的不确定性。
而纯函数又是指 如果接受同样的参数,返回的结果永远是一样的。
而react组件应该尽量为纯函数,比如传入相同的props,渲染的UI应该永远一样。
而副作用与纯函数相反,指一个函数处理了与返回值无关的事情。
高中的舒数学,二元一次,三元一次,如y=x2,一个x值对应一个y,这就是纯函数
而圆这些不是,一个x可能有多个y对应。
副作用是怎么产生的呢
如componentDidMount发送网络请求,不同的时间点发送的请求返回的数据可能不同。
副作用也不一定是坏事,像ajax,修改Dom等等都是借助副作用才能实现。
useEffect
第二个参数不穿的话,每次更新都会调用,传入空数组,对应componentDidMount,componentWillUnmount。传入有数据的数组,会根据依赖的值改不改变来确定是否调用副作用函数。
useEffect在ts中,使用async await
可以这样操作,比如发送网络请求。
如何处理loading。比如数据请求的时候,还没返回。
错误处理
俘获后可以通过判断error有没有值去显示提示信息。
HOC
高阶组件。
const hoc = higherOrde(component),传入一个组件,返回一个改造过的组件。相当于对组件做外面一层的处理
如redux的connet函数,就是一个典型的高阶组件。
它的功能,如俘获生命周期,条件渲染,抽取重复代码。
使用的时候比如我们导出一个组件名A,直接引入HOCMY,然后导出HOCMY(A),就是高阶组建了。
自定义hooks usexxx与高阶组件withxxx
推荐hooks代替高阶组件