簡體   English   中英

在ReactJs中將道具傳遞給模態

[英]Passing props to modal in ReactJs

我實際上是在第一個React應用上工作。 這是一個收集應用程序。 在此應用程序上,有一個管理員儀表板,其中包含該應用程序的所有項目,並且管理員用戶可以刪除或修改項目(例如傳統的電子商務后台)。 對於修改項目,管理員用戶單擊“修改項目”按鈕,然后打開一個用於修改項目信息的模式。

我的問題是,當用戶打開模態時,模態工作正常,但是我無法傳遞道具所選擇項目的信息(例如品牌名稱,參考,價格...)。 很抱歉在同一天再次提出問題,但我嘗試了很多事情,但沒有結果。 一點幫助是非常歡迎的。

先感謝您,

這是我的代碼:

import React, { Component } from 'react';
import { database } from '../firebase/firebase';
import * as firebase from 'firebase';
import withAuthorization from './withAuthorization';
import _ from 'lodash';
import AuthUserContext from './AuthUserContext';
import FileUploader from "react-firebase-file-uploader";
import Image from 'react-image-resizer';
import{InstantSearch, SearchBox, Hits, Highlight, RefinementList} from "react-instantsearch/dom";
import Modal from 'react-responsive-modal';



function removeToCatalogue(hit) { 
  const item = hit.objectID;
    firebase.database().ref(`catalogue/${item}`).remove();
    console.log("Capsule correctement supprimée du catalogue")
}




const Hit = ({hit, onEdit}) =>
    <div className="item">
       <img src={hit.avatarURL} width={150} height={150}></img>
        <h1 className="marque">{hit.marque}</h1>
        <h3 className="numero">{hit.numero}</h3>
        <h4 className="reference">{hit.reference}</h4>
        <h4 className="marquesuite">{hit.marquesuite}</h4>
        <p className="cote">{hit.cote}</p>
        <button className="btn btn-warning" onClick={onEdit}>Modify Item</button>
        <button className="btn btn-danger" onClick={() => removeToCatalogue(hit)}>Supprimer</button> 
    </div>

  const Content = ({ onEdit }) => {

    const EnhancedHit = props =>
       <Hit onEdit={ onEdit } { ...props } />

    return (
      <div className="text-center">  
        <Hits hitComponent={ EnhancedHit } />
      </div>
    )
  }




class Admin extends React.Component {
  constructor (props) {
    super (props);

    this.state = {
      marque: '',
      marquesuite: '',
      numero: '',
      reference: '',
      cote: '',
      avatar: "",
      isUploading: false,
      progress: 0,
      avatarURL: "",
      catalogue: {},
      showModal: false,

    };
    this.onInputChange = this.onInputChange.bind(this);
    this.onHandleSubmit = this.onHandleSubmit.bind(this);

  }


  onOpenModal = () => {
    this.setState({ open: true });
  };

  onCloseModal = () => {
    this.setState({ open: false });
  };


  onInputChange(e) {
    this.setState({
      [e.target.name]: e.target.value
    });
  }

  onHandleSubmit(e){
    e.preventDefault();
    const catalogue = {
      marque: this.state.marque,
      marquesuite: this.state.marquesuite,
      numero: this.state.numero,
      reference: this.state.reference,
      cote: this.state.cote,
      avatar: this.state.avatar,
      avatarURL: this.state.avatarURL,

    };
    database.push(catalogue);
    this.setState({
      marque: '',
      marquesuite: '',
      numero: '',
      reference: '',
      cote: '',
      avatar: "",
      isUploading: false,
      progress: 0,
      avatarURL: "",
    });
  }

  handleUploadStart = () => this.setState({ isUploading: true, progress: 0 });
  handleProgress = progress => this.setState({ progress });
  handleUploadError = error => {
    this.setState({ isUploading: false });
    console.error(error);
  };

  handleUploadSuccess = filename => {
    this.setState({ avatar: filename, progress: 100, isUploading: false });
    firebase
      .storage()
      .ref("images")
      .child(filename)
      .getDownloadURL()
      .then(url => this.setState({ avatarURL: url }));
  };


