簡體   English   中英

無法在反應引導模式中使用我的可重用反應組件

[英]Unable to use my reusable react component inside react bootstrap modal

我創建了一個可重用的 textarea 反應組件:

import React from 'react';
import '../form-input/form-input.styles.scss';

const TextAreaComponent = ({ handleChange, label, ...otherProps }) => (
 <div className="group">
   <label htmlFor="comments">{label}</label>
   <textarea className='form-input m-0' id="comments" onChange={handleChange} {...otherProps} />
 </div>
); export default TextAreaComponent;

在任何其他組件中使用時都可以正常工作,但是當我在 react-bootstrap 模態中使用它時,每次按下按鍵時,焦點都會從文本區域中丟失,我必須再次在其中單擊。 我懷疑在每次按下按鍵時,狀態是否會因模式重新呈現而發生變化,這就是文本區域的焦點丟失的原因。

這就是我在 react bootstrap modal 中使用它的方式:

  import React, { useState } from 'react';
  import './callStatusCellRenderer.styles';
  import Button from 'react-bootstrap/Button';
  import Modal from 'react-bootstrap/Modal';
  import baseUrl from '../../../apiUtils/baseUrl';
  import CustomDatePicker from '../custom-datepicker/custom-datepicker.component';
  import SelectInputComponent from '../select-input/selectInput.component';
  import TextAreaComponent from '../textarea-input/textarea.component';
  import {
  ButtonContainer,
  CalendarContainer,
  InputContainer
  } from './callStatusCellRenderer.styles';
  import axios from 'axios';

  const CallStatusRendererComponent = ({ data }) => {
    const callStatusOption = ['Option A', 'Option B', 'Option C', 'Option D'];

  const [modalShow, setModalShow] = useState(false);
  const [status, setStatus] = useState(data.callStatusInfo.status);
  const [callDate, setCallDate] = useState(new Date(data.callStatusInfo.dt) || new Date());
  const [update, setUpdate] = useState(false);
  const [comments, setComments] = useState(data.callStatusInfo.comments);

  const callInfoS = {
    initialStatus: data.callStatusInfo.status,
    initialCallDate: data.callStatusInfo.dt || new Date(),
    initialComments: data.callStatusInfo.comments
  };

  const getValue = () => {
    if (update) {
      return status;
    } else {
      return callInfoS.initialStatus
    }
  };

  const onDateChange = dt => setCallDate(dt);

  const PopUpModal = (props) => {
    const onSubmit = async e => {
      e.preventDefault();
      props.onHide();
      const patchBody =  {
        "status": status,
        "dt": callDate,
        'comments': comments
      };
      const updateCallStatusUrl = `${baseUrl}<<myAPIURL>>${data._id}`;
      const config = {
        headers: {
          'Content-type': 'application/json',
          'Authorization': localStorage.getItem('token')
        }
      };
      await axios.patch(updateCallStatusUrl, {callStatusInfo: patchBody}, config);
      setUpdate(true);
    };

    return (
        <Modal
            {...props}
            size="lg"
            aria-labelledby="contained-modal-title-vcenter"
            centered
            animation={false}
        >
          <Modal.Header closeButton>
            <Modal.Title id="contained-modal-title-vcenter">
              Update Call Info
            </Modal.Title>
          </Modal.Header>
          <Modal.Body>
            <h4>Call Details</h4>
            <InputContainer>
              <SelectInputComponent
                name="status"
                label="Status"
                value={status}
                defaultOption="Select Status"
                options={callStatusOption}
                onChange={(e) => setStatus(e.target.value)}
              />
            </InputContainer>
            <TextAreaComponent name="comments" label="Comments" value={comments} onChange={(e) => setComments(e.target.value)}/>
            <CalendarContainer>
              <div className="mr-2"> Called Patient On:</div>
              <CustomDatePicker className="ml-4" dtVal={callDate} handleChange={onDateChange}/>
            </CalendarContainer>
          </Modal.Body>
          <Modal.Footer>
            <Button onClick={e => onSubmit(e)}>Save</Button>
          </Modal.Footer>
        </Modal>
    );
  };

  return (
      <>
        <div onClick={() => setModalShow(true)}>
          <ButtonContainer>{getValue()}</ButtonContainer>
        </div>
        <PopUpModal
          show={modalShow}
          onHide={() => setModalShow(false)}
        />
      </>
  );
};export default CallStatusRendererComponent;

如何在我的可重復使用的文本區域中輸入,而不會失去對每次按鍵的關注。

我能夠解決這個問題,這里提到的這個問題和解決方案幫助了我: ReactJs component structure - Form inside modal

我基本上將 Modal 主體部分及其所有依賴狀態和 setter 方法分離到一個單獨的組件中

暫無
暫無

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

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