Это на самом деле не проблема JSX. Это вопрос понимания того, что такое значение функции и что такое вызов функции .
Что такое значение функции?
В JavaScript функция является значением, аналогичным любому другому значению. Так же, как "foo"
создает строковое значение, () => {}
создает значение функции (точнее, функцию object ; также обратите внимание, что это одинаково для любого способа генерации функции: объявление функции, выражение функции , объявление метода, функция стрелки ... все это просто различные способы указать создание объекта функции).
В вашем примере mouseOnClick
- это переменная, которая содержит функцию. Всякий раз, когда вы пишете mouseOnClick
, вы ссылаетесь на этот функциональный объект. Обратите внимание, что ссылка на объект функции не вызывает функцию! (см. следующий раздел). Рассмотрим этот пример:
var foo = () => console.log('foo')
var bar = foo;
Здесь я присваиваю значение foo
(функция) для bar
. Сама функция не выполняется в этом процессе. То же самое происходит, когда вы передаете функцию в качестве параметра другой функции:
var foo = () => console.log('foo')
// Some hypothetical function bar
bar(foo)
В этом примере вызывается bar
и ему передается значение foo
(функция). Но функция в foo
не вызывается.
Что такое вызов функции?
Чтобы вызвать функцию (значение), вы ставите ()
после него:
var foo = () => 42;
console.log(foo); // logs function object
console.log(foo()); // calls function and logs its return value
Конечно, вы можете передавать аргументы в функции, помещая их между ()
.
Как работает onClick
?
Это работает аналогично всем API-интерфейсам обработки событий: onClick
ожидает передачи функции value , которая затем может вызываться при возникновении события.
Итак, с учетом сказанного, давайте рассмотрим ваш пример:
onClick={()=>mouseOnClick}
Это передает значение функции в onClick
( хорошо). Что делает функция? Это просто ссылки mouseOnClick
(плохо). Мы знаем, что ссылка на функцию на самом деле не вызывает функцию.
onClick={mouseOnClick()}
Вызывает функцию (()
после имени функции) и передает ее возвращаемое значение в onClick
(плохо). Мы хотим вызвать mouseOnClick
, когда событие происходит не тогда, когда компонент отображается.
onClick={()=>mouseOnClick()}
Передает значение функции в onClick
(хорошо). Что делает функция? Он вызывает mouseOnClick
(хорошо).
Теперь вы говорите, что функции / синтаксис будут вести себя по-разному, если ему будет передан аргумент. Но на самом деле это не так:
onClick={()=>mouseOnClick(id)}
То же, что и в случае 3, только с аргументом.
onClick={mouseOnClick(id)}
То же, что и в случае 2, только с аргументом.