k4s*_*r42 1 javascript reactjs redux redux-form react-intl
使用redux-form,我尝试使用i18n进行字段级验证.我正在使用react-intl(https://github.com/yahoo/react-intl),所以我尝试了这个:
<Field name="Label" component={renderField} validate={[required(this.props.intl)]}
Run Code Online (Sandbox Code Playgroud)
具有验证功能:
const required = (intl) => (value) => {return value ? undefined : intl.formatMessage({id:"Required"})};
Run Code Online (Sandbox Code Playgroud)
问题:当我的字段标签出现错误时,如果我更改语言,我的字段状态将丢失,我的错误消息将消失.
我认为验证道具的价值不应该在渲染之间改变,因为它会导致字段重新注册.解决办法是什么 ?
如何在Field-Level Validation中正确地将react-intl集成到验证消息中?可能吗 ?
你不能将验证函数包装到另一个函数中,每次渲染表单时它都会构造一个新函数,这会导致字段重新渲染(因为this.props.validate !== nextProps.validate).
但是您可以创建Field渲染组件并将本地化验证消息作为道具传递给它.这是一个例子:
<form>
<Field
name='Label'
component={RenderField} //here you pass field render component
validate={required}
validationMessage={this.props.intl.formatMessage({id: 'Required'})}
/>
{/*rest of the form*/}
</form>
Run Code Online (Sandbox Code Playgroud)
RenderField组件:
const RenderField = (props) => {
const {validationMessage, meta: {touched, error}} = props;
return <div>
<input
{...props}
/>
{touched &&
(error &&
<div className='error'>
{validationMessage}
</div>)}
</div>;
};
export default RenderField;
Run Code Online (Sandbox Code Playgroud)
或者,如果您需要具有不同的验证消息取决于验证错误,您可以创建将返回formatMessageId并传递intl到的特定验证函数RenderField:
const RenderField = (props) => {
const {intl, meta: {touched, error}} = props;
return <div>
<input
{...props}
/>
{touched &&
(error &&
<div className='error'>
{intl.formatMessage(error)}
</div>)}
</div>;
};
Run Code Online (Sandbox Code Playgroud)