首页 > web前端 > js教程 > 初级:React 中的生命周期方法和 Hook

初级:React 中的生命周期方法和 Hook

WBOY
发布: 2024-07-17 22:46:40
原创
854 人浏览过

Junior level: Lifecycle Methods and Hooks in React

React Hooks 彻底改变了我们在 React 中编写功能组件的方式,使我们无需编写类即可使用状态和其他 React 功能。本指南将向您介绍基本挂钩、自定义挂钩和高级挂钩模式,以管理复杂状态并优化性能。

React Hook 简介

React Hooks 是让您从功能组件“挂钩”React 状态和生命周期功能的函数。 Hooks 是在 React 16.8 中引入的,它们提供了一种更直接的方式在功能组件中使用状态和其他 React 功能。

Hooks 的主要优点

  1. 更简单的代码: Hooks 允许您直接在功能组件中使用状态和生命周期方法,从而使代码更简单、更易读。
  2. 重用逻辑:自定义挂钩使您能够跨多个组件提取和重用有状态逻辑。
  3. 增强的功能组件: Hooks 提供了类组件的所有功能,例如管理状态和副作用,而无需使用类。

必备挂钩

使用状态

useState 是一个钩子,允许您向功能组件添加状态。

示例:

import React, { useState } from 'react';

const Counter = () => {
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>Click me</button>
    </div>
  );
};

export default Counter;
登录后复制

在此示例中,useState 将 count 状态变量初始化为 0。setCount 函数在单击按钮时更新状态。

使用效果

useEffect 是一个钩子,可让您在功能组件中执行副作用,例如获取数据、直接与 DOM 交互以及设置订阅。它结合了类组件中多个生命周期方法的功能(componentDidMount、componentDidUpdate 和 componentWillUnmount)。

示例:

import React, { useState, useEffect } from 'react';

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

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

  return (
    <div>
      {data ? <pre class="brush:php;toolbar:false">{JSON.stringify(data, null, 2)}
: 'Loading...'}
); }; export default DataFetcher;
登录后复制

在此示例中,useEffect 在组件挂载时从 API 获取数据。

使用上下文

useContext 是一个钩子,可让您访问给定上下文的上下文值。

示例:

import React, { useContext } from 'react';

const ThemeContext = React.createContext('light');

const ThemedComponent = () => {
  const theme = useContext(ThemeContext);

  return <div>The current theme is {theme}</div>;
};

export default ThemedComponent;
登录后复制

在此示例中,useContext 访问 ThemeContext 的当前值。

使用Reducer

useReducer 是一个钩子,可让您管理功能组件中的复杂状态逻辑。它是 useState 的替代方案。

示例:

import React, { useReducer } from 'react';

const initialState = { count: 0 };

const reducer = (state, action) => {
  switch (action.type) {
    case 'increment':
      return { count: state.count + 1 };
    case 'decrement':
      return { count: state.count - 1 };
    default:
      return state;
  }
};

const Counter = () => {
  const [state, dispatch] = useReducer(reducer, initialState);

  return (
    <div>
      <p>Count: {state.count}</p>
      <button onClick={() => dispatch({ type: 'increment' })}>Increment</button>
      <button onClick={() => dispatch({ type: 'decrement' })}>Decrement</button>
    </div>
  );
};

export default Counter;
登录后复制
登录后复制

在这个例子中,useReducer 使用一个reducer 函数来管理计数状态。

定制挂钩

自定义挂钩让您可以跨多个组件重用有状态逻辑。自定义钩子是使用内置钩子的函数。

示例:

import { useState, useEffect } from 'react';

const useFetch = (url) => {
  const [data, setData] = useState(null);

  useEffect(() => {
    fetch(url)
      .then(response => response.json())
      .then(data => setData(data));
  }, [url]);

  return data;
};

