Учитывая ваш пример, цель перемещения реализации «вверх» по слоям заключается в том, чтобы иметь возможность использовать один и тот же компонент таймера в разных частях вашего приложения, где, возможно, start () должен вести себя по-разному каждый раз.Сам компонент не мог бы знать, что должно делать каждое конкретное «стартовое» событие, так как компонент не должен знать, как оно использовалось в любое время.
Думайте о обратных вызовах как о обработчиках событийгде вызывающий передает сообщение о том, что должно быть сделано, когда происходит событие
Это на самом деле обеспечивает СУХОЙ, так как вам нужен 1 таймер (логика запуска, пауза, остановка, «таймер достиг» может быть и т. д.), а затем каждыйвызывающий абонент подключается к тому, что он хочет делать, когда происходят эти события.
Если вы думаете о структуре самого React и его события жизненного цикла, это одно и то же.«ComponentDidMount» ничем не отличается от «запуска» вашего таймера, например, просто другой контекст.Концептуальная мысль та же
РЕДАКТИРОВАТЬ: Важно подумать о том, что остается фиксированным в вашем компоненте для всех и что должно быть настраиваемым.Например, ваш таймер всегда будет срабатывать один раз в секунду, верно?Поэтому часть отслеживания времени всегда будет постоянной для вашего приложения, она должна находиться внутри компонента.Компонент должен иметь набор методов Start, Pause, Stop, определенных в нем, так как stop всегда просто останавливает счет, start всегда возобновляет его.Но вам нужно будет выставить OnStart, OnStop, OnPause, чтобы вызывающие абоненты могли подключить логику, необходимую им, используя ваш таймер.Я не знаю, смогу ли я объяснить это достаточно хорошо ...
РЕДАКТИРОВАТЬ 2: Например, проверьте ниже метод запуска таймера ниже:
function Start(){
// set the interval here or wtver way you will have to measure ticks
// ...
// ...
if(this.props.OnStart)
this.props.OnStart();
}
Теперь, конечно, абоненты не будутотвечает за реализацию реального тикания (хотя однажды кто-то может прийти и запросить трекер, относящийся к тому, кто движется со скоростью света или чего-то еще, поэтому тиканье также можно настроить ...), но если ему нужно иметьзацепите стартовое событие, и они будут, тогда вы можете реализовать это таким образом.То, что делает функция обратного вызова, неизвестно компоненту (бизнес-логика продвинулась вверх), но общий для всех «тик один раз в секунду» теперь не имеет значения для вызывающих абонентов
РЕДАКТИРОВАТЬ 3: Хорошо, так что ..если кнопка нажата, мы запустим таймер и затем вызовем любые хуки, заданные реквизитом
function OnEveryClick(){
// here you will write anything you want your component to do every time the button is clicked, regardless of who is the caller, like our previous Start method
this.Start();
}
function ButtonClicked(){
// first you call your method every time
this.OnEveryClick();
// then if the caller also wants to do some stuff, you evaluate their function aswell
if(this.props.OnSubmit)
this.props.OnSubmit();
}
Затем на рендере вы сделаете что-то вроде этого
<button onClick={this.ButtonClicked.bind(this)}>