Como posso passar um valor de propriedade de uma função para uma caixa de diálogo 'modal' no React?

Yasin Mustafa

Quero passar um valor props.filenamede um botão para uma caixa de diálogo modal. Clicar no botão abre a caixa de diálogo.

O código para o botão está abaixo, o arquivo é chamado SaveDocumentButton.js:

import React, { Component } from "react";
import Octicon from "react-octicon";

import "./../styles/document.css";
import "react-datepicker/dist/react-datepicker.css";

const SaveDocumentButton = props => {
    return (
      <div>
        <button
          type="button"
          className="btn btn-primary"
          data-toggle="modal"
          data-target="#saveDocumentModal"
          data-tip="Edit"
          data-id={props.filename}
          onClick={() => console.log("save click" + props.filename)}
        >
          <Octicon name="tools" />
        </button>

      </div>
    );
}

export default SaveDocumentButton;

Quando eles clicam no botão 'Salvar' no modal (abaixo), preciso saber a filenamepropriedade do botão SalvarDocument. Como posso acessá-lo neste momento? O código para a classe modal está abaixo, o arquivo é denominado SaveDocument.js.

import React, { Component } from "react";
import postDocument from "./../rest/PostDocument";
import fetchPersons from "./../rest/FetchPersons";
import fetchTypes from "./../rest/FetchTypes";
import PersonList from "./../components/PersonList";
import TypeList from "./../components/TypeList";
import ShowDatePicker from "./../components/ShowDatePicker";
import moment from "moment";

class SaveDocument extends Component {
  state = {
    persons: [],
    types: [],
    document: {
      documentDate: moment(),
      personFrom: {
        id: ""
      },
      personTo: {
        id: ""
      },
      type: {
        id: ""
      },
      comments: "",
      filename: ""
    }
  };

  // 
  //
  //
  // skipped some lines
  //
  //
  //

  saveDocument()  {
    console.log("In save document=" + this.state.persons[0].id);
    console.log("In save document=" + this.state.filename);
    var documentProperty = this.state.document;
    if (!documentProperty.personFrom.id) {
      documentProperty.personFrom = this.state.persons[0];
    }
    if (!documentProperty.personTo.id) {
      documentProperty.personTo = this.state.persons[0];
    }
    if (!documentProperty.type.id) {
      documentProperty.type = this.state.types[0];
    }

    this.setState({ documentProperty });
    postDocument.callApi(this.state.document, "hi")
  };

  render() {
    return (
      <div
        className="modal fade"
        id="saveDocumentModal"
        tabIndex="-1"
        role="dialog"
        aria-labelledby="exampleModalLabel"
        aria-hidden="true"
      >
        <div className="modal-dialog" role="document">
          <div className="modal-content">
            <div className="modal-header">
              <h5 className="modal-title" id="exampleModalLabel">
                Save document
              </h5>
              <button
                type="button"
                className="close"
                data-dismiss="modal"
                aria-label="Close"
              >
                <span aria-hidden="true">&times;</span>
              </button>
            </div>
            <div className="modal-body">
              <div className="row">
                <div className="col-4 text-left">Document Date:</div>
                <div className="col-6">
                  <ShowDatePicker
                    selected={this.state.document.documentDate}
                    onChangeCallback={this.handleDocumentDateChange}
                  />
                </div>
              </div>
              <br />
              <div className="row">
                <div className="col-4 text-left">Person From:</div>
                <PersonList
                  persons={this.state.persons}
                  value={this.state.document.personFrom.id}
                  onChangeCallback={this.handlePersonFromChange}
                />
              </div>
              <br />
              <div className="row">
                <div className="col-4 text-left">Person To:</div>
                <PersonList
                  persons={this.state.persons}
                  value={this.state.document.personTo.id}
                  onChangeCallback={this.handlePersonToChange}
                />
              </div>
              <br />
              <div className="row">
                <div className="col-4 text-left">Type:</div>
                <TypeList
                  types={this.state.types}
                  value={this.state.document.type.id}
                  onChangeCallback={this.handleTypeChange}
                />
              </div>
              <br />
              <div className="row">
                <div className="col-4 text-left">Comments:</div>
                <div className="col-6">
                  <input
                    type="text"
                    className="form-control position-left"
                    id="commentsBox"
                    placeholder="Comments"
                    onChange={this.handleCommentsChange}
                    onKeyPress={event => {
                      if (event.key === "Enter") {
                      }
                    }}
                  />
                </div>
              </div>
            </div>
            <div className="modal-footer">
              <button
                type="button"
                className="btn btn-secondary"
                data-dismiss="modal"
                onClick={() => this.resetFields()}
              >
                Close
              </button>
              <button
                type="button"
                className="btn btn-primary"
                data-dismiss="modal"
                onClick={() => this.saveDocument()}
              >
                Save changes
              </button>
            </div>
          </div>
        </div>
      </div>
    );
  }
}

