#javascript #reactjs
#javascript #reactjs
Вопрос:
Страница React docs об обработке событий гласит:
<button onClick={(e) => this.deleteRow(id, e)}>Delete Row</button>
<button onClick={this.deleteRow.bind(this, id)}>Delete Row</button>
В обоих случаях аргумент e, представляющий событие React, будет
передан в качестве второго аргумента после ID . С помощью функции со стрелкой мы
должны передать ее явно, но с помощью bind любые дальнейшие аргументы пересылаются
автоматически.
Итак, при использовании bind
событие передается в качестве аргумента обработчику событий в обратном вызове — как / почему это работает?
Ответ №1:
Вы получите этот ответ, если проверите polyfill
for bind, я имею в виду, что именно делает bind.
Bind в основном возвращает новую функцию, всякий раз, когда вы вызываете эту функцию (возвращаемую bind ), она объединяет все параметры (параметр, переданный во время привязки, и параметр, переданный функции, возвращаемой bind), затем передает это исходной функции.
Проверьте это полизаполнение (источник- MDN):
if (!Function.prototype.bind) (function(){
var ArrayPrototypeSlice = Array.prototype.slice;
Function.prototype.bind = function() {
var thatFunc = this, thatArg = arguments[0];
// ↓↓↓↓↓↓↓↓↓↓↓ argument bound to function
var args = ArrayPrototypeSlice.call(arguments, 1);
if (typeof thatFunc !== 'function') {
throw new TypeError('Function.prototype.bind - ' 'what is trying to be bound is not callable');
}
return function(){
// ↓↓↓↓↓↓↓↓↓↓ check here, this line is basically merging all the arguments
args.push.apply(args, arguments);
// ↓↓↓↓↓↓↓↓↓↓ here, it will call the function with particular context and all the parameters
return thatFunc.apply(thatArg, args);
};
};
})();
Комментарии:
1. Спасибо, это интересно, но я все еще не уверен, как передается событие. Может быть, там, где вы говорите, он вызывается с этим конкретным контекстом, но для меня из этого кода неясно, как это делается.
2. смотрите эту строку:
return thatFunc.apply(thatArg, args);
здесь thatArg будет контекстом, а args будут всеми объединенными аргументами. В этой строкеargs.push.apply(args, arguments);
событие будет доступно вarguments
. В каждойarguments
переменной функции (предопределенной) представлены все аргументы, переданные этой функции. проверьте MDN doc для получения более подробной информации о том же.