Реакция: Неверное значение для пропа `savehere` на теге <div>. Либо удалите его из элемента, либо передайте строковое или числовое значение, чтобы сохранить его в DOM - PullRequest
2 голосов
/ 07 января 2020

Я вызываю родительский метод из дочернего компонента, используя реквизиты, и получаю эту ошибку: enter image description here

Способ передачи реквизитов в дочерний компонент AddGuest это примерно так:

import React from 'react';
 import globalService from '../services/globalService';

   import '../styles/chairqueue.css';
   import {buttonText,endPoint} from '../constants/global.constants';
   import Modal from 'react-bootstrap/Modal'
   import ModalDialog from 'react-bootstrap/ModalDialog'
import ModalHeader from 'react-bootstrap/ModalHeader'
import ModalTitle from 'react-bootstrap/ModalTitle'
import ModalBody from 'react-bootstrap/ModalBody'
import ModalFooter from 'react-bootstrap/ModalFooter'
import Button from 'react-bootstrap/Button'
import  { useState, useEffect } from 'react';
import DatePicker from "react-datepicker";
import "react-datepicker/dist/react-datepicker.css";
import AddGuest from './addGuest'

class  CreateMeeting extends React.Component {
  constructor(props){
    super(props)
    this.state={
      guestModalShow:false
    }
  }
  as=(a)=>{
    console.log('saasa')
    this.setState({guestModalShow:a});
  }
    asd=(a)=>{
    console.log(a) // works perfectly 

    }

    render(){

    return (

      <Modal
        {...this.props}
        size="lg"
        aria-labelledby="contained-modal-title-vcenter"
        centered
      >
        <Modal.Header >
        <label >Cancel</label>
          <Modal.Title id="contained-modal-title-vcenter">
            New Meeting
          </Modal.Title>
          <label>Create</label>
        </Modal.Header>
        <Modal.Body>
          <h4><input type="text" className="form-control" placeholder="Meeting title"/></h4>
          {/* <DatePicker className="form-control"
        selected={startDate}
        onChange={setStartDate}
      /> */}
      <label variant="primary" onClick={()=>this.as(true)}>
            Add Guest 
          </label>

        </Modal.Body>
        <Modal.Footer>
          <Button onClick={this.props.onHide}>Close</Button>
        </Modal.Footer>
        <AddGuest
        show={this.state.guestModalShow}
        savehere={(a)=>this.asd(a)}
        onHide={() => this.as(false)}

      />
      </Modal>      
    )
    }
  }
  export default CreateMeeting;

Мой дочерний компонент реализован следующим образом:

import React from 'react';

import '../styles/chairqueue.css';
import {buttonText,endPoint} from '../constants/global.constants';
import Modal from 'react-bootstrap/Modal'
import ModalDialog from 'react-bootstrap/ModalDialog'
import ModalHeader from 'react-bootstrap/ModalHeader'
import ModalTitle from 'react-bootstrap/ModalTitle'
import ModalBody from 'react-bootstrap/ModalBody'
import ModalFooter from 'react-bootstrap/ModalFooter'
import Button from 'react-bootstrap/Button'
import  { useState, useEffect } from 'react';
import DatePicker from "react-datepicker";
import "react-datepicker/dist/react-datepicker.css";
class  AddGuest extends React.Component  {
    constructor(props){
        super(props)
        this.state={
            startDate:new Date(),
            formControls: {
                email: '',
                name: ''

              },
        }
    }

      changeHandler = event => {
        const name = event.target.name;
        const value = event.target.value;

        this.setState({
          formControls: {
            ...this.state.formControls,
            [name]:
              value

          }
        });
      }
      sendData = () => {
          console.log('hhhh--')
        this.props.savehere("Hey Popsie, How’s it going?");
   }
      render(){
      return (
      <Modal  {...this.props} >
        <Modal.Header closeButton>
          <Modal.Title>Add Guest</Modal.Title>
        </Modal.Header>
        <Modal.Body>
        <h4><input type="text" name="name" value={this.state.formControls.name}
                    onChange={this.changeHandler} required className="form-control" placeholder="Guest Name"/></h4>
        <h4><input type="text" className="form-control" name="email" value={this.state.formControls.email}
                    onChange={this.changeHandler} required placeholder="Guest Email"/></h4>
        </Modal.Body>
        <Modal.Footer>
          <Button variant="secondary" onClick={this.props.onHide}>
            Close
          </Button>
          <Button variant="primary" onClick={()=>this.sendData()}>
            Save 
          </Button>
        </Modal.Footer>
      </Modal>
      );
      }
    }
    export default AddGuest;

Я использую модалы реакции boostrap и вызываю другой модал. В чем может быть проблема, вызывающая эту ошибку?

Ответы [ 2 ]

4 голосов
/ 07 января 2020

Проблема здесь в том, что нестандартная входная опора savehere вашего <AddGuest/> компонента, которая напрямую распространяется на <Modal/> компонент при визуализации AddGuest:

render(){
  return (
    <Modal  {...this.props} > {/*<-- This is problematic, as all props
                                  of AddGuest are spread into Modal
                                  including those not supported by 
                                  Modal such as "savehere"*/}
    ...
    </Modal>)
} 

Вместо того, чтобы распространять реквизиты непосредственно на Modal, рассмотрите , только применяя реквизиты , которые поддерживает компонент Modal. Простым решением для вашего случая будет явное указание реквизитов show и onHide, передаваемых на AddGuest:

render(){
  return (
  <Modal show={this.props.show} onHide={this.props.onHide}>
  ...
  </Modal>)
} 

Надеюсь, что это поможет!

0 голосов
/ 07 января 2020

this.asd это функция, вам не нужно снова оборачивать ее в функцию.

<AddGuest
     show={this.state.guestModalShow}
     savehere={this.asd}
     onHide={() => this.as(false)}
/>
...