- 动态类型语言(dynamically typed language)
- 静态类型语言(statically typed language)
- JavaScript that scales(官网)
- 静态类型风格的类型系统
- 从 es6 到 es10 甚至 esnext 的语法支持
- 兼容各种浏览器,各种系统,各种服务器,完全开源。
-
初始化项目
npx create-react-app my-project --typescript
version > npm 5.2
-
避免安装全局模块
-
调用项目内部安装的模块
有的情况安装了一个模块,执行该模块的命令,没有发现命令
需要执行
node_modules/.bin/mocha --version
(以mocha为例),来执行这个命令使用了 npx 就可以直接使用
npx mocha --version
来执行而 npm run 会将scripts 中的命令(node_modules/.bin)加入 path 中,执行完成之后再删除
import React from 'react';
interface IProps {
message: string;
}
const Hello: React.FunctionComponent<IProps> = (props) => {
console.log(props.children, '---测试')
return <div>{ props.message }</div>
}
export default Hello
React.FunctionComponent
为react官方提供的一个 interface,可以简称 React.FC
- react 16.8 带来的全新特性,即将替代 class 组件的写法
- react 中的组件
- class 类型的组件
- function 类型的组件,不能使用生命周期,不能使用 state
-
没有破坏性改动
- 完全可选
- 百分之百向后兼容
- 没有计划从 react 中移除 class
-
解决痛点
-
组件很难复用状态逻辑
相较于 HOC 和 render props ,前者会产生不必要的节点
-
复杂组件难以理解尤其是生命周期函数
-
react 组件一直是函数,使用 hook 完全拥抱函数,不用再管复杂的 this
-
- hook 是特殊的函数,可以让你钩入 react 的特性
- effect hook(副作用函数)
分为两类
-
无需清楚的 effect
-
比如说文档标题的跟新,在 didmount 和 didUpdate 中都需要修改
document.title = '新的'
-
-
需要清除的
- 比如说在初次渲染的时候 addEventListener 监听了一个事件,然后没有清除就会绑定的越来越多。
- useEffect 中依赖为空,则初次渲染和更新都会执行
- 依赖为 空数组,则第一次执行
- 依赖为某个具体的值,则第一个和更新执行
- 第一个参数return 的函数,不会立即执行,在函数卸载或者,更新的时候执行。
- 有依赖更新和卸载都执行,(任意一项发生变化)
- 无依赖,只有卸载执行
- 自定义的 hook 没有一般没有ui,不需要做 view 的操作,抽离出一些公共的逻辑,一般情况连 props 都不需要传入
- 自定义hook必须以 use 开头,比如
useMousePosition
-
高阶组件就是一个函数,接受一个组件作为参数,返回一个新的组件
-
思考
空节点
<> </>
typing 配置是干什么的
-
将组建逻辑提取到可复用的函数中
- 为了增加和组件命名的区别,自定义 hook 也是一个函数,需要使用 use 开头的函数
- 不通组件每次使用相同的 hook 不会共享同一个 state ,每次都是不同的
- useState 的数据每次渲染都是新的数据, 不会随着时间改变。比如说 onclick 绑定了一个常量,并不会随着 常量值在后期被设置而变化,会一直绑定的原来的值。每次渲染都是独立的。
- 因此得到结论,在任意一次渲染中,props 和 state 都是独立的。使用到他们的任何值也是独立的。
- 每次渲染数据都是独立的,怎样让每次的渲染产生联系呢
- 使用 useRef 更改数据不会每次都更新组件
const likeRef = useRef(0)
// 获取到,永远能获取到最新的数据
console.log(likeRef.current)
// 设置也是一样的
likeRef.current++
- 使用 useRef 能够获取真实的 DOM 节点
<input type="text" ref={inputEle}/>
// 不是用current来获取的
// 但是能用 current 来设置
inputEle.current.focus()
-
在 hook 中使用 context
// 公共部分,创建 context const ThemeContext = React.createContext('light') // 父组件 <ThemeContext.Provider value="dark"> <TestContext></TestContext> </ThemeContext.Provider> // 子组件 // 绑定context import { useContext } from 'react' const theme = useContext(ThemeContext) <div> test <div>{this.context}</div> </div>
- 只在最顶层使用 hook,不在循环体内,或者判断中使用、嵌套函数,为了 hook按顺序执行
- 只在 react 函数中调用 hook,或者自定义函数中,不能再 js 的函数中调用
- 所有的 hook 都需要写到函数组件里面,不能写到函数外边
- 代码结构
- 样式解决方案
- 组件需求分析和编码
- 组件测试用例分析和编码
- 代码打包输出和发布
采用less sass
- 系统色板 - 基础色板 + 中性色板
- 产品色板 - 品牌色 + 功能色板
-
React.FC 函数组件类型
-
MouseEvent
在接受鼠标事件的时候,传进的 e 的接口
-
HTMLInputElement
这种的很多