如何使用 MaterialUI 以 Redux 形式获取文本字段输入值

How to grab Textfield input values with Redux-form using MaterialUI

目标:从 material UI 组件获取输入值,并将它们传递给 handleSubmit 函数中的动作创建者。

                 <Field name='email'
                  component={email =>
                   <TextField
                    fullWidth
                     autoComplete='off'
                      className={classes.textField}
                      id='email-text-field'
                      label='Email'
                      value={email} />
                    } />

                 <Field name='password'
                  component={password =>
                    <TextField
                      type='password'
                      fullWidth
                      autoComplete='off'
                      className={classes.textField}
                      id='password-text-field'
                      label='Password'
                      value={password} />
                    } />

这是它连接到 Redux 的方式:

@reduxForm({form: 'loginForm', fields: ['email', 'password']})

我在 chrome 开发工具控制台中收到的警告是: 道具类型失败:提供给 TextField 的道具 value 无效。 警告:道具类型失败:提供给输入的道具 value 无效。`

此外,我的登录表单中的电子邮件字段显示 [Object, object} 我的猜测是,这是由于 props 从

关于我哪里出错的任何想法?

当你想为 Redux-Form 使用自定义字段时,Redux-form 可以让你访问 onChange 等道具,还有其他元数据(就像表格是否被触摸一样)。这些不同种类的 道具根据类型 进行分组。

对您来说有趣的部分是与普通输入元素相关联的所有属性(如 onChangevaluetype)都分组在 props.input 中。因此,您调用 password 的参数实际上是向下发送到组件的整个 props 对象。它看起来像这样 {input:{ value: 'someValue', onChange: somFunction.. etc. etc}, meta: { touched: false, etc. etc.}}

这意味着如果你想像现在一样使用 TextField,你需要做如下事情:

<Field name='email'
    component={({input}) =>
      <TextField
         value={input.value}
         onChange={input.onChange}
         fullWidth
         autoComplete='off'
         className={classes.textField}
         id='email-text-field'
         label='Email'
        />
     } />

这可能会变得非常混乱,特别是如果你想使用 meta 道具,所以将自定义组件逻辑分解成它自己的函数通常是值得的,就像他们在示例中所做的那样文档:https://redux-form.com/7.0.4/examples/material-ui/

您可能还想知道,对于 material-ui 个组件,实际上已经存在一个 library that has done most of that manual work for you: redux-form-material-ui