代码之家  ›  专栏  ›  技术社区  ›  Hayk Safaryan

Redux窗体不更改值

  •  0
  • Hayk Safaryan  · 技术社区  · 6 年前

    试图用redux形式生成一个窗体。

    这是我的组件

    import React, { Component } from 'react'
    
    import { Field, reduxForm } from 'redux-form'
    
    import Form from './components/Form'
    
    import TextFieldForReduxForm from './components/TextFieldForReduxForm'
    
    import validate from './validate'
    
    import { signUpCallbacks } from './onSubmit'
    
    class SignUp extends Component {
      render () {
        return (
          <Form
            {...this.props}
            formTitle='SIGN UP'
            buttonTitle='SIGN UP'
            linkTo='/sign/in'
            linkTitle='Sign In'
          >
            <Field
              component={TextFieldForReduxForm}
              name='email'
              label='Email'
              margin='normal'
            />,
            <Field
              component={TextFieldForReduxForm}
              name='password'
              label='Password'
              type='password'
              margin='normal'
            />
          </Form>
        )
      }
    }
    
    export default reduxForm({
      form: 'signup',
      validate,
      onSubmit: signUpCallbacks.onSubmit,
      onChange: values => console.log('onChange', values)
    })(SignUp)
    

    问题是在提交时,我总是得到所需的错误,这意味着值无论如何都不会改变。和 onChange 也不会被调用。

    这是 validate.js

    export const isValidEmail = email => /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i.test(email)
    
    const validate = values => {
      console.log('validate', values)
      const errors = {}
      if (!values.email) {
        errors.email = 'Required'
      } else if (!isValidEmail(values.email)) {
        errors.email = 'Invalid email address'
      }
    
      if (!values.password) {
        errors.password = 'Required'
      }
    
      return errors
    }
    
    export default validate
    

    这里是 onSubmit.js

    export const signUpCallbacks = {
      onSubmit (values, dispatch, props) {
        console.log(values)
      }
    }
    

    这是组件

    Form.js

    import React, { Component } from 'react'
    import PropTypes from 'prop-types'
    
    import { withStyles } from '@material-ui/core/styles'
    import Grid from '@material-ui/core/Grid'
    import Typography from '@material-ui/core/Typography'
    import Button from '@material-ui/core/Button'
    
    import { Link } from 'react-router'
    
    const styles = {
      button: {
        margin: '15px 0px'
      }
    }
    
    class Form extends Component {
      static propTypes = {
        classes: PropTypes.object,
        formTitle: PropTypes.string,
        buttonTitle: PropTypes.string,
        linkTo: PropTypes.string,
        linkTitle: PropTypes.string,
        children: PropTypes.array,
        handleSubmit: PropTypes.func,
        submitting: PropTypes.bool
      }
    
      render () {
        const {
          classes,
          formTitle,
          buttonTitle,
          linkTo,
          linkTitle,
          children,
          submitting,
          handleSubmit
        } = this.props
    
        return (
          <form onSubmit={handleSubmit}>
            <Grid
              container
              spacing={16}
              alignItems='center'
              direction='column'
              justify='center'
            >
              <Typography variant='headline' gutterBottom>
                {formTitle}
              </Typography>
              {children}
              <Button
                disabled={submitting}
                type='submit'
                variant='contained'
                color='primary'
                className={classes.button}
              >
                {buttonTitle}
              </Button>
              <Link to={linkTo}>{linkTitle}</Link>
            </Grid>
          </form>
        )
      }
    }
    
    export default withStyles(styles)(Form)
    

    TextField

    import React from 'react'
    import PropTypes from 'prop-types'
    
    import TextField from '@material-ui/core/TextField'
    
    const TextFieldForReduxForm = props => {
      const {
        meta: {
          touched,
          error
        },
        label
      } = props
    
      const isErrored = error && touched
    
      const displayErrorOrLabel = () => {
        if (isErrored) return error
        return label
      }
    
      return <TextField
        {...props}
        error={isErrored}
        label={displayErrorOrLabel()}
      />
    }
    
    export default TextFieldForReduxForm
    
    TextFieldForReduxForm.propTypes = {
      meta: PropTypes.object,
      label: PropTypes.string
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Easwar    6 年前

    Redux窗体的Field组件中的值、事件处理程序和其他输入属性将传递给内部的窗体组件 props.input

    传播 道具输入 而不是 props 在textfieldForReduxForm组件中。