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

如何在自定义钩子中创建一个组件来处理钩子中的状态?

姜泳
2023-03-14

如何在自定义钩子中创建组件,钩子保存组件的状态?

我的尝试基本上是正确的,但是拖放并没有像预期的那样工作。相反,滑块只会在单击时更改值。我认为问题在于,useState钩子在X定义之外被调用。但是我们如何在钩子中创建一个组件,然后我需要在钩子的其余部分中处理该内部组件的状态?

https://codesandbox.io/s/material-demo-milu3?file=/demo.js:0-391

import React from "react";
import Slider from "@material-ui/core/Slider";

function useComp() {
  const [value, setValue] = React.useState(30);
  const X = () => <Slider value={value} onChange={(_, v) => setValue(v)} />;
  return { X, value };
}

export default function ContinuousSlider() {
  const { X, value } = useComp();
  return (
    <div>
      {value}
      <X />
    </div>
  );
}

共有1个答案

孟翰海
2023-03-14

每当调用自定义挂钩(在每个渲染上)时,都会创建一个新的滑块(断开的)组件。由于创建了一个新组件,因此事件处理程序也将重新创建,并取消拖动。您可以通过两种方式解决此问题:

将组件包装在useCallback()中,并在呈现组件时传递值(沙盒):

  const Broken = useCallback(({ value }) => (
    <Slider value={value} onChange={changeHandler} />
  ), [changeHandler]);

  // usage
  <Broken value={broken} />

在钩子中渲染组件,并使用“将其包含在组件(沙箱)”命令:

function useComp() {
  const [broken, setBroken] = React.useState(30);

  const changeHandler = useCallback((_, v) => setBroken(v), []);

  const slider = <Slider value={broken} onChange={changeHandler} />;

  return { slider, broken };
}

// usage

<div>
  Broken: {broken}
  {slider}
  OK: {ok}
  <Slider value={ok} onChange={(_, v) => setOk(v)} />
</div>

 类似资料:
  • 和其它版本控制系统一样,Git 能在特定的重要动作发生时触发自定义脚本。 有两组这样的钩子:客户端的和服务器端的。 客户端钩子由诸如提交和合并这样的操作所调用,而服务器端钩子作用于诸如接收被推送的提交这样的联网操作。 你可以随心所欲地运用这些钩子。 安装一个钩子 钩子都被存储在 Git 目录下的 hooks 子目录中。 也即绝大部分项目中的 .git/hooks 。 当你用 git init 初始

  • 我有一个组件,我在其中调用我的自定义钩子。 自定义钩子如下所示: 而我在其中使用的导致错误的组件是: 有什么想法吗?

  • 我想使用wordpress在我的网站上添加变体 我尝试了很多插件,但它们不能满足我的要求。 要求: 我想根据给定的变化变化价格: 任何人都可以引用插件或函数?

  • 我正在研究react中的搜索栏,它在另一个文件中将调用unsplash-api,我有一个搜索栏组件,我正在考虑在主文件中调用api,或者如果有其他明智的建议,在src文件夹中的另一个文件中调用api 到目前为止,我已经安装了一个组件和初始钩子,但我不知道如何继续下去

  • 如果您有一个调用获取数据的自定义钩子的React组件,在测试React组件时,模拟内部自定义钩子结果的最佳方法是什么?我看到了两种主要的方法: 1)Jest.mock自定义钩子。这似乎是最值得推荐的方法,但它似乎需要测试对内部实现细节以及它可能需要模拟的内容有更多的了解,而不是组件的道具接口可能建议的内容(假设使用道具类型或TypeScript) 2) 使用依赖注入方法。将钩子声明为道具,但将其默

  • 我得到以下错误,不确定我在箭头函数内实例化 react 钩子时做错了什么: 错误:挂接调用无效。钩子只能在函数组件的主体内部调用。这可能是由于以下原因之一: 您可能有不匹配的React和渲染器版本(如React DOM)。 您可能违反了钩子的规则。 同一应用程序中可能有多个React副本。请参阅https://reactjs.org/link/invalid-hook-call有关如何调试和修复此