创建函数组件的写法如下:

  1. const Hello = (props) => {
  2. return <div>{props.message}</div>
  3. }
  4. //or
  5. const Hello = props => <div>{props.message}</div>
  6. //or
  7. function Hello(props){
  8. return <div>{props.message}</div>
  9. }

而class组件的写法如下:

  1. class B extends React.Component{
  2. constructor(props){
  3. super(props)
  4. this.state = {name: 'jeff'}
  5. }
  6. render(){
  7. return {
  8. <div>hi</div>
  9. }
  10. }
  11. }
  12. export default B;

这两种创建方法相比,class略显复杂,而且,如果要写state,那么class组件的第1~3行是必须写的。提前说明,推荐以后用函数组件写代码。

为什么要用函数组件写代码?

首先比较下,class组件有stateprops、生命周期这些东西,那么函数组件有吗?没有,但可以模拟!

模拟生命周期

React的生命周期主要为:

  • constructor() —— 初始化props
  • shoudComponentUpdate() —— 控制是否UI更新
  • render() —— 返回需要返回的东西
  • componentDidMount() —— DOM已经挂载好的时机,推荐操作DOM元素以及AJAX请求。首次渲染会执行该钩子。
  • componentDidUpdate() —— 也可请求AJAX首次渲染不会执行该钩子。
  • componentWillUnmount() —— 即将要死亡。

那么函数组件如何模拟以上的生命周期?这里使用useEffect

模拟 componentDidMount

  1. useEffect(()=>{
  2. console.log('第一次渲染')
  3. }, [])

注意useEffect第2个参数是数组!

模拟 componentDidUpdate

  1. useEffect(()=>{
  2. console.log('任意属性变更')
  3. })
  4. //or
  5. useEffect(()=>{
  6. console.log('n变了')
  7. }, [n])

模拟 componentWillUnmount

  1. useEffect(()=>{
  2. console.log('第一次渲染')
  3. return () => {
  4. console.log('组件要死了')
  5. }
  6. })

其他生命周期

  • constructor:在函数组件执行的时候,就相当于constructor
  • shouldComponentUpdate:可使用React.memouseMemo可以解决。
  • render:函数组件的返回值就是render的返回值。

useState

这是 Hooks API 的其中一个API,解决函数组件没有 state的问题。用法如下:

  1. import {useState} from 'react'
  2. const App = props = {
  3. const [n, setN] = useState(0) //使用该API
  4. const onClick = () => {
  5. setN(n + 1)
  6. }
  7. return (
  8. <div>
  9. {n}
  10. <button onClick={onClick}> +1 </button>
  11. </div>
  12. )
  13. }