探索额外的反应挂钩:示例和使用情况
#javascript #react #reactnative #hooks

介绍£O:

React是一个广泛使用的JavaScript库,用于构建交互式用户界面。自从React 16.8引入钩子以来,开发人员以一种更简单,更有效的方式享受了在功能组件之间共享羊毛的方法。

Alês的书籍,例如 usestate useffect uscontext ,React还提供了提供额外功能的其他挂钩。

在本文中,我们将探索这些其他钩子,我们将讨论您的用例并提供实际示例。

UserDucer:

挂钩用户ducer 在处理涉及道德交易的更复杂状态时,是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>
      Count: {state.count}
      <button onClick={() => dispatch({ type: 'increment' })}>+</button>
      <button onClick={() => dispatch({ type: 'decrement' })}>-</button>
    </div>
  );
};

USEREF:

useref 返回一个可变的物体,该物体在整个组件的生命周期中持续存在。存在访问和维持对礼物元素的参考,请在渲染或存储任何需要在组件的生命周期中持续存在的值之间的可变值。

示例:

import React, { useRef } from 'react';

const InputWithFocus = () => {
  const inputRef = useRef(null);

  const handleClick = () => {
    inputRef.current.focus();
  };

  return (
    <div>
      <input ref={inputRef} type="text" />
      <button onClick={handleClick}>Focus Input</button>
    </div>
  );
};

没有搞砸。

挂钩 usememo 用于记住重计算功能的结果,并避免在每个渲染中重新计算它。

它接收轨道功能和依赖性数组,并返回记忆的值。当计算在计算上进行密集并且输入值不会随频率而变化时。

示例:

import React, { useMemo } from 'react';

const ExpensiveCalculation = () => {
  const result = useMemo(() => {
    // Cálculo pesado
    return performExpensiveCalculation();
  }, [dependencies]);

  return <div>Result: {result}</div>;
};

usecallback:

挂钩 Usecallback 用于记住功能,并避免使用每个渲染组件对此功能进行不必要的繁殖。

您要优化依赖组件的性能,这些组件依赖于每当渲染组件时不需要重新创建的功能。

让我们在下面探索一些用例,并提供一个实用的例子。

用例:

  1. 将功能传递给子一个组件:当父亲组件将函数传递给儿童组件(作为propo)时,使用 usecallback 可以防止函数在父亲组件的每个渲染中都会重新创建功能,确保零件儿子真正需要时是最新的。
  2. 优化事件操纵器的创建:在具有射击复杂王牌或进行密集的事件的组件中, usecallback 可用于确保仅创建事件的操纵器,避免一次不必要的渲染。

示例:

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

const ChildComponent = memo(({ handleClick }) => {
  // Componente filho que é renderizado quando o handleClick é atualizado
  return <button onClick={handleClick}>Click Me</button>;
});

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

  const handleClick = useCallback(() => {
    setCount((prevCount) => prevCount + 1);
  }, []);

  return (
    <div>
      <p>Count: {count}</p>
      <ChildComponent handleClick={handleClick} />
    </div>
  );
};

在上面的示例中,挂钩 usecallback 用于记住父亲组件中 handleclick 的函数。因此,即使父亲组成部分是不同的时间,也不会重新创建函数 handleclick ,以确保只有在更新状态 count 更新时才能呈现组件SON。<<<<<<<<<<<<<<<<<<<<<<< /p>

使用刺激性:

挂钩使用刺激性用于暴露父亲组件的功能组件和特定特性。

它允许您控制FILHO组件的实例,并将所有个性化访问以外部访问。

让我们在下面探索一些用例,并提供一个实用的例子。

用例:

  1. 与第三方库集成:在某些情况下,您可能需要将功能组件与需要直接访问某些妈妈或组件属性的外部库集成。 使用ipperativeHandle 允许您仅揭露必要的内容,并控制组件的外部接口。
  2. 具有特定API的自定义组件:如果您要创建需要外部控制的个性化组件,作为需要验证或发送的公式形式,则可以使用 UsaimperativeHandle 用于暴露与外部控制有关的母亲。

示例:

import React, { useRef, useImperativeHandle, forwardRef } from 'react';

// Componente filho que deseja expor um método
const ChildComponent = forwardRef((props, ref) => {
  const inputRef = useRef(null);

  useImperativeHandle(ref, () => ({
    focusInput: () => {
      inputRef.current.focus();
    },
  }));

  return <input ref={inputRef} type="text" />;
});

// Componente pai que acessa o método exposto pelo componente filho
const ParentComponent = () => {
  const childRef = useRef(null);

  const handleClick = () => {
    childRef.current.focusInput();
  };

  return (
    <div>
      <ChildComponent ref={childRef} />
      <button onClick={handleClick}>Focus Input</button>
    </div>
  );
};

