как прослушать событие нажатия кнопки в реакции?

Я использую пакет ниже для динамического создания формы в реакции:

https://www.npmjs.com/package/react-formio

Я нашел один пример, в котором on button click, an event is listening https://jsfiddle.net/Formio/obhgrrd8/?utm_source=website&utm_medium=embed&utm_campaign=obhgrrd8

Я хочу сделать то же самое в react, используя вышеуказанный пакет, вот мой код

https://codesandbox.io/s/lucid-austin-vjdrj

У меня есть три кнопки, которые я хочу послушать button click event

ReactDOM.render(
  <Form src="https://wzddkgsfhfvtlmv.form.io/parentform" />,

  // <Form src="https://peb3z.sse.codesandbox.io/abc" onSubmit={(i)=>{console.log(i)}} />,
  rootElement
);

person user944513    schedule 04.11.2019    source источник
comment
Возможно, настраиваемое событие или действие   -  person HMR    schedule 04.11.2019
comment
как . ?? Вы можете поделиться своим кодом?   -  person user944513    schedule 04.11.2019


Ответы (2)


В этом случае вам нужно выбрать событие как действие из модальной кнопки.

введите описание изображения здесь

И дайте название событию (скажем, eventFromButton1).

введите описание изображения здесь

И в компоненте <Form /> добавьте onCustomEvent prop.

<Form
        form={{
        onCustomEvent={customEvent => {
          console.log(customEvent);
        }}
 />

onCustomEvent функция получит объект prop со следующей структурой

{
 type: "eventFromButton1",
 component: {},
 data: {}, 
 event: MouseEvent
}

Вы можете использовать свойство type, чтобы определить, какая кнопка активировала обновление, и использовать свойство data для получения данных формы.

Попытка изменить данные формы с помощью кнопки, добавленной ниже (я не вижу хорошей документации по этим настройкам в react-formio)

Использует submission данные как реакцию state.

Измените состояние onCustomEvent и заново отрендерите форму.

    import React, { useState } from "react";
    import { Form } from "react-formio";

    function CustomForm() {
      const [submission, setSubmission] = useState({});
  return (
    <div className="App">
      <Form
        form={{
          components: [
            {
              label: "First Name",
              validate: { required: true, minLength: 3 },
              key: "firstName",
              type: "textfield",
              input: true
            },
            {
              type: "textfield",
              key: "lastName",
              label: "Last Name",
              placeholder: "Enter your last name",
              input: true
            },
            {
              label: "Pupulate Nast Name",
              action: "event",
              showValidations: false,
              key: "submit1",
              type: "button",
              input: true,
              event: "someEvent"
            },
            {
              type: "button",
              label: "Submit",
              key: "submit",
              disableOnInvalid: true,
              input: true
            }
          ]
        }}
        submission={{ data: submission }}
        onSubmit={a => {
          console.log(a);
        }}
        onSubmitDone={a => {
          console.log(a);
        }}
        onCustomEvent={customEvent => {
          console.log(customEvent);
          setSubmission({ ...customEvent.data, lastName: "Laaast Name" });
        }}
      />
    </div>
  );
 }

export default CustomForm;

Однако есть некоторые глюки по форме.

Вы увидите мерцание в пользовательском интерфейсе.

Ошибки проверки исчезнут (похоже, что кнопка отправки по-прежнему отключена)

Попробуйте эту песочницу

Также вы можете попробовать использовать redux, как указано в документации.

person Nithin Thampi    schedule 04.11.2019
comment
что такое использовать свойство submission , когда оно называется submission={{ data: submission }} - person user944513; 04.11.2019
comment
onSubmit вызывается при правильном нажатии кнопки типа Submit ?? - person user944513; 04.11.2019
comment
когда вызывается onSubmitDone ? - person user944513; 04.11.2019
comment
Это данные для отправки формы в формате {data: {field1: value1, field2: value2}}. Я сохраняю значение prev и изменяю поле в событии настраиваемой кнопки. onSubmitDone вызывается только в том случае, если в <Form /> указано свойство url. В примере, который я опубликовал, он не будет вызван - person Nithin Thampi; 04.11.2019
comment
if a url prop is specified on <Form /> это означает, что форма заполняется из любого запроса правильно ?? - person user944513; 04.11.2019
comment
означает форму, сгенерированную из правильного URL-адреса ?? в настоящее время я использую жесткий шнур json? - person user944513; 04.11.2019
comment
было бы здорово, если бы вы ответили на последний мой вопрос stackoverflow.com/questions/58680278/ - person user944513; 04.11.2019
comment
Да, в идеале это должен быть URL-адрес formio. В опубликованном вами коде вы правильно его используете. - person Nithin Thampi; 04.11.2019
comment
было бы здорово, если бы вы ответили на мой вопрос stackoverflow.com/questions/58680278/ - person user944513; 04.11.2019
comment
@Nihin любая идея по вышеуказанному вопросу - person user944513; 04.11.2019
comment
из-за знания какой-либо лучшей библиотеки для создания динамических форм - person user944513; 17.12.2019
comment
Пользовательское событие не запускается. Правильный ли синтаксис? form = {{onCustomEvent = {customEvent = ›{console.log (customEvent); }} - person Nithyanandan Sathiyanathan; 30.01.2020

реакция в конце генерирует код javascript. Таким образом, вы также можете использовать события, похожие на javascript, в реакции.

Например,

const submit = ()=>{
//your work goes here
}

return (
<div onClick={submit}> // or onClick={ ()=>submit()}

</div>
)
person Vinay Prajapati    schedule 04.11.2019
comment
@vijay это неправильный способ ... !! пожалуйста, удали этот ответ - person user944513; 04.11.2019