Grommet — пользовательский компонент в FormField

В документации Grommet FormField это указано в разделе Компонент;

Компонент может быть пользовательским, если он поддерживает свойства name, value, onChange (event =› {}), а event имеет либо event.value, либо event.target.value.

Я хотел бы реализовать пользовательский компонент, но не понимаю, как он должен взаимодействовать с контролируемым компонентом Form, чтобы предоставить его свойство value. Есть ли где-нибудь пример, показывающий, как реализовать пользовательский компонент в FormField?


person 010    schedule 12.05.2021    source источник


Ответы (1)


Вот пример кода контролируемой формы, в которой используется настраиваемый компонент ввода. Я использовал простой тег ввода, поскольку он поддерживает спецификацию документов, как указано выше.

... он поддерживает свойства name, value, onChange (event => {}), а event имеет либо event.value, либо event.target.value.

Однако вы можете свободно использовать свою собственную реализацию компонента ввода, используя приведенный ниже пример шаблона. Значение ввода будет передано в контролируемую форму без дополнительного кодирования. Запустите следующее и проверьте журналы консоли. чтобы увидеть, как значение обновляется при вводе пользовательского ввода.

import React, { useState } from "react";
import { render } from "react-dom";

import { Box, Button, Form, FormField, Grommet, TextInput } from "grommet";
import { grommet } from "grommet/themes";

const defaultValue = {
  name: "",
  custom: ""
};

export const App = () => {
  const [value, setValue] = useState(defaultValue);
  return (
    <Grommet full theme={grommet}>
      <Box fill align="center" justify="center">
        <Box width="medium">
          <Form
            value={value}
            onChange={(nextValue, { touched }) => {
              console.log("Change", nextValue, touched);
              setValue(nextValue);
            }}
            onSubmit={(event) =>
              console.log("Submit", event.value, event.touched)
            }
          >
            <FormField label="TextInput Field" name="name">
              <TextInput name="name" />
            </FormField>
            <FormField
              label="Custom Component Field"
              name="custom"
              component={(props) => <input {...props} />} // custom component
            />

            <Box direction="row" justify="between" margin={{ top: "medium" }}>
              <Button type="submit" label="Update" primary />
            </Box>
          </Form>
        </Box>
      </Box>
    </Grommet>
  );
};

render(<App />, document.getElementById("root"));

person Shimi    schedule 14.05.2021
comment
спасибо за подробный ответ; Я очень ценю это. Если бы мы хотели использовать нестандартный компонент, который не интегрируется автоматически, как компонент ввода, например, компонент CAPTCHA, как он передает необходимые свойства (onChange, значение и т. д.) обратно в форму? Заранее извиняюсь; Я просмотрел источник как Form, так и FormField и до сих пор не понимаю вовлеченного вуду. - person 010; 15.05.2021
comment
Магия заключена как в реакции, так и в люверсе, поэтому вы не обязательно найдете ее в коде люверса. Если ваш компонент Captcha реализован с использованием входного тега в своей основе, он также должен работать. Попробуйте и поделитесь своими результатами. - person Shimi; 15.05.2021
comment
ReCaptcha от Google использует скрытую текстовую область, которая, по-видимому, не вызывает событие onChange формы Grommet. Я также попытался добавить скрытый ввод и установить его значение после завершения проверки; даже это не вызывает событие onChange формы. - person 010; 16.05.2021
comment
Не стесняйтесь поделиться примером кода того, чего вы пытаетесь достичь - person Shimi; 19.05.2021
comment
Цель состоит в том, чтобы срабатывал метод проверки FormField после завершения проверки, и в конечном итоге срабатывал метод проверки формы. В коде нет ничего большего, чем добавление компонента Google recaptcha в качестве дочернего элемента в FormField. Все, что я пробовал, не дало желаемого результата. - person 010; 19.05.2021