在上面的示例中,使用钩子使用> pperativeHandle 在儿童组件中用于暴露整个 focusinput 。组件filho使用hook useref 创建输入元素,然后hook usaimperativeHandle ©用于暴露整个母亲 focusinput

在父亲的组件中,呈现一个植物体,然后单击时,将母亲©all focusinput 由儿子组件通过 child> child recref 组件暴露。因此,可以访问FILHO组件中的输入元素并直接应用焦点。

USELAYOUTEFFECT:

hook useLayouteffect 使用效果,por©m©与React Render Cycle同步,这意味着它在礼物的更改后立即执行应用了,但是在浏览器完成屏幕绘画之前。

在您需要执行布局处理任务的情况下,取决于屏幕上元素的度量或位置。

让我们在下面探索一些用例,并提供一个实用的例子。

用例:

  1. 对元素的测量和位置进行操纵:当您需要获得渲染后已更新的礼物中要更新的元素的测量值或位置时,可以使用 uselayouteffect 。例如,如果您需要计算元素的高度或宽度,或者需要根据其他度量来定位元素。
  2. 更新视觉动物或视觉效果:当您要创建依赖更新的布局信息(例如软交易或涉及变化的动物)的视觉动物或效果时。在元素的位置或大小时, 可用于确保在屏幕绘画之前应用这些更新。
  3. 与外部库的互动:如果您将组件与外部库集成在一起,该库希望在执行某些操作之前会更新礼物,则 usolayouteefect 可能是确保礼物中的更改在与库的互动之前应用。

示例:

import React, { useLayoutEffect, useRef } from 'react';

const ComponentWithLayoutEffect = () => {
  const elementRef = useRef(null);

  useLayoutEffect(() => {
    // Obtém as medidas do elemento após a atualização do DOM
    const { width, height } = elementRef.current.getBoundingClientRect();

    // Atualiza algum estado ou realiza alguma ação com base nas medidas obtidas
    console.log(`Largura: ${width}px, Altura: ${height}px`);
  });

  return <div ref={elementRef}>Exemplo de Componente com useLayoutEffect</div>;
};

在上面的示例中,Hook UselayOutEfect用于执行后来的动作。使用挂钩 useref 引用了<div>元素,允许访问有关元素。

uselayouteffect 中,使用ALL - getBoundClientRect()获得该元素的度量在视口。

在此示例中,我们只是在控制台上显示测量值,但是您可以根据这些措施执行任何必要的操作。

重要的是要强调, uselayouteffect 是封锁和阻塞,这意味着它可能会导致组件渲染的延迟。因此,仔细使用它很重要,并考虑在某些情况下使用效果是否更合适。

二手布格维尔:

Hook 使用的Ebugvalue 是一个React诊断挂钩,可让您提供个性化的章节以进行自定义值,促进开发过程中的识别和组件目的。

它对组件渲染或功能没有影响,而是提供有关开发工具的信息。

用例:

  1. 个性化信息的展览:使用的ebugvalue 可用于在删除过程中显示有关价值的自定义信息。这是特别是在清除组件时要轻松检查的复杂或派生值时。
  2. 识别开发工具中的组件:使用支持挂钩的开发工具 使用ebugvalue 时,您可以为组件提供重要的作用,从而使其更加狂热地识别并区分了在组件中的宜人组成部分组件。
  3. 内部状态可视化:如果组件中有任何内部状态在渲染的组件中不直接可见,则可以使用 usdebugvalue 在状态下,可以更好地暴露此状态了解组件的内部状态。

示例:

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

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

  useDebugValue(`Count: ${count}`);

  const increment = () => {
    setCount(prevCount => prevCount + 1);
  };

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

在上面的示例中,挂钩 usdebugvalue 用于为计数值提供个性化的章节。这意味着,通过检查开发工具中的组件,将显示 “ count:{value}” ,以促进净化期间对会计师状态的识别。

通过单击“增量”机器人,可以更新计数状态,并再次渲染组件。在渲染过程中,Hook USDEBUGVALUE 确保更新个性化的章节,使您可以轻松地遵循清算期间的会计师的更新价值。

尽管上面的示例很简单,但是 usdebugvalue 尤其是在更复杂的场景中,您可以具有在开发过程中需要监视和检查的自定义或衍生值。

二手Value:

挂钩使用的eferredValue 是React 18中引入的钩子,可让您延迟渲染过程中状态值的更新。它是©优化具有不需要立即更新状态值的组件的性能。

用例:

  1. Chrostal中的更新:如果您具有频率更新的状态值,但是更新不是Chrustic对于立即渲染组件,则可以使用 usefefeferredvalue 延迟更新的更新这个值。这可以提高性能,减少更新的频率和不必要的渲染。
  2. 软动画: usefeferredvalue 尤其是组成部分的动物。您可以延迟用于控制动画的状态值的更新,以确保动画的执行更加流畅,而不会中断。
  3. 水数据充电:如果您正在寻找异步数据并希望在寻求数据时避免愚蠢的状态更新,则可以使用 useferredvalue 可用于延迟数据的状态,该数据是该数据的状态完全加载,避免不必要的渲染。

示例:

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

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

  const deferredCount = useDeferredValue(count, { timeoutMs: 1000 });

  const increment = () => {
    setCount(prevCount => prevCount + 1);
  };

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

在上面的示例中,挂钩 usefeferredvalue 用于将状态值的更新延迟 count 降低1秒。
在此期间,如果状态 count 在不同时间更新,则只有最后一个更新会反映在组件渲染中。

延迟值 deferredCount 在组件渲染中使用,确保只有最新更新反映在<p>元素中。这避免了不必要的渲染并改善了组件性能。

如果状态更新 count 在延迟之内,只有最新的更新在延迟pernode之后才可见。

o usefeferredvalue 尤其是当您在状态值中易经易和频繁更新,但希望优化组件的性能,避免由更新引起的不必要的渲染。

用户:

挂钩用户术是React 18中引入的钩子,使您可以在状态变化中添加软交易。

他是创建流体视觉动物和效果的等级。

用例:

  1. 密集的更新:当您进行密集的状态更新可能会导致应用程序中的视觉中断时, USETRASITION 可以用于软化这些交易。它使您可以等待一小段时间,然后才能在该州应用更新,从而为平常提供更愉快的体验。
  2. 充电transimations:如果您的应用程序显示充电元素或进度指标,则可以使用 USETRANSITION 在加载状态和完成状态完成的情况下创建平滑的动画。这有助于避免享受的界面突然变化,并在加载过程中保持愉快的用途。
  3. 输入和输出动物: USETRANSITION 是©©©©©©©©©©©©©©©©©创建输入和输出动物。元素或组件中。例如,您可以在显示或隐藏模态时使用钩子在事件发生时在屏幕上应用元素的平台。

示例:

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

const ComponentWithTransition = () => {
  const [showContent, setShowContent] = useState(false);
  const [startTransition, isPending] = useTransition({
    timeoutMs: 500, // Duration of the transition
  });

  const handleClick = () => {
    startTransition(() => {
      setShowContent(!showContent);
    });
  };

  return (
    <div>
      <button onClick={handleClick}>
        {showContent ? 'Hide Content' : 'Show Content'}
      </button>
      {isPending ? (
        <p>Loading...</p>
      ) : (
        showContent && <p>Content to be shown or hidden</p>
      )}
    </div>
  );
};

export default ComponentWithTransition;

单击植物体时,函数 handleclick 被调用。在其中,我们称为 StartStransition ,并通过了更新状态 showcent 的返回功能。

此返回函数将参与交易,从而使更平滑状态的更新视觉上。

在组件渲染中,我们根据 showcont 有条件地渲染遏制。如果交易正在待处理(在交易期间),我们将显示一个加载消息。如果我们包含,则只有在 showcount for true时才显示遏制。

挂钩用户术允许我们为状态更新添加交易效果,从而为用户提供更平滑的视觉体验。

尤其是在处理强烈状态变化或在IU交易中添加动物时。

观察:挂钩用户交叉所需版本18或更高的反应

用途:

Hook 使用用于在React中的组件中生成 - 级标识符。在您需要以动态方式为元素分配 id 的情况下,确保 id 在此组件中是独有的。

useID 最常见的用例是,当您呈现元素列表并需要分配列表中的每个项目时。

因此,每个项目都将具有独家标识符,从而促进这些元素的参考和操纵。

示例:

import React from 'react';
import { useId } from 'react-id-generator';

const ListaItens = ({ itens }) => {
  return (
    <ul>
      {itens.map((item) => (
        <Item key={useId()} texto={item} />
      ))}
    </ul>
  );
};

const Item = ({ texto }) => {
  const itemId = useId(); // Gera um ID único para cada item

  return <li id={itemId}>{texto}</li>;
};

const App = () => {
  const itens = ['Item 1', 'Item 2', 'Item 3'];

  return <ListaItens itens={itens} />;
};

export default App;

在此示例中,我们有一个组件 Listitens 接收项目数组。然后,我们使用MAP©ALL MAP在每个项目上进行操作,对于每个项目,我们使用 useIdId()作为密钥属性的值。这样可以确保列表上的每个项目都有 id 独家。

item 组件中,我们使用 usid()在每个项目中再次生成 id ã。然后,我们将此 id 归因于 id

属性。

因此,列表上的每个项目都将具有由 use()生成的独家 id ,使您可以轻松地独立识别和操纵这些元素。

挂钩 useid 在您需要动态生成 ids 的情况下,避免了 id 的冲突 反复。

找到£o:

React的其他钩子为开发人员提供了更大的灵活性和功能,以创建高效且可重复使用的功能组件

参考

React Hooks
React.dev