React Hooks 你知道哪些 ?

基础 Hooks

useState:状态管理

  • 作用:在函数组件中声明和更新局部状态。
  • 实战场景:表单输入、计数器、开关状态。

    import React, { useState } from 'react';
    
    function Counter() {
    const [count, setCount] = useState(0);
    
    return (
      <div>
        <p>{count}</p>
        <button onClick={() => setCount(count + 1)}>+1</button>
      </div>
    );
    }

    useEffect:副作用处理

  • 作用:处理副作用(如数据请求、DOM 操作、订阅)。
  • 实战场景:API 请求、事件监听、定时器。
import React, { useState, useEffect } from 'react';

function DataFetcher() {
  const [data, setData] = useState(null);

  useEffect(() => {
    fetch('https://api.example.com/data')
      .then(response => response.json())
      .then(data => setData(data));

    return () => {
      // 清理逻辑(如取消请求、移除监听)
    };
  }, []); // 空依赖数组表示只在挂载时执行

  return <div>{data ? data.title : 'Loading...'}</div>;
}

useContext:共享全局数据

  • 作用:跨组件树传递数据,避免逐层传递 props。
  • 实战场景:主题切换、用户登录状态。
import React, { createContext, useContext } from 'react';

const ThemeContext = createContext('light');

function App() {
  return (
    <ThemeContext.Provider value="dark">
      <Toolbar />
    </ThemeContext.Provider>
  );
}

function Toolbar() {
  const theme = useContext(ThemeContext);
  return <div style={{ background: theme === 'dark' ? '#333' : '#fff' }}>Theme</div>;
}

进阶 Hooks

useReducer:复杂状态逻辑

  • 作用:类似 Redux,通过 reducer 函数管理复杂状态。
  • 实战场景:表单多字段管理、购物车状态。

    import React, { useReducer } from 'react';
    
    const initialState = { count: 0 };
    
    function reducer(state, action) {
    switch (action.type) {
      case 'increment':
        return { count: state.count + 1 };
      case 'decrement':
        return { count: state.count - 1 };
      default:
        throw new Error();
    }
    }
    
    function Counter() {
    const [state, dispatch] = useReducer(reducer, initialState);
    
    return (
      <div>
        <p>{state.count}</p>
        <button onClick={() => dispatch({ type: 'increment' })}>+1</button>
      </div>
    );
    }

useCallback:缓存函数

  • 作用:缓存函数引用,避免子组件不必要的渲染。
  • 实战场景:性能优化,防止函数重复创建。
import React, { useCallback, useState } from 'react';

function Parent() {
  const [count, setCount] = useState(0);
  
  const handleClick = useCallback(() => {
    setCount(prev => prev + 1);
  }, []); // 依赖数组为空表示函数不变化

  return <Child onClick={handleClick} />;
}

const Child = React.memo(({ onClick }) => {
  return <button onClick={onClick}>Click me</button>;
});

useMemo:缓存计算结果

  • 作用:缓存复杂计算结果,避免重复计算。
  • 实战场景:计算密集型操作、过滤列表。
import React, { useMemo, useState } from 'react';