export default SaveDocument;

Além disso, o pai para esses dois está Scan.jsabaixo, o que SaveDocumentButtonnão está explicitamente aqui, mas no < FileList/>componente

import React, { Component } from "react";
import fetchFiles from "./../rest/FetchFiles";
import FileList from "./../components/FileList";
import RefreshButton from "./../components/RefreshButton";
import SaveDocument from "./SaveDocument";

import "./../styles/app.css";
import "react-datepicker/dist/react-datepicker.css";

class Scan extends Component {
  state = {
    files: [],
    timer: this.poll()
  };

  displayFiles = fileInfo => {
    console.log(">> " + fileInfo);
    this.setState(prevState => ({
      files: fileInfo
    }));
    console.log("diaplayf File method" + this.state.timer);
  };

  poll() {
    var _this = this;
    //setInterval(this.poll, 10000)
    setInterval(function () {
         fetchFiles.callApi(_this.displayFiles);
     }, 500000);
    console.log("Timer");
  }

  componentWillMount() {
    fetchFiles.callApi(this.displayFiles);
  }

  componentWillUnmount() {
    console.log("um");
    clearInterval(this.state.timer);
  }

  render() {
    console.log("IN RENDER");

    return (
      <div>
        <RefreshButton onSubmit={this.displayFiles} />
        <FileList files={this.state.files} />
        <SaveDocument />
      </div>
    );
  }
}

export default Scan;
chris.va.rao

A maneira mais simples é aninhar seu componente modal dentro do componente em que seu SaveButtoncomponente está aninhado. Declare um onClickmanipulador no componente pai de seu SaveButtone passe esse onClickmanipulador para o SaveButtoncomo uma propriedade. Faça com que onClickmostre o modal e passe o nome do arquivo como uma propriedade.

class Form extends React.Component {
  constructor() {
    super();
    this.state = {
      filename: '',
      showModal: false,
    };
  }

  render() {
    const { filename, showModal } = this.state;

    const onSaveButtonClick = () => {
      this.setState({ showModal: true });
    }

    const onModalSubmit = () => {
      this.setState({ showModal: false });
    }

    ...

    return (
      ...
      <SaveButton
        ...
        filename={this.props.filename}
        onClick={onSaveButtonClick}
      />
      ...
      {showModal ? (
        <SaveDocument
          ...
          onSubmit={onModalSubmit}
          filename={filename}
        />
       ) && null}
    );
  }
}

Se você não deseja aninhar o botão salvar e modal dentro do mesmo componente, você pode querer que seu modal obtenha o nome do arquivo de um estado global. A maneira padrão de gerenciar o estado global em reação é através redux.

https://github.com/reduxjs/react-redux

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

TOP lista

  1. 1

    R Shiny: use HTML em funções (como textInput, checkboxGroupInput)

  2. 2

    UITextView não está exibindo texto longo

  3. 3

    Dependência circular de diálogo personalizado

  4. 4

    Acessando relatório de campanhas na AdMob usando a API do Adsense

  5. 5

    Como assinar digitalmente um documento PDF com assinatura e texto visíveis usando Java

  6. 6

    R Folheto. Dados de pontos de grupo em células para resumir muitos pontos de dados

  7. 7

    Setas rotuladas horizontais apontando para uma linha vertical

  8. 8

    O Chromium e o Firefox exibem as cores de maneira diferente e não sei qual deles está fazendo certo

  9. 9

    Definir um clipe em uma trama nascida no mar

  10. 10

    Por que meus intervalos de confiança de 95% da minha regressão multivariada estão sendo plotados como uma linha de loess?

  11. 11

    Como dinamizar um Dataframe do pandas em Python?

  12. 12

    regex para destacar novos caracteres de linha no início e no fim

  13. 13

    Why isn't my C# .Net Core Rest API route finding my method?

  14. 14

    Como obter a entrada de trás de diálogo em treeview pyqt5 python 3

  15. 15

    Tabela CSS: barra de rolagem para a primeira coluna e largura automática para a coluna restante

  16. 16

    How to create dynamic navigation menu select from database using Codeigniter?

  17. 17

    Como recuperar parâmetros de entrada usando C #?

  18. 18

    Changing long, lat values of Polygon coordinates in python

  19. 19

    Livros sobre criptografia do muito básico ao muito avançado

  20. 20

    Método \ "POST \" não permitido no framework Django rest com ações extras & ModelViewset

  21. 21

    Pesquisa classificada, conte números abaixo do valor desejado

quentelabel

Arquivo