• 扩展-Hooks


     三个常用hook

    Hook 是 React 16.8.0 增加的新特性,让我们能在函数式组件中使用 state 和其他特性

    1. State Hook

    (1)State Hook 让函数式组件也可可以有 state 状态,并进行状态数据的读写

    (2)语法:const [xxx, setXxx] = React.useState(initValue)

    • initValue为状态初始化值,第一次初始化指定的值在内部做缓存
    • 返回值xxx, setXxx,包含 2 个元素的数组,分别为当前状态值和状态更新函数

    (3)setXxx() 的 2 种用法:

    • setXxx(newValue)参数为非函数值,直接指定新的状态值,内部用其覆盖原来的状态值
    • setXxx(value => newValue)参数为函数,接受原本的状态值,返回新的状态值,内部用其覆盖原来的状态值

    注意!若有多个状态,只能多次调用 React.useState ,不能使用对象!

    点我加1 案例:

    1. import { useState } from "react";
    2. export default function Demo(props) {
    3. const [count, setCount] = useState("0")
    4. function addOne {
    5. setCount(count + 1) #第一种写法
    6. # setCount(count=>count+1) #第二种写法
    7. }
    8. return (
    9. <div>
    10. <h2>求和为{count}</h2>
    11. <button onClick={addOne}>点我加1</button>
    12. </div>
    13. )
    14. }

    (1) 点击button ,会调用addOne函数,然后调用更新状态函数,然后Demo函数式组件重新执行渲染,这会导致const [count, setCount] = useState("0") 这句代码执行,每次点击button都会让执行此句代码。react底层做了处理,不会因为每次更新都执行这句代码导致重新初始化状态。而是保留上次的状态值。

    (2)()=>{} 箭头函数 如果单个参数,可以省略括号,如果就一行返回值代码,可以省略return。如果返回的是对象 需要写小括号({}),防止和代码段的{}混淆。

    2. Effect Hook

    • Effect Hook 让我们能在函数式组件中执行副作用操作(就是模拟生命周期钩子)
    • 副作用操作:发送 Ajax 请求、定时器、手动更改真实 DOM
    • Effect Hook 可以模拟三个钩子:componentDidMountcomponentDidUpdatecomponentWillUnmount
    • React.useEffect 第一个参数 return 的函数相当于 componentWillUnmount ,若有多个会按顺序执行
    1. // 语法
    2. React.useEffect(() => {
    3. ...
    4. return () => {
    5. // 组件卸载前执行,即 componentWillUnmount 钩子
    6. ...
    7. }
    8. }, [stateValue])
    9. // 模拟 componentDidMount
    10. // 第二个参数数组为空,表示不监听任何状态的更新
    11. // 因此只有页面首次渲染会执行输出
    12. React.useEffect(() => {
    13. console.log('DidMount')
    14. return () => {
    15. console.log('WillUnmount 1')
    16. }
    17. }, [])
    18. // 模拟全部状态 componentDidUpdate
    19. // 若第二个参数不写,表示监听所有状态的更新
    20. React.useEffect(() => {
    21. console.log('All DidUpdate')
    22. return () => {
    23. console.log('WillUnmount 2')
    24. }
    25. })
    26. // 模拟部分状态 componentDidUpdate
    27. // 第二个参数数组写上状态,表示只监听这些状态的更新
    28. React.useEffect(() => {
    29. console.log('Part DidUpdate')
    30. return () => {
    31. console.log('WillUnmount 3')
    32. }
    33. }, [count, name])
    34. // 若调用 ReactDOM.unmountComponentAtNode(document.getElementById('root'))
    35. // 会输出 WillUnmount 1、2、3

    3. Ref Hook

    • Ref Hook 可以在函数式组件存储或查找组件内的标签或其他数据
    • 语法:const refContainer = React.useRef()
    • 保存标签对象的容器,和 React.createRef() 类似,也是专人专用
    1. function Demo() {
    2. const myRef = React.useRef()
    3. function show() {
    4. console.log(myRef.current.value)
    5. }
    6. return (
    7. <div>
    8. <input type="text" ref={myRef} />
    9. <button onClick={show}>展示数据</button>
    10. </div>
    11. )
    12. }
  • 相关阅读:
    【JVM学习】Jconsole 配置jmx 监控JVM
    传统伪影去除方案
    JS防抖和节流在前端开发中的应用场景
    【路径规划】基于VFH算法实现机器人路径规划附matlab代码
    LeetCode 1106. 解析布尔表达式
    负载均衡与高可用
    想要成功申请公派访问学者,特别需要注意这两点 !
    iconfont通过font class引入显示小方块bug
    记录安装Cytoscape的过程
    窗口置顶工具v2.0.0
  • 原文地址:https://blog.csdn.net/qq_22310551/article/details/125460158