在当前目录下创建一个react+ts的项目

npx create-react-app . --typescript


.ts .tsx

.tsx是指支持标签的TS


@import-normalize;

@import-normalize是React自己发明的语法,它能自动添加一些全局css样式


为了使import引入JS时更加方便(实现Vue中@符号的效果),需要在tsconfig.json中添加:

"baseUrl": "src",


因为使用了TS,所有在安装依赖的时候,还必须安装依赖的TS声明文件,比如Router:

  npm install --save react-router-dom
  npm install @types/react-router-dom

CSS-in-JS

React项目中解决css的热门方案: styled-components


svg更强大的用法:SVG symbols

需要借助两个库:svg-sprite-loader 和 svgo-loader


插槽

React中插槽可以由this.props.children实现


利用NavLink的activeClassName属性,可以为设置选中的a标签(NavLink标签)添加样式

<NavLink to="/" activeClassName="selected" ></NavLink>


React函数组件在的TS类型是:React.FC

const App: React.FC = (props) => {
  return ()
}

React函数组件中使用state:useState

用<>定义类型参数:
const [tags, setTags] = useState<String[]>(['衣', '食', '住', '行'])
还可以用TS的联合字符串缩小范围:
const [tags, setTags] = useState<('衣' | '食' | '住' | '行')[]>(['衣', '食', '住', '行'])

受控组件与非受控组件(类似于Vue中的v-model.lazy)(useRef)

受控组件 非受控组件


React的onChange和原生onchange不同:

React中的anChange是值改变后触发,原生onchange是值改变后失去焦点或者按下回车时触发


TS 使用 typeof 和 keyof

手写 优化


TS中使用事件委托:

事件委托


使用TS后,props需要这样写才能接收到值:

props


TS中的Partial:只需要满足一部分类型就行

Partial


封装一个自定义Hook:在函数里面使用useState或者其他useXXX,并且return一些读写接口出去

封装一个自定义Hook


ReactRouter

import {
  HashRouter as Router,
  Switch,
  Route,
  // Link,
  Redirect
} from "react-router-dom";
const App: React.FC = () => {
  return (
    <Fragment>
      <Router>
        <div>
          <Switch>
            <Redirect exact from="/" to="/money" />
            <Route exact path="/tags" component={Tags} />
            <Route exact path="/money" component={Money} />
            <Route exact path="/statistics" component={Statistics} />
            <Route path="*" component={NoMatch} />
          </Switch>
        </div>
      </Router>
    </Fragment>
  )
}
export default App;

编程式路由:

this.props.history.push('/tags')
this.props.location
this.props.match

Hooks API:

import { useHistory } from "react-router-dom";
useHistory().goBack()

子组件中使用访问路由可以引入withRouter:

import { withRouter } from "react-router-dom";

useParams 获取动态参数

type Params {
  id: string
}
let { id } = useParams<Params>()

TS的&符号实践(props接收label和input元素所有属性)

TS的&符号


React语法:<input {...rest} />(将一个对象转变为元素的属性)

<input {...rest} />


useEffect 监听数据变化

useEffect( () => {
  // data改变时执行
}, [data])
useEffect( () => {
  // 当不写data的时候,就是第一次渲染的时候执行(相当于mounted生命周期函数)
}, [])