  render (){
    const { open } = this.state;
    return (
      <div className="container-fluid">
        <div className="container">
        <h1 class="text-center">Espace d'Administration</h1>
        <a href="https://super-capsule.000webhostapp.com/signaler-modification" class="btn btn-primary btn-lg active" role="button" aria-disabled="true">Signaler une modification</a>
        <form onSubmit={this.onHandleSubmit}>
          <div className="form-group">
          <label>Marque de la capsule:</label>
          <input
            value={this.state.marque}
            type="text"
            name='marque'
            placeholder="Marque"
            onChange={this.onInputChange}
            ref="marque"
            className="form-control" />
          </div>
          <div>
          <label>Numéro de la capsule:</label>
          <input
            value={this.state.numero}
            type="text"
            name='numero'
            placeholder="Numéro de la capsule"
            onChange={this.onInputChange}
            ref="numero"
            className="form-control"/>
          </div>
          <div className="form-group">
          <label>Référence de la capsule:</label>
          <input
            value={this.state.marquesuite}
            type="text"
            name='marquesuite'
            placeholder="Référence de la capsule"
            onChange={this.onInputChange}
            ref="marquesuite"
            className="form-control"/>
          </div>
          <div className="form-group">
          <label>Référence de la capsule (suite):</label>
          <input
            value={this.state.reference}
            type="text"
            name='reference'
            placeholder="Référence de la capsule (suite)"
            onChange={this.onInputChange}
            ref="reference"
            className="form-control"/>
          </div>
          <div className="form-group">
          <label>Cote de la capsule:</label>
          <input
            value={this.state.cote}
            type="text"
            name='cote'
            placeholder="Cote de la capsule"
            onChange={this.onInputChange}
            ref="cote"
            className="form-control"/>
          </div>

          <label>Visuel de la capsule:</label>
          {this.state.isUploading && <p>Progress: {this.state.progress}</p>}
          {this.state.avatarURL && <img src={this.state.avatarURL} />}
          <FileUploader
            accept="image/*"
            name="avatar"
            randomizeFilename
            storageRef={firebase.storage().ref("images")}
            onUploadStart={this.handleUploadStart}
            onUploadError={this.handleUploadError}
            onUploadSuccess={this.handleUploadSuccess}
            onProgress={this.handleProgress}
          />
          <button className="btn btn-info">Ajouter une capsule</button>
        </form>
      </div>

        <h1 className="text-center">Catalogue de capsule</h1>



        <InstantSearch
            apiKey="xxx"
            appId="xxx"
            indexName="xxx">


            <SearchBox translations={{placeholder:'Rechercher une capsule'}} width="500 px"/>


            <Content onEdit={this.onOpenModal}/>  

              <div>
                <Modal open={open} onClose={this.onCloseModal} center>
                  <h2>Modification de la capsule</h2>
                  <p>Marque de la capsule:<input type="text" class="form-control" id="maj-marque" value=""></input></p>
                  <p>Numéro de la capsule:<input type="text" class="form-control" id="maj-num" value=""></input></p>
                  <p>Référence de la capsule:<input type="text" class="form-control" id="maj-ref" value=""></input></p>
                  <p>Référence de la capsule (suite):<input type="text" class="form-control" id="maj-refsuite" value=""></input></p>
                  <p>Cote de la capsule:<input type="text" class="form-control" id="maj-cote" value=""></input></p>
                  <button className="btn btn-success">Update</button>

                </Modal>
            </div>  


          </InstantSearch>



      </div>
    )
  }
}



const authCondition = (authUser) => !!authUser;

export default withAuthorization(authCondition)(Admin);

您無需將道具傳遞給Modal組件。 而是,保存要在Admin狀態下顯示的所有內容,然后通過該狀態進行呈現。

Hit組件中, onEdit函數應采用一個參數,該參數是一個對象,其中包含模態中所需的所有信息。 <button className="btn btn-warning" onClick={onEdit}>Modify Item</button>將變為:

    handleClick = () => {
        // I simplified the data you need to be only marque and numero here and below.
        onEdit({marque: hit.marque, numero: hit.numero})
    }
    <button className="btn btn-warning" onClick={handleClick}>Modify Item</button>

然后在Admin組件中:

    onOpenModal = (itemData) => {
        this.setState({ open: true, itemData  });
    };


    <Modal open={open} onClose={this.onCloseModal} center>
          <h2>Modification de la capsule</h2>
          <p>Marque de la capsule:<input type="text" class="form-control" id="maj-marque" value={this.state.itemData.marque}></input></p>
          <p>Numéro de la capsule:<input type="text" class="form-control" id="maj-num" value={this.state.itemData.numero}></input></p>
          <button className="btn btn-success">Update</button>
    </Modal>

希望這可以幫助。 如果您有任何疑問,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM