当前位置: 首页 > 知识库问答 >
问题:

我可以在HOC(高阶组件)中使用useState吗?

端木明贤
2023-03-14

我有一个返回功能组件的HOC(高阶组件)。我想使用useState,但收到以下错误消息:

“src/HOC.js第5:35行:不能在回调内调用React Hook“useState”。必须在React函数组件或自定义React Hook函数React Hook/rules of Hook中调用React Hook”

import React, { useState } from "react";

const HOC = (Component, data) => {
    return () => {
        const [count, setCount] = useState(data); // Error here
        const handleClick = () => {
            setCount(count + 1);
        };
        return (
            <Component
                countNumber={count}
                handleClick={handleClick}
            />
        )
    }
};

export default HOC;
import React from "react";
import HOC from "./HOC";

const LikesCount = ({countNumber, handleClick}) => {
    return (
        <div>
            {countNumber} <br />
            <button onClick={handleClick}>Like</button>
        </div>
    );
}

const EnhancedLikes = HOC(LikesCount, 5);

export default EnhancedLikes;

有没有办法在这个HOC场景中使用useState?

共有1个答案

孙清野
2023-03-14

正如评论中所讨论的,我将发布上面HOC的自定义钩子对应物:

就我在代码中所理解的,您需要一个HOC,您可以将它“挂接”到组件,它将执行计数。

因此,您可以创建自定义挂钩:

const useCounter = (default = 0) => {
      const [count, setCount] = useState(default);
      const [add, setAdd] = useState(0);
      const handleClick = (base = 0) => {
          setCount(count + base + add);
      };
      const onSetAdd = (e) => setAdd(e.target.value);
      
      return {count, handleClick, onSetAdd};
}

现在将其挂接到功能组件中:


const LikesCount = () => {
    const {count, handleClick, onSetAdd} = useCounter(0);
    const onAddOne = () => handleClick(); // default is 1, so passing none = one
    const onAddTwo = () => handleClick(2);
    const onAddThree = () => handleClick(3);
   

    return (
        <div>
            <input type="number" onChange={onSetAdd} value={add} />
            {count} <br />
            <button onClick={onAddOne}>Like</button>
            <button onClick={onAddTwo}>Add 2</button>
            <button onClick={onAddThree}>Add 3</button>
        </div>
    );
}

export default LikesCount;

就这样,您可以在想要计数器的任何组件上添加ff代码:

const {count, handleClick} = useCounter(0);

上面的代码与您提供的示例HOC完全相同。

 类似资料:
  • 本文向大家介绍使用高阶组件(HOC)实现一个loading组件相关面试题,主要包含被问及使用高阶组件(HOC)实现一个loading组件时的应答技巧和注意事项,需要的朋友参考一下

  • 我指的是这个创建React高阶组件的例子,摘自本文。 我正在努力完全理解 下面是我对上述代码的理解: 我们通过名称定义了一个HOC,它接受一个React组件(BaseComponent)。BaseComponent附带了它的props(称为P),它返回一个新的React组件,该组件接受props P 如何使用此HOC?以下尝试给出了一个打字脚本错误,即传递了太多参数: Modal React组件具

  • 本文向大家介绍高阶组件(HOC)有哪些优点和缺点?相关面试题,主要包含被问及高阶组件(HOC)有哪些优点和缺点?时的应答技巧和注意事项,需要的朋友参考一下 HOC 优点 通过传递props去影响内层组件的状态,不直接改变内层组件的状态,降低了耦合度 缺点 组件多层嵌套, 增加复杂度与理解成本 ref隔断, React.forwardRef 来解决 高阶组件多层嵌套,相同命名的props会覆盖老属性

  • Examples Using the `withRouter` utility 如果你想应用里每个组件都处理路由对象,你可以使用withRouter高阶组件。下面是如何使用它: import { withRouter } from 'next/router' const ActiveLink = ({ children, router, href }) => { const style =

  • 在React中,高阶组件是重用组件逻辑的一项高级技术。高阶组件并不是React API的一部分。高阶组件源自于React生态。 具体来说,高阶组件是一个函数,能够接受一个组件并返回一个新的组件。 const EnhancedComponent = higherOrderComponent(WrappedComponent); 组件是将props转化成UI,然而高阶组件将一个组价转化成另外一个组件

  • 本文向大家介绍React.js中的高阶组件,包括了React.js中的高阶组件的使用技巧和注意事项,需要的朋友参考一下 高阶部分简称为hoc。这是一种接收组件并返回具有附加功能的新组件的模式。 // hoc是自定义JavaScript函数的名称 我们使用带有状态和/或道具的组件来构建UI。hoc用类似的方法从提供的组件中构建一个新组件。 使用hoc在React中成为一个横切关注点。这些组件将负责单