Вы правы в понимании потока и происхождения функции onClick
, это определено в компоненте игры более высокого уровня.
Компонент Game
определяет метод onClick
, который может быть вызван для обработки чего-либо.
В обратном порядке,
Компонент HTML [button
] дает обещание сказать, что если вы дадите мне функцию обратного вызова, которая соответствует указанной сигнатуре, ябудет вызывать его всякий раз, когда что-то происходит ( нажатие в этом событии ).
Теперь более высокий компонент (родительский для кнопки) функции кнопки Square
, обазаинтересованы в
- с использованием кнопки и
- заинтересованы в получении информации о том, когда происходит событие, согласно кнопке обещания, предложенной в пункте (1).
Но поскольку сама функция Square не имеет реального варианта использования этого события, она решила делегировать обработку этого события своему родителю так же, как и кнопка.
Но это еще один шаг, чтобы сказать, что если вы заинтересованы в получении этого уведомления, мой контракт будет расширен, и я сообщу о событии только в том случае, если вы передадите свой обратный вызов черезчлен моего входного объекта как onClick
.
Таким образом, другой компонент более высокого уровня Board
(родительский для Square) должен каким-то образом удовлетворять требованиям компонента Square
передачи объекта с членом onClick
.Обратите внимание на некоторые вещи, однако, метод renderSquare
члена Board
,
- Получает в качестве входного аргумента 'i', который он использует для оценки чего-то (...), устанавливающего значение и
onClick
свойства при запуске нового экземпляра Square
и последующем возврате этого экземпляра (поскольку JS поддерживает функции высшего порядка функции высшего порядка ) Он определяет anonymous function
какделегат, реализация которого он просто должен вернуть члену реквизита с именем onClick
(. Похоже, что у Правления также был контракт с любым потенциальным родителем, что должен быть член onClick, который был передан ему.) ... обратите внимание, что поскольку этот синтаксис еще не принят официально, babel используется для преобразования этого кода в то, что понимает обычный браузер.
renderSquare
и сам Board не делает ничего для передаваемого члена onClick, кроме как просто возвращает его в своей собственной анонимной функции на onClick={() => this.props.onClick(i)}
Полагаю, вы знаете, как будет выглядеть результат этого утверждения, но ради аргумента оно в основном становится function onClick(){return [this].props.onClick(i);}
Корневой компонент
Game
(
Board
parent) - это тот, который определяет и обеспечивает фактическую реализацию, которая удовлетворяет требованиям метода
onClick
(
, определенного компонентом кнопки ), ипередает его как
props
дочернему компоненту
Board
.Теперь это означает, что всякий раз, когда
Board
сталкивается с
onClick
, в частности, из его
props
, он, по сути, будет обращаться к анонимной функции, определенной в
Game
, которая впоследствии возвращает
Game
handleClick
функцию, см. Пункт 3.2.выше.
Чтобы попытаться ответить на ваш вопрос
У меня вопрос о том, как я задаю аргумент?Я предполагаю, что отправной точкой является вызов метода renderSquare (i) в компоненте Board.Оттуда я заблудился относительно того, как он делает свой путь, чтобы обработать Click (i).Хранится ли он в объекте функции onClick, переданном в квадрат от Board?
Самая важная вещь, на которую следует обратить внимание, это то, что весь этот код выше - это весь план или определения того, как код будет работать, когда он активен или вызывается, представьте, что это просто конвейер.Таким образом, определение не означает, что handleClick(i)
вызывается сразу, на самом деле, он не вызывается до тех пор, пока наш компонент кнопки не инициирует событие, когда что-то заставляет кнопку / удовлетворено опубликовать событие, из которых, когда это происходит,обратное объяснение этих шагов, которые я только что пытался объяснить, происходит до тех пор, пока не будет запущена функция handleClick
для корневой игры.
Я понимаю, что мой ответ может быть очень длинным, но я надеюсь, что он раскрасит сообщение и, надеюсь, поможет вам визуализировать поток вещей.