function List({ items }) {
  const [filter, setFilter] = useState('');

  const filteredItems = useMemo(() => {
    return items.filter(item => item.includes(filter));
  }, [items, filter]); // 依赖变化时重新计算

  return (
    <div>
      <input value={filter} onChange={(e) => setFilter(e.target.value)} />
      <ul>{filteredItems.map(item => <li key={item}>{item}</li>}</ul>
    </div>
  );
}

useRef:引用 DOM 或保存可变值

  • 作用:访问 DOM 元素或保存不触发渲染的变量。
  • 实战场景:输入框聚焦、保存定时器 ID。

    import React, { useRef, useEffect } from 'react';
    
    function InputFocus() {
    const inputRef = useRef(null);
    
    useEffect(() => {
      inputRef.current.focus(); // 组件挂载后自动聚焦
    }, []);
    
    return <input ref={inputRef} type="text" />;
    }

    其他实用 Hooks

useLayoutEffect:同步副作用

  • 作用:类似 useEffect,但会在 DOM 更新后同步执行。
  • 实战场景:测量 DOM 元素尺寸、同步渲染前操作。

    import React, { useLayoutEffect, useRef } from 'react';
    
    function MeasureElement() {
    const ref = useRef(null);
    
    useLayoutEffect(() => {
      const { width } = ref.current.getBoundingClientRect();
      console.log('Width:', width);
    }, []);
    
    return <div ref={ref}>Measure me</div>;
    }

    useImperativeHandle:暴露子组件方法

  • 作用:自定义通过 ref 暴露给父组件的方法。
  • 实战场景:表单验证、控制子组件行为。

    import React, { useRef, useImperativeHandle, forwardRef } from 'react';
    
    const Child = forwardRef((props, ref) => {
    const inputRef = useRef();
    
    useImperativeHandle(ref, () => ({
      focus: () => inputRef.current.focus(),
    }));
    
    return <input ref={inputRef} />;
    });
    
    function Parent() {
    const childRef = useRef();
    
    return (
      <div>
        <Child ref={childRef} />
        <button onClick={() => childRef.current.focus()}>Focus Child</button>
      </div>
    );
    }

    useDebugValue:调试自定义 Hook

  • 作用:在 React 开发者工具中显示自定义 Hook 的标签。
  • 实战场景:调试复杂自定义 Hook。
function useCustomHook() {
  const [value] = useState('Initial');
  useDebugValue(value); // 在开发者工具中显示值
  return value;
}

Hooks 组合实战

场景:全局状态管理(useContext + useReducer)

// 创建全局状态上下文
const AppContext = createContext();

function App() {
  const [state, dispatch] = useReducer(reducer, initialState);

  return (
    <AppContext.Provider value={{ state, dispatch }}>
      <ChildComponent />
    </AppContext.Provider>
  );
}

function ChildComponent() {
  const { state, dispatch } = useContext(AppContext);
  return <div>{state.count}</div>;
}

场景:防抖搜索(useState + useEffect + useCallback)

function Search() {
  const [query, setQuery] = useState('');
  const [results, setResults] = useState([]);

  const debouncedSearch = useCallback(
    _.debounce((searchText) => {
      fetchResults(searchText).then(setResults);
    }, 500),
    []
  );

  useEffect(() => {
    if (query) debouncedSearch(query);
  }, [query]);

  return (
    <div>
      <input value={query} onChange={(e) => setQuery(e.target.value)} />
      <ul>{results.map(result => <li key={result.id}>{result.name}</li>}</ul>
    </div>
  );
}

Hooks 使用规则

  • 只在顶层调用:不要在循环、条件或嵌套函数中使用 Hooks。
  • 仅在函数组件或自定义 Hook 中使用:不可在普通 JavaScript 函数中使用。

行业拓展

分享一个面向研发人群使用的前后端分离的低代码软件——JNPF

基于 Java Boot/.Net Core双引擎,它适配国产化,支持主流数据库和操作系统,提供五十几种高频预制组件,内置了常用的后台管理系统使用场景和实用模版,通过简单的拖拉拽操作,开发者能够高效完成软件开发,提高开发效率,减少代码编写工作。

JNPF基于SpringBoot+Vue.js,提供了一个适合所有水平用户的低代码学习平台,无论是有经验的开发者还是编程新手,都可以在这里找到适合自己的学习路径。

此外,JNPF支持全源码交付,完全支持根据公司、项目需求、业务需求进行二次改造开发或内网部署,具备多角色门户、登录认证、组织管理、角色授权、表单设计、流程设计、页面配置、报表设计、门户配置、代码生成工具等开箱即用的在线服务。

### React Hooks 的概念 React HooksReact 16.8 版本引入的一项特性,它允许开发者在函数组件中使用状态(state)和生命周期功能,而不再局限于类组件。这一特性通过一组内置的函数(如 `useState`、`useEffect` 等)来实现,使得函数组件具备与类组件相同的功能[^2]。 ### React Hooks 的作用 React Hooks 的主要作用是简化组件逻辑,提升代码的可复用性和可维护性。具体包括以下几个方面: - **状态管理**:通过 `useState` Hook,函数组件可以拥有自己的状态,而无需依赖类组件的 `this.state`。 - **副作用处理**:`useEffect` Hook 提供了统一的机制来处理诸如数据获取、订阅或手动 DOM 操作等副作用。 - **生命周期方法替代**:在类组件中,生命周期方法(如 `componentDidMount`、`componentDidUpdate`)分散在不同位置,而 `useEffect` 可以将相关逻辑集中在一起[^1]。 - **逻辑复用**:开发者可以通过自定义 Hook 将组件间共享的逻辑提取出来,避免重复代码。 ### React Hooks 的使用场景 React Hooks 的设计使其适用于多种开发场景,以下是一些常见的使用情况: - **状态管理**:当组件需要维护自己的状态时,可以使用 `useState` 或 `useReducer`。例如,表单输入的状态管理、UI 交互的状态控制等[^1]。 - **副作用处理**:`useEffect` 常用于处理数据请求、事件监听、DOM 操作等副作用。例如,在组件加载时从 API 获取数据,或者在状态变化时更新页面标题[^2]。 - **性能优化**:`useMemo` 和 `useCallback` 可用于优化组件性能,避免不必要的计算和渲染。 - **自定义逻辑复用**:通过创建自定义 Hook,可以将常见的逻辑(如表单验证、数据格式化)在多个组件之间共享,而无需使用高阶组件或渲染属性模式[^1]。 ### 示例代码 以下是一个使用 `useState` 和 `useEffect` 的简单示例: ```javascript import React, { useState, useEffect } from 'react'; function ExampleComponent() { const [count, setCount] = useState(0); useEffect(() => { document.title = `You clicked ${count} times`; }, [count]); return ( <div> <p>You clicked {count} times</p> <button onClick={() => setCount(count + 1)}>Click me</button> </div> ); } ``` 在这个示例中,`useState` 用于管理 `count` 状态,而 `useEffect` 用于在状态变化时更新页面标题。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值