Форма в состоянии настройки ReactStrap Modal

Я пытаюсь показать модальное окно с формой для новой заметки. Я передаю JSX, который содержит форму, в модальное окно, метод onChange ввода срабатывает, но не обновляет состояние. Я вижу, как событие запускается с console.log и значениями name и value, но состояние не обновляется. Любая помощь будет принята с благодарностью.

Modal.js

import React from "react";
import { Button, Modal, ModalHeader, ModalBody, ModalFooter } from "reactstrap";

export default function MyModal(props) {
  return (
    <Modal isOpen={props.isOpen}>
      <ModalHeader>{props.modalTitle}</ModalHeader>
      <ModalBody>{props.modalBody}</ModalBody>
      <ModalFooter>
        <Button color="primary" onClick={props.modalAction}>
          Yes
        </Button>{" "}
        <Button color="secondary" onClick={props.handleModal}>
          Cancel
        </Button>
      </ModalFooter>
    </Modal>
  );
}

LeadView.js

export class LeadView extends Component {
  constructor() {
    super()
    this.state = {
      result: '',
      message: '',
      note: '',
      modal: false,
      modalTitle: '',
      modalBody: '',
      modalAction: '',
    }
  }
  handleChange = event => {
    console.log('name', event.target.name)
    console.log('value', event.target.value)

    const { name, value } = event.target
    this.setState({
      [name]: value,
    })
  }

  handleModalForNote = () => {
    this.setState({
      modal: !this.state.modal,
      modalTitle: 'New Note',
      modalBody: (
        <div className="form-group">
          <input
            type="text"
            className="form-control"
            onChange={this.handleChange}
            name="note"
            value={this.state.note}
          />
        </div>
      ),
      modalAction: this.handleCallClick,
    })
  }

  render() {
    return (
      <Fragment>
        <MyModal
          handleModal={this.handleModalClose}
          modalAction={this.state.modalAction}
          isOpen={this.state.modal}
          modalBody={this.state.modalBody}
          modalTitle={this.state.modalTitle}
          modalOptions={this.state.modalOptions}
        />
        <button onClick={this.handleModalForNote} className="btn btn-primary">
          Write Note
        </button>
      </Fragment>
    )
  }
}

person Manuel Savino    schedule 14.02.2019    source источник


Ответы (1)


Когда вы передаете на вход функцию handleChange, вы передаете только саму функцию. Затем, когда вы передаете этот JSX модальному модулю, он выполняется с идеей, что любой код, который он выполняет, должен выполняться в модальном компоненте. Что вам нужно сделать, так это передать текущий контекст, выполнив

onChange={this.handleChange .bind(this)}

Это связывает «контекст» вашего компонента с функцией, так что теперь, где бы он ни был вызван, он будет выполняться в контексте вашего компонента LeadView.

Вы должны помнить об этом и в других местах, где вы передаете функции.

person IRTrapGod    schedule 14.02.2019
comment
Даже если функция запускается при изменении? Когда я что-то набираю, я вижу имя и значение в журнале консоли, это просто не обновляет состояние. Я также пробовал добавить .bind (this), но это не сработало - person Manuel Savino; 15.02.2019