Javascript React钩子位于使用React钩子窗体构建的多页窗体的顶层

Javascript React钩子位于使用React钩子窗体构建的多页窗体的顶层,javascript,reactjs,react-hooks,react-hook-form,Javascript,Reactjs,React Hooks,React Hook Form,我试图使用一个react钩子表单,它是一个多步骤表单,其中一个步骤有一个条件表单字段 该字段的条件是布尔属性为true。如果是真的,我想显示一组与该属性相关的问题 我发现了这一点,并在尝试中尝试遵循其逻辑,如下所述: import React, { useEffect } from "react"; import ReactDOM from "react-dom"; import useForm from "react-hook-form"; import { withRouter } fro

我试图使用一个react钩子表单,它是一个多步骤表单,其中一个步骤有一个条件
表单字段

该字段的条件是
布尔属性为true。如果是真的,我想显示一组与该属性相关的问题

我发现了这一点,并在尝试中尝试遵循其逻辑,如下所述:

import React, { useEffect } from "react";
import ReactDOM from "react-dom";

import useForm from "react-hook-form";
import { withRouter } from "react-router-dom";
import { useStateMachine } from "little-state-machine";
import updateAction from "./updateAction";




const Techniques = props => {
  const { register, unregister, handleSubmit, setValue, watch, errors } = useForm();
  const { action } = useStateMachine(updateAction);
  const onSubit = data => {
    action(data);
    props.history.push("./ProposalInnovation");
  };

const fundingOffer = watch("fundingOffer");

const CustomInput = React.memo(({ register, unregister, setValue, fundingOffer }) => {
  useEffect(() => {
    register({ fundingOffer });

    return () => unregister(fundingOffer);
  }, [fundingOffer, register, unregister]);
  return <input onChange={e => setValue(fundingOffer, e.target.value)} />;
});

function App() {
  const { register, unregister, handleSubmit, setValue, watch } = useForm();
  const fundingOffer = watch("fundingOffer");


  return (

    <div>
      <form onSubmit={handleSubmit(onSubit)}>

        <label>Test for condition:</label>
        <radio 
          ref={register} 
          name="fundingOffer"

        />

        <label>Conditional Field:</label>
        {fundingOffer == true && (
          <CustomInput {...{ register, unregister, setValue, fundingOffer: false }} />
        )}



        <input type="submit" value="next" />    




      </form>

    </div>  
  );
};
};

export default withRouter(Techniques);
import React,{useffect}来自“React”;
从“react dom”导入react dom;
从“react hook form”导入useForm;
从“react router dom”导入{withRouter};
从“小状态机”导入{useStateMachine};
从“/updateAction”导入updateAction;
常量技术=道具=>{
const{register,unregister,handleSubmit,setValue,watch,errors}=useForm();
const{action}=useStateMachine(updateAction);
const onSubit=data=>{
行动(数据);
道具。历史。推送(“/提议更新”);
};
const fundingOffer=手表(“fundingOffer”);
const CustomInput=React.memo({register,unregister,setValue,fundingOffer})=>{
useffect(()=>{
寄存器({fundingOffer});
return()=>注销(fundingOffer);
},[资金提供者,注册,注销];
返回setValue(fundingOffer,e.target.value)}/>;
});
函数App(){
const{register,unregister,handleSubmit,setValue,watch}=useForm();
const fundingOffer=手表(“fundingOffer”);
返回(
条件测试:
条件字段:
{fundingOffer==true&&(
)}
);
};
};
使用路由器导出默认值(技术);
当我在我的代码中尝试此操作时,会出现一个错误,显示:

不能在回调内部调用React Hook
useffect
。必须在React函数组件或自定义React钩子函数中调用React钩子

我认为问题在于我在多步骤表单中使用了钩子-因此,这可能算不上处于顶层(当我进入多步骤表单的几步时)


有人知道如何在这个表单构造的钩子中使用条件逻辑吗?

我建议将页面构建成多个路由,并在每个页面上将数据提交到本地存储:
redux
mobx
小状态机
等等。。。最后,您可以将所有数据提交到服务中

您的路线:

<Routes>
  <Page1 />
  <Page2 />
</Routes>
const Page1 = (props) => {
  const { register, handleSubmit } = useForm();

  const onSubmit = (data) => {
    // update your data into your store
    props.history.push('/page2')    
  }

  return <form onSubmit={handleSubmit(onSubmit)}>
    <input name="data" ref={register} />
   </form>
}

您的个人页面:

<Routes>
  <Page1 />
  <Page2 />
</Routes>
const Page1 = (props) => {
  const { register, handleSubmit } = useForm();

  const onSubmit = (data) => {
    // update your data into your store
    props.history.push('/page2')    
  }

  return <form onSubmit={handleSubmit(onSubmit)}>
    <input name="data" ref={register} />
   </form>
}
constpage1=(道具)=>{
常量{register,handleSubmit}=useForm();
const onSubmit=(数据)=>{
//将数据更新到存储中
props.history.push(“/page2”)
}
返回
}
作为参考,您也可以访问我们的文档网站:


是否显示所有代码?因为它看起来很好技术到底是什么?它似乎缺少返回一些html,缺少一个结尾}。我也非常理解为什么你在这里有你的应用程序组件,并且默认情况下只使用路由器导出技术组件。这些成分的整体结构似乎不完整,非常混乱。您可以共享代码笔或代码沙盒吗?