react中Hooks

React Hook/Hooks是什么?

1 Hook是react 16.8版本增加的新特性/新语法
2 因为函数式组件没有this,使用hooks可以让函数式组件使用 state 以及其他的react 特性(比如生命周期钩子)

常见的Hook

(1) state Hook:React.useState()
(2) Effect Hook: React.useEffect()
(3) Ref Hook: React.useRef()
(4) Context Hook: React.useContext()

1. state Hook

  1. 让函数组件也可以有state状态,并进行状态数据的读写操作
  2. 语法:const [ xxx, setxxx] = React.useState(inintValue)
  3. useState()说明:
    参数:第一次初始化指定的值在内部作缓存,也就是虽然函数组件调用多次,初始值initValue只传一次,之后将解构出的状态作缓存
    返回值:包含2个元素的数组。第一个为内部当前状态,第二个为更新状态值的函数
  4. setxxx() 两种写法
    (1)setxxx(newValue):参数为非函数值,直接指定新的状态值,内部用其覆盖原来的状态值
    (2)setxxx(value => newValue) :参数为函数,接收原本的状态值,内部用其覆盖原来的状态值

案例:

function Demo() {
    // 调用useState() 当有多个状态时需要写多次useState
    const [count, setCount] = React.useState(0)
    const [username, setName] = React.useState('张三')
    // 点击事件回调
    function add() {
        setState(count => count+1)
    }
    function changeName() {
        setState('李四')
    }
    return (
        <div>
            <h1>当前和为:{count}</h1>
            <h1>当前用户为:{userName}</h1>
            <button onclick={add}>点击+1</button>
            <button onclick={changeName}>切换用户</button>
        </div>
    )
}

2. Effect Hook

  1. Effect Hook 可以让函数组件中执行副作用操作(类似类组件生命周期)
  2. react中副作用操作;
    发ajax请求获取数据
    设置订阅、启动定时器
    手动更改真实DOM
  3. 语法:
  React.useEffect(()=>{
     // 在此可以写附带作用操作
      let timer = setTimeout(() => {
          setCount(count => count+1)
      }, 1000)
      return() =>{ // 组件将要卸载前执行
          // 此处做一些收尾工作,如清除定时器、取消订阅等
          clearInterval(timer)
      }
  },[])

(1)useEffect()传 两个参数 第一个参数为函数 若函数中返回函数 这个返回的函数相当于执行componentWillUnmount(){}钩子,没有返回则不执行componentWillUnmount(){}钩子
(2) 当第二个参数不传,则相当于监听所有状态 相当于执行生命周期 componentDidMount(){}钩子和componentDidUpdate(){}钩子
(3)当第二个参数传[],则相当于什么也不监听 此时第一个参数相当于执行生命周期 componentDidMount(){}狗子
(4)当第二个参数传[XXX],则相当只监听XXX状态 只要XXX状态改变此时第一个参数相当于执行生命周期 componentDidMount(){}钩子和componentDidUpdate(){}钩子 ,若其余状态改变 不用执行componentDidUpdate(){}钩子

案例
案例场景:当页面一加载和每秒自增,点击卸载按钮卸载组件清空定时器

function Demo() {
    const [count, setCount] = React.useState(0)
    React.useEffect(()=>{
        // 在此可以写附带作用操作
        let timer = setTimeout(() => {
            setCount(count => count+1)
        }, 1000)
        return() =>{ // 组件将要卸载前执行
            // 此处做一些收尾工作,如清除定时器、取消订阅等
            clearInterval(timer)
        }
    },[])
    // 卸载组件回调
    function unmount() {
        // ReactDom.unmountComponentAtNode() 此方法为模拟卸载组件场景,用之前须引入 impont ReactDom from 'react-dom'
        ReactDom.unmountComponentAtNode(document.getElementById('root'))
    }
    return (
        <div>
            <h1>当前和为:{count}</h1>
            <button onclick={unmount}>卸载组件</button>
        </div>
    )
}

3. Ref Hook

  1. Ref Hook可以在函数组件中存储/查找组件内的标签或任意其他数据
  2. 语法:const myRef = React.useRef()
  3. 作用:保存标签对象,功能与类组件中React.createRef()一样

案例

function Demo() {
    const myRef = React.useRef()
    // 提示按钮回调
    function add() {
      alert(myRef.current.value)
    }
    return (
        <div>
            <input type="text" ref={myRef} />
            <button onclick={showValue}>提示输入框内容</button>
        </div>
    )
}

4. Context Hook

useContext()是用来处理多层级传递数据的方式。其主要用于解决函数组件之间传值的问题
步骤:
1. 首先要进行导入createContext,useContext
2. 在子组件中使用useContext进行接收父组件传递的上下文
3. 创建一个上下文全局变量
4. 在父组件将值传递过去,Provider 相当于提供者

案例

// 首先要进行导入createContext,useContext
import React,{useState,createContext,useContext} from 'react'
function Child(){
//在子组件中使用useContext进行接收父组件传递的上下文,这样值就能传递过来了
    const count1=useContext(CountContext)
    return (
        <h1>{count1}</h1>
    )
}
// 创建一个上下文全局变量
const CountContext=createContext()
function Example3(){
    const [count,setCount]=useState(0)

    function handleClick(){
        setCount(count+1)
    }
   
    return (
        <div>
            点击{count}
            <button onClick={handleClick}>clickme</button>
            // 其次是作为父组件将值传递过去,Provider 相当于提供者,Child是子组件
            <CountContext.Provider value={count}>
                <Child></Child>
            </CountContext.Provider>
        </div>
    )
}
export default Example3

还有更多hook 有待后期补充

React中的Hooks是一种特殊的函数,它们允许我们在函数组件中使用状态和其他React特性,而不需要使用类组件。使用Hooks可以使得代码更简洁、易读,并且更方便进行状态管理和副作用的处理。 React提供了一些常用的Hooks,其中最常见的是useStateuseEffect。 1. useStateuseState允许我们在函数组件中声明和使用状态。它接受一个初始值作为参数,并返回一个包含当前状态和更新状态的数组。我们可以通过解构赋值来获取状态和更新状态的函数。例如: ``` const [count, setCount] = useState(0); ``` 这段代码声明了一个名为count的状态变量,并将初始值设置为0。setCount是一个函数,用于更新count的值。 2. useEffectuseEffect用于在组件渲染完成后执行一些副作用操作,比如发送网络请求、订阅事件等。它接受两个参数:一个副作用函数和一个依赖数组。副作用函数会在组件渲染完成后执行,而依赖数组用于指定何时重新执行副作用函数。 ``` useEffect(() => { // 执行副作用操作 // 返回一个清理函数(可选) }, [依赖数组]); ``` 依赖数组中的值发生变化时,副作用函数会被重新执行。如果依赖数组为空,则副作用函数只会在组件首次渲染后执行一次。 除了useStateuseEffectReact还提供了其他一些常用的Hooks,如useContext、useReducer、useCallback等,用于处理不同的需求。使用Hooks可以使我们更好地组织和管理组件的逻辑,使代码更易维护和复用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值