1001 字
5 分钟
07.Hooks
2025-03-28

useState#

useSate 是一个 React Hook(函数),它允许我们向组件添加一个状态变量,从而控制影响组件的渲染结果。

  1. useState 是一个函数,返回值是一个数组;

  2. 数组中的第一个参数是状态变量,第二个参数是 set 函数用来修改状态变量;

  3. useState 的参数将作为第一个参数的初始值。

import React, { useState } from 'react'

function App() {
  const [count, setCount] = useState(0)
  const handleClick = (num) => {
    setCount(count + num)
}
return (
  <div>
    <button onClick={() => handleClick(5)}>{count}</button>
  </div>
);
}

export default App;
import React, { useState } from 'react'

function App() {
  const [form, setForm] = useState({
    name: 'Sytus',
    age: 17,
  })
  const handleClick = (age) => {
    setForm({
      ...form,
      age,
    })
  }
  return (
    <div>
      <button onClick={() => handleClick(5)}>{form.age}</button>
    </div>
  );
}

export default App;

useContext#

使用 Context 的机制可以实现跨层级的组件通信。

// 创建 Context
import React, { createContext } from 'react';

const MyContext = createContext();

export default MyContext;
// 父组件
import React from 'react';
import MyContext from './MyContext';
import ChildComponent from './ChildComponent';

function ParentComponent() {
  const value = "Hello from parent";

  return (
    <MyContext.Provider value={value}>
      <ChildComponent />
    </MyContext.Provider>
  );
}

export default ParentComponent;
// 子组件 ChildComponent.js
import React, { useContext } from 'react';
import MyContext from './MyContext';

function ChildComponent() {
  const valueFromContext = useContext(MyContext);

  return (
    <p>Received value from parent: {valueFromContext}</p>
  );
}

export default ChildComponent;

在这个示例中,useContext 钩子接收一个 Context 对象(这里是 MyContext),并返回该 Context 的当前值。在子组件 ChildComponent 中使用 useContext 钩子获取了父组件传递的值,并直接使用这个值渲染了内容。

使用 useContext 可以更便捷地在函数组件中获取 Context 中的值,而无需使用 Context.Consumer

useEffect#

useEffect 是一个 React Hook 函数,用于在 React 组件中创建不是由事件引起而是由渲染本身引起的操作,比如发送 AJAX 请求,更改 DOM 等等。

import {useEffect} from 'react'
useEffect(() => { 
    // 副作用逻辑
    return () => {
        // 清除副作用逻辑
}
}, [])
  1. 参数1是一个副作用函数,在函数内部可以放置要执行的操作。最后返回的函数可以在组件卸载的时候清除造成的副作用(例“清除定时器”);

  2. 参数2是一个数组(可选参),在数组里放置依赖项,不同的依赖项会影响第一个参数的执行。

    1. 没有依赖项:组件初始渲染+组件更新时执行副作用函数;

    2. 空数组依赖项:只在初始渲染时执行一次;

    3. 添加特定依赖项:组件初始渲染+特性依赖项变化时执行。

import {useState, useEffect} from 'react'

...
const [count, setCount] = useState(0)
const useEffect((console.log('count改变了')), [count]) //只有count改变时执行

useRef#

它用于在函数组件中引用对象,并在重新呈现之间保留被引用对象的状态。

它可以在函数组件存储或查找组件内的标签或任意其他数据。

import {useRef} from 'react'
const refEle = useRef()
const handleClick = () => {
  console.log(refEle.current); // DOM元素 打印 <input type="text"/>
}
rerurn (
    <div>
        <input type="text" ref={myRef} />
        <button onClick={() => handleClick()}>Click</button>
    </div>
)

自定义Hook函数#

概念:自定义 Hook 是以 use 开头的函数,通过自定义 Hook 函数可以用来实现逻辑的复用和封装。

封装自定义 Hook 的通用思路:

  1. 生命一个 use 开头的函数;

  2. 在函数体内部封装可复用的逻辑;

  3. 把其他组件需要用到的状态或者回调函数 return 出去,以对象或者数组的形式;

  4. 在哪个组件中需要用到此逻辑,则去执行这个自定义函数,解构出状态和回调函数使用。

import React, { useState } from 'react'

function useToggle() {
  // 可复用的逻辑代码
  const [value, setValue] = useState(true)
  const toggle = () => {
    setValue(!value)
  }

  // 哪些状态和回调函数需要在其他组件中使用,将其return
  return {
    value,
    toggle
  }
}

export default function App() {
  const {value, toggle} = useToggle()

  return (
    <div>
      {value && (<div>This is value</div>)}
      <button onClick={() => toggle()}>toggle</button>
    </div>
  )
}

ReactHooks使用规则#

  1. 只能在组件或者其他自定义 Hook 函数中调用;

  2. 只能在组件的顶层调用,不能嵌套在 if、for、其他函数中。

07.Hooks
https://sytusramlethal.github.io/posts/07hooks/
作者
Sytus Ramlethal
发布于
2025-03-28
许可协议
CC BY-NC-SA 4.0