我试图根据props 中收到的问题数量加载QuestionsComponent个组件;

功能正常,但应用程序挂起后,在控制台中,我可以看到console.log(steps);得到记录无限次.

我做错了什么?

请帮忙

const DynamicForm: React.FC<any> = ({ questions }) => {
  const q: any = [];
  const [steps, setSetps] = useState([]);
  const [step, setStep] = useState(0);
  const refs = useRef<(HTMLDivElement | null)[]>([]);
  useEffect(() => {
    questions.forEach((question: any) => {
      q.push(QuestionsComponent);
    });
    setSetps(q);
    console.log(steps);

    scrollToComponent(refs.current[step], {
      offset: -100,
      align: 'top',
      duration: 1000,
    });
  }, [steps, questions, step, q]);

  return (
    <div>
      {steps
        .filter((_: any, index: any) => index <= step)
        .map((Step: any, index: any) => (
          <Step
            // eslint-disable-next-line
            key={index}
            question={questions[index]}
            domRef={(ref: any) => { refs.current[index] = ref; }}
            toPrev={() => {
              scrollToComponent(refs.current[index - 1]);
            }}
            toNext={() => {
              if (step === index + 1) {
                scrollToComponent(refs.current[index + 1]);
              }
              setStep(index + 1);
            }}
            setStep={setStep}
            step={index}
          />
        ))}
    </div>
  );
};

推荐答案

useEffect钩子的依赖项为steps,这意味着每次调用setSteps时它都会运行.您碰巧在useEffect中调用了setSteps,这会持续渲染组件并导致无限循环.

您可以将步骤作为依赖项删除,也可以添加条件判断:

 useEffect(() => {
    if(steps.length) return;
    questions.forEach((question: any) => {
      q.push(QuestionsComponent);
    });
    setSetps(q);
    console.log(steps);

    scrollToComponent(refs.current[step], {
      offset: -100,
      align: 'top',
      duration: 1000,
    });
  }, [steps, questions, step]);

Reactjs相关问答推荐

如何使用json将购物车数组传递到后台API

在带有和设计的表格中禁用和取消选中复选框

Redux Provider Stuck甚至彻底遵循了文档

后端关闭时如何在REACTION AXIOS拦截器中模拟数据?

如何在重新图表中更改悬停时的条形填充 colored颜色 ?

以下代码是否存在安全问题?

Reaction路由-如何在布局路由内呈现&q;/:id&q;路由

Antd V5组件自定义主题

如何使用 React 获取表单中的所有值?

Suspense/Await - 解析数据加载/保存到状态后无限循环

React - 添加了输入数据但不显示

无法在 KeyDown 上调用 useCallback 函数

将复杂状态和 setState 传递给更简单的 api

setState 改变对象引用

使用 React 中的功能组件更改另一个组件的状态

如何从 extrareducer redux 更改对象中元素的值

如何使用 babel 将 SVG 转换为 React 组件?

列表应该有一个唯一的关键props

CORS 政策:无访问控制允许来源-AWS 和 Vercel

警告:您在没有 `onChange` 处理程序的情况下为表单字段提供了 `value` 属性