我正在尝试从 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})}
/>
);
};
和以前一样,我在 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})}
/>
);
};