我正在尝试从 redux-Form 迁移到 react-Final-Form

I am trying to migrate from redux-Form to react-Final-Form

和以前一样,我在 reduxForm 工作,然后我发现了 reactFinalForm。所以现在我正在尝试将我的代码从 reduxForm 迁移到 reactFinalForm 并参考其官方文档。但是我的控制台出现错误,不知道这是否是主要问题

错误:Functions are not valid as a React child. This may happen if you return a Component instead of <Component /> from render. Or maybe you meant to call this function rather than return it. -> in renderForm (created by ReactFinalForm)

可能我在这个块中遇到了错误

const LoginForm= (props) =>{
  return <Form
    onSubmit={props.onSubmit}
    validate= { v => {
    const e = {};
     if(!v.email) {e.email= "Required";}
     else if(invalidEmail(v.email)) e.email= "Invalid email";
     if (!v.password){ e.password = "Required";}
     return e;
    }}
    component={renderForm} 
    />;
} 

我认为这是抛出错误 component={renderForm}

我正在尝试的代码块:

const renderForm=()=>({loading})=>{
  const d=loading? 'disabled': '';
  return (
   <Form
    render= {({error,onSubmit,handleSubmit})=>(
     <form onSubmit={handleSubmit(onSubmit)}>
      <fieldset>
       <legend>Credentials</legend>
       <UserInformation/>
       <ClickWrap/>
       <button disabled={d}>{d? 'Loading...': 'AGREE & LOGIN'}</button>
       {error&& <p className="error">{error}</p>}
      </fieldset>
     </form>
    )}
   />
 );
 }

const LoginForm= (props) =>{
  return <Form
    onSubmit={props.onSubmit}
    validate= { v => {
    const e = {};
     if(!v.email) {e.email= "Required";}
     else if(invalidEmail(v.email)) e.email= "Invalid email";
     if (!v.password){ e.password = "Required";}
     return e;
    }}
    component={renderForm}
    />;
} 

class Login extends PureComponent {
 constructor(props){super(props); this.state = {};}
 componentDidMount(){buttonCheck(this.props);}
 componentDidUpdate(){buttonCheck(this.props);}

 handleSubmit= v/*values*/ => {
  this.props.loginPromiseCreator(v);
  agree(this.props);
 }

 render=()=>(
  <Fragment>
   <NavigationLink />
   <MarketingPitch text="Welcome back! Please login."/>
   <LoginForm onSubmit={this.handleSubmit} loading={this.props.loading}/>
  </Fragment>
 );
}

const mapStateToProps = s/*state*/=>{ const l=s.login;
 return {isLoggedIn: l.loggedIn, loading: l.loading,
  isAgreed:l.termsAgree,user: l.user};
}

const mapDispatchToProps = dispatch => ({...bindPromiseCreators({
 loginPromiseCreator},dispatch)});

export default withRouter(connect(mapStateToProps,
 mapDispatchToProps)(Login));

寻求意见并提前致谢

问题是 renderForm 函数,您的组件应该是 returns React 元素而不是其他函数的函数。

您可以使用 render 属性来传递额外的属性:

const renderForm = ({ error, onSubmit, handleSubmit, loading }) => {
  const d = loading ? "disabled" : "";

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <fieldset>
        <legend>Credentials</legend>
        <UserInformation />
        <ClickWrap />
        <button disabled={d}>{d ? "Loading..." : "AGREE & LOGIN"}</button>
        {error && <p className="error">{error}</p>}
      </fieldset>
    </form>
  );
};

const LoginForm = props => {
  return (
    <Form
      onSubmit={props.onSubmit}
      validate={v => {
        const e = {};
        if (!v.email) {
          e.email = "Required";
        } else if (invalidEmail(v.email)) e.email = "Invalid email";
        if (!v.password) {
          e.password = "Required";
        }
        return e;
      }}
      render={(formProps) => renderForm({...formProps, loading: props.loading})}
    />
  );
};