Reactjs 如何传递自定义道具以验证redux表单中的函数?

Reactjs 如何传递自定义道具以验证redux表单中的函数?,reactjs,react-redux,redux-form,Reactjs,React Redux,Redux Form,我试图创建一个验证函数,如果客户端存在输入错误或服务器返回错误,该函数将返回错误 import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; import { Form, submit, reduxForm, Field } from 'redux-form'; import Modal from '../../ui/mod

我试图创建一个验证函数,如果客户端存在输入错误或服务器返回错误,该函数将返回错误

import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import { Form, submit, reduxForm, Field } from 'redux-form';
import Modal from '../../ui/modal';
import { ACCOUNT_REGISTER_MODAL_ID } from './constants';
import registerRequest from './actions';
import CField from '../../ui/form/field';


function validate(values, props) {
  const errors = {};
  console.log('-');
  console.log(values);
  console.log(props);
  console.log('-');
  if (!errors.description && (!values.description || values.description.trim() === '')) {
    errors.description = 'Enter a Description';
  }
  if (!errors.username && (!values.username || values.username.trim() === '')) {
    errors.username = 'Enter a Username';
  }
  return errors;
}


class RegisterModal extends Component {

  static propTypes = {
    handleSubmit: PropTypes.func,
    fields: PropTypes.array,
    register: PropTypes.shape({
      requesting: PropTypes.bool,
      successful: PropTypes.bool,
      messages: PropTypes.array,
      errors: PropTypes.array,
      fieldErrors: PropTypes.array,
    }),
    dispatch: PropTypes.func,
  };

  onSubmit = (values) => {
    console.log(this.props);
    console.log(values);
  }

  getForm = () => {
    this.props.dispatch(submit('register'));
  }

  render() {
    const {
      handleSubmit,
      fields,
      register: {
        requesting,
        successful,
        messages,
        errors,
        fieldErrors,
      },
    } = this.props;
    console.log(fieldErrors);
    const required = value => value ? undefined : 'Required';
    return (
      <Modal
        modalID={ACCOUNT_REGISTER_MODAL_ID}
        header={'Connect Account'}
        submitText={'Connect'}
        onSubmitClick={this.getForm}
        register={this.register}
      >
        <Form
          className="ui form register"
          onSubmit={handleSubmit(this.onSubmit)}
          fieldErrors={fieldErrors}
        >
          <Field
            name="description"
            type="text"
            component={CField}
            label="Please give a recognizable name to this account"
            required
            placeholder="My main Account"
          />
          <Field
            name="username"
            type="text"
            component={CField}
            label="Please enter your username"
            required
            placeholder="foobar2017"
          />
        </Form>
      </Modal>
    );
  }
}

const mapStateToProps = state => ({
  register: state.RegisterModal,
});

const connected = connect(mapStateToProps, { registerRequest })(RegisterModal);
const formed = reduxForm({
  form: 'register',
  fields: ['description', 'username'],
  validate
})(connected);


export default formed;
import React,{Component}来自'React';
从“道具类型”导入道具类型;
从'react redux'导入{connect};
从“redux表单”导入{Form,submit,reduxForm,Field};
从“../ui/Modal”导入模态;
从“./常量”导入{ACCOUNT_REGISTER_MODAL_ID};
从“/actions”导入registerRequest;
从“../ui/form/field”导入CField;
功能验证(值、道具){
常量错误={};
console.log('-');
console.log(值);
控制台日志(道具);
console.log('-');
如果(!errors.description&&(!values.description | | values.description.trim(){
errors.description='输入说明';
}
如果(!errors.username&&(!values.username | | values.username.trim(){
errors.username='输入用户名';
}
返回错误;
}
类RegisterModal扩展组件{
静态类型={
handleSubmit:PropTypes.func,
字段:PropTypes.array,
寄存器:PropTypes.shape({
请求:PropTypes.bool,
成功:PropTypes.bool,
消息:PropTypes.array,
错误:PropTypes.array,
fieldErrors:PropTypes.array,
}),
调度:PropTypes.func,
};
onSubmit=(值)=>{
console.log(this.props);
console.log(值);
}
getForm=()=>{
本.道具.发送(提交(“登记”);
}
render(){
常数{
手推,
领域,
登记册:{
请求,,
成功的
信息,
错误,
字段错误,
},
}=这是道具;
console.log(字段错误);
const required=value=>value?未定义:“required”;
返回(
);
}
}
常量mapStateToProps=状态=>({
寄存器:state.registerModel,
});
const connected=connect(mapStateToProps,{registerRequest})(registerModel);
const formed=reduxForm({
表格:'登记',
字段:['description','username'],
验证
})(已连接);
出口违约形成;
传递给validate函数的值中似乎没有一个包含我传递给表单组件的“fieldErrors”属性。我需要能够将prop传递到validate函数中,以便能够访问通过redux接收到的来自服务器的响应

是否有其他方法可以创建验证函数

  • 我遇到了这样一个场景,我需要来自州和州的值 使用它们验证redux表单数据
  • 我实现的解决方案是在文件中获取全局变量并为其分配道具,例如:
  • let TicketList=[]//全局变量
    函数(){
    TicketList=this.props.tickets;
    返回(
    )
    }
    validationHandler(值){
    if(票证列表包括(值)){
    返回“错误消息”
    }
    }
    

    这对我有用

    你不需要
    fieldErrors={fieldErrors}
    而不是
    fieldErrors={this.fieldErrors}
    ?并且根据文档
    validate
    应该是
    类型(值:Object,props:Object)=>Object?
    我指的是两个参数,不是3,第二个是
    props
    。@YuryTarabanko我更改了validate函数,在单个字段组件上测试它,而不是在表单上测试它,但是无论哪种方式,即使我将它更改为API所说的那样,它仍然不会传递自定义的props。此外,this.fieldErrors也不正确,但更正它仍然不会使其进入验证功能。文档说,您可以将
    props
    属性添加到
    字段
    ,但在记录字段的验证道具时,自定义道具不会合并。
    道具有什么用?
    
       let TicketList = [] // global variable
        
       function () {
          TicketList = this.props.tickets;    
          return (
              <Field
                validate={validationHandler}
              />   
          )
       }
       validationHandler(value){
          if(TicketList.includes(value)){
              return "error message"
          }
       }