const DataFetcher = ({ url }) => {
  const data = useFetch(url);

  return (
    <div>
      {data ? <pre class="brush:php;toolbar:false">{JSON.stringify(data, null, 2)}
: 'Loading...'}
); }; export default DataFetcher;
登录后复制

在此示例中,useFetch 是一个自定义挂钩,用于从给定 URL 获取数据。

高级钩子模式

使用 useReducer 管理复杂状态

当处理涉及多个子值的复杂状态逻辑或当下一个状态依赖于前一个状态时,useReducer 可能比 useState 更合适。

示例:

import React, { useReducer } from 'react';

const initialState = { count: 0 };

const reducer = (state, action) => {
  switch (action.type) {
    case 'increment':
      return { count: state.count + 1 };
    case 'decrement':
      return { count: state.count - 1 };
    default:
      return state;
  }
};

const Counter = () => {
  const [state, dispatch] = useReducer(reducer, initialState);

  return (
    <div>
      <p>Count: {state.count}</p>
      <button onClick={() => dispatch({ type: 'increment' })}>Increment</button>
      <button onClick={() => dispatch({ type: 'decrement' })}>Decrement</button>
    </div>
  );
};

export default Counter;
登录后复制
登录后复制

在这个例子中,useReducer 使用一个reducer 函数来管理计数状态。

使用 useMemo 和 useCallback 优化性能

使用备忘录

useMemo 是一个钩子,用于记忆计算值,仅当依赖项之一发生更改时才重新计算它。它通过防止每次渲染时进行昂贵的计算来帮助优化性能。

示例:

import React, { useState, useMemo } from 'react';

const ExpensiveCalculation = ({ number }) => {
  const computeFactorial = (n) => {
    console.log('Computing factorial...');
    return n <= 1 ? 1 : n * computeFactorial(n - 1);
  };

  const factorial = useMemo(() => computeFactorial(number), [number]);

  return <div>Factorial of {number} is {factorial}</div>;
};

const App = () => {
  const [number, setNumber] = useState(5);

  return (
    <div>
      <input
        type="number"
        value={number}
        onChange={(e) => setNumber(parseInt(e.target.value, 10))}
      />
      <ExpensiveCalculation number={number} />
    </div>
  );
};

export default App;
登录后复制

在此示例中,useMemo 确保仅在数字发生变化时才重新计算阶乘计算。

使用回调

useCallback 是一个用于记忆函数的钩子,防止在每次渲染时重新创建该函数,除非其依赖项之一发生更改。它对于将稳定的函数传递给依赖引用相等的子组件很有用。

示例:

import React, { useState, useCallback } from 'react';

const Button = React.memo(({ onClick, children }) => {
  console.log(`Rendering button - ${children}`);
  return <button onClick={onClick}>{children}</button>;
});

const App = () => {
  const [count, setCount] = useState(0);

  const increment = useCallback(() => setCount((c) => c + 1), []);

  return (
    <div>
      <Button onClick={increment}>Increment</Button>
      <p>Count: {count}</p>
    </div>
  );
};

export default App;
登录后复制

在此示例中,useCallback 确保仅在其依赖项更改时重新创建增量函数,从而防止 Button 组件不必要的重新渲染。

结论

理解和利用 React Hooks 对于现代 React 开发至关重要。 Hooks 使您能够在功能组件中编写更清晰、更易于维护的代码。通过掌握 useState、useEffect、useContext 和 useReducer 等基本钩子,以及自定义钩子和 useMemo 和 useCallback 性能优化等高级模式,您可以构建健壮且高效的 React 应用程序。作为一名初级开发人员,熟悉这些概念将显着增强您开发和维护高质量 React 应用程序的能力。

以上是初级:React 中的生命周期方法和 Hook的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
上一篇:带有 @let 的 Angular 模板局部变量 下一篇:如何使用 Web 音频 API 防止语音转录中的说话者反馈
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
最新问题
相关专题
更多>
热门推荐
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板