【问题标题】:Does [React Final Form] work with Material-UI 3.x?[React Final Form] 是否适用于 Material-UI 3.x?
【发布时间】:2019-07-15 11:19:33
【问题描述】:

我想使用 Material-UI 中的 TextField 和 react-final-form (https://github.com/final-form/react-final-form)。

主要问题是“如何获取values 对象?”

我无法从 TextField 中获取它。

结果是:

我已经尝试了不同的示例,但没有任何效果。

我的代码:

import React from 'react';
import TextField from '@material-ui/core/TextField';
import Button from '@material-ui/core/Button';
import Card from '@material-ui/core/Card';
import './loginForm.css';
import { Form, Field } from 'react-final-form';

const handleSubmit = (event, values) => {
  console.log('onsubmit event target ', event.target);
  event.preventDefault();
  console.log('onSubmit values: ', values);
};

const onChange = (event) => {
  console.log('on changed: ', event.target.value);
};

const LoginForm = () => (
  <Card className="card">
    <Form
      onSubmit={handleSubmit}
      onChange={onChange}
      render={({ values }) => (
        <form className="login-form" onSubmit={handleSubmit}>
          <Field
            name="pin"
            component={TextField}
            id="standard-name"
            label="PIN"
            value={values}
            onChange={onChange}
          />
          <Button
            type="submit"
            onClick={handleSubmit}
            variant="contained"
            color="primary"
            className="login-btn"
          >
            Sign in
          </Button>
        </form>
      )}
    />{' '}
  </Card>
);

export default LoginForm;

版本:

"@material-ui/core": "^3.9.2",
"react-final-form": "^4.0.2",

【问题讨论】:

    标签: reactjs material-ui react-final-form


    【解决方案1】:

    不能直接使用@material-ui/core/TextField,需要先包装一下:

    import React from 'react'
    import TextField from "@material-ui/core/TextField";
    
    export default ({
      input: { name, onChange, value, ...restInput },
      meta,
      ...rest
    }) => (
      <TextField
        {...rest}
        name={name}
        helperText={meta.touched ? meta.error : undefined}
        error={meta.error && meta.touched}
        inputProps={restInput}
        onChange={onChange}
        value={value}
      />
    )

    现在您已将必要的道具传递给@ui/TextField。如果您不进行验证,则不需要传递元数据。

    https://github.com/final-form/react-final-form#third-party-components

    https://codesandbox.io/s/2z5y03y81r

    【讨论】:

      【解决方案2】:

      是的!接受的答案非常好,但如果为我们完成所有表单组件的工作,那就太好了。原因是每个表单组件都有细微的差异,这使得传递属性有点难以理解。

      有一个现有项目在这方面取得了良好的开端,每月获得大量下载,但它似乎已被放弃并停止在 MUIv2 上。

      所以,我创造了我自己的想法,让一些现代的东西经过测试。它易于使用且非常灵活...

      该演示还展示了我最喜欢的 RFF 功能之一,即能够轻松控制表单渲染。这大大提高了大型表单的性能。

      【讨论】:

      • 完美@JonStevens 你已经解决了我的问题,我在材料 ui 自动完成的事情上真的很挣扎。谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-22
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      • 2021-04-10
      • 2020-06-24
      相关资源
      最近更新 更多