Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.08.2022, 08:29
Новичок на форуме
Отправить личное сообщение для zorodivo Посмотреть профиль Найти все сообщения от zorodivo
 
Регистрация: 17.08.2022
Сообщений: 1

Как в родительском компоненте вызвать функцию из дочернего компонента?
У меня есть дочерний компонент таймера, который можно ресетнуть вызовом функции reset:
const CountDown = ({ hours = 0, minutes = 0, seconds = 0, timerStatus, restartTimer }) => {
  const [paused, setPaused] = useState(false);
  const [over, setOver] = useState(false);
  const [[h, m, s], setTime] = useState([hours, minutes, seconds]);

  const tick = () => {
    if (paused || over) return;

    if (h === 0 && m === 0 && s === 0) {
      setOver(true);
    } else if (m === 0 && s === 0) {
      setTime([h - 1, 59, 59]);
    } else if (s == 0) {
      setTime([h, m - 1, 59]);
    } else {
      setTime([h, m, s - 1]);
    }
  };

  const reset = () => { // ЭТА САМАЯ ФУНКЦИЯ
    setTime([parseInt(hours), parseInt(minutes), parseInt(seconds)]);
    setPaused(false);
    setOver(false);
  };

  useEffect(() => {
    const timerID = setInterval(() => tick(), 1000);
    console.log(s)
    return () => clearInterval(timerID);
  });

  return (
    <input
      className="count_down" 
      value={ `${s.toString().padStart(2, '0')}` } 
      onChange={ s === 0 ? timerStatus(true) : undefined }
      />
  );
};

И родительский компонент, где я в зависимости от того, прошел таймер или нет отрисовываю другие компоненты, но в родительском компоненте у меня есть кнопка, которая должна по нажатию снова скрыть компоненты и запустить таймер. Надеюсь суть ясна. Нужно через родительский компонент вызвать функцию reset, которая находится в дочернем компоненте.
Родительский компонент:
import React, { useEffect, useState } from "react";

// helper
import { CountDown } from "../helper/count-down";

// import img
import backPng from "../../img/free-icon-back-130882.png"

const ModalDialog = (props) => {

  const [statusTimer, setStatusTimer] = useState(false)
  const [restarTimer, setRestartTimer] = useState(Boolean)

  const handlerRestartTimer = () => {
    setRestartTimer(false)
  }

  const handlerModalBack = () => {
    props.modalBack(true)
  }
  return (
    <>
      <div className="modal fade" id="checkSMSCode" tabIndex="-1">
        <button className="modal_fade_back" onClick={ handlerModalBack } ><img src={ backPng } alt=""/></button>
        <div className="modal-dialog">
          <div className="modal-content">
            <div className="modal-header">
              <h5 className="modal-title">Подтверждение номера телефона</h5>
              <button type="button" className="close" data-dismiss="modal" aria-label="Close">
              <span aria-hidden="true">&times;</span>
              </button>
            </div>
            <div className="modal-body text-center">
              <div className="alert alert-danger hidden">Ошибка</div>
              <p>Введите код из SMS, отправленный на номер <span className="phone_num_info">{ props.phoneNumber }</span></p>
              <form method="POST" className="dnt_sbmt_frm" name="check_form">
                <div className="input-box">
                  <label className="control-label">Код из смс</label>
                  <input type="text" data-required="true" name="modal[sms_code]" maxLength="5" defaultValue="" />
                </div>
                <div className="resend_box">
                  { statusTimer === true ? (<div className="resend_sms" data-send-page="master_reg" onClick={ handlerRestartTimer } >Отправить код повторно</div> ) : undefined }
                  { statusTimer === false ? <p className="resend_sms_title">Получить код повторно <span className="resend_timer"> <CountDown seconds={5} timerStatus={setStatusTimer} restartTimer={restarTimer} /> </span> сек</p> : undefined} // ТОТ САМЫЙ ДОЧЕРНИЙ КОМПОНЕНТ
                </div>
                <button type="button" className="btn btn-secondary" onClick={ handlerModalBack } >Изменить номер телефона</button>
                <div className="modal-footer">
                  <button type="button" className="btn btn-primary" id="confirmSMSCode">Подтвердить</button>
                </div>
              </form>
            </div>
          </div>
        </div>
      </div>
    </>
  )
}
export { ModalDialog }

Картинка того, как выглядит сам таймер:
https://javascript.ru/forum/attachme...d=166071402 3
И то, что показывается после истечения таймера:
https://javascript.ru/forum/attachme...d=166071402 0
Как раз таки надпись "Отправить код повторно" должна ресетать таймер, показывать его и скрывать себя, но мне достаточно будет если выскажите как я могу вызвать функцию из дочернего компонента ) Спасибо.
Изображения:
Тип файла: jpg 62fc2b631200d308487594.jpg (6.3 Кб, 4 просмотров)
Тип файла: jpg 62fc2b2ce33c2028143600.jpg (6.5 Кб, 5 просмотров)
Ответить с цитированием
  #2 (permalink)  
Старый 17.08.2022, 09:29
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,215

zorodivo, и родительского в дочерний можно передать пропс который и "скажет" нужно что-то запускать в дочернем или нет.

Но это неправильный подход. Логика должна быть построена таким образом, что всем "заправляет" именно родительский элемент. Дочерние лишь исполнители его указаний.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вызвать функций ethereal Элементы интерфейса 3 26.10.2019 16:20
Как по событию click function запустить lightbox функцию? cheizer jQuery 0 05.01.2018 00:09
как вызвать анонимную функцию которая находится в подключенном файле(.js) arsen97 Общие вопросы Javascript 3 03.08.2014 00:23
Как вызвать свою функцию из «чужого» кода в Java Script, не переписывая «чужой» код? korobochkin Библиотеки/Тулкиты/Фреймворки 2 19.07.2014 16:17
Как вызвать callback функцию oke11o jQuery 12 17.01.2012 13:36