hooks

解决了三个问题:

  • 维护state状态:React.useState(当前状态名,更新状态的函数名)
  • 模拟类式组件中的生命周期:React.useEffect(() => {}, [])
  • 保存标签对象React.useRef()
import React, { Component } from 'react'
import reactDom from 'react-dom'

// 类式组件
// export default class index extends Component {
//     state = {
//         count: 0
//     }
//     myRef = React.createRef()
//     add = () => {
//         // 函数式的setState
//         this.setState(state => {
//             return {count: state.count + 1}
//         })
//     }
//     show = () => {
//         console.log(this.myRef.current.value)
//     }
//     componentDidMount() {
//         this.timer = setInterval(() => {
//             this.setState(state => ({count: state.count + 1}))
//         }, 1000)
//     }
//     unmount = () => {
//         reactDom.unmountComponentAtNode(document.getElementById('root'))
//     }
//     componentWillUnmount() {
//         clearInterval(this.timer)
//     }
//     render() {
//         return (
//             <div>
//                 <input type="text" ref={this.myRef}/>
//                 <h1>当前求和为: {this.state.count}</h1>
//                 <button onClick={this.add}>点我—+1</button>
//                 <button onClick={this.unmount}>卸载组件</button>
//                 <button onClick={this.show}>点击提示数据</button>
//             </div>
//         )
//     }
// }
// 函数式组件
// 调用1+n次
function Demo() {
    // 1. useState(当前状态值,更新状态的函数)
    // 底层处理了,不会再次调用重置为0
    const [count, setCount] = React.useState(0)
    const [name, setName] = React.useState('tom')

    // 2. useEffect() (用于模拟类式组件中的生命周期): 
    // 不写第二个参数时,相当于检测所有人,有改变就调用。若第二个为空,则只调用一次
    React.useEffect(() => {
        console.log('@@@')
        let timer = setInterval(() => {
            setCount(count => count + 1)
        }, 1000)
        // 返回的这个函数相当于componentWillUpdate
        return () => {
            clearInterval(timer)
        }
    }, [])

    // 3. useRef():保存标签对象,与createRef()一样
    const myRef = React.useRef()

    function add() {
        // 第一种方式:
        // setCount(count + 1)
        // 第二种方式
        setCount(count => count + 1)
    }
    function changeName() {
        setName('jack')
    }
    function unmount() {
        reactDom.unmountComponentAtNode(document.getElementById('root'))
    }
    function show() {
        console.log(myRef.current.value)
    }
    return (
        <div>
            <input type="text" ref={myRef}/>
            <h1>当前求和为: {count}</h1>
            <div>我的名字是:{name}</div>
            <button onClick={add}>点我—+1</button>
            <button onClick={changeName}>点我改名</button>
            <button onClick={unmount}>卸载组件</button>
            <button onClick={show}>点击提示数据</button>
        </div>
    )
}

export default Demo

results matching ""

    No results matching ""