6

我想使用来自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",
4

2 回答 2

7

不能直接使用@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

于 2019-02-22T15:52:44.383 回答
6

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

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

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

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

于 2019-11-01T11:56:57.673 回答