Что bind (this) на самом деле делает в ReactJS?

this.something = this.something.bind(this)

Что на самом деле делает эта строка? Я новичок, поэтому, пожалуйста, дайте элементарный уровень объяснения (для моего понимания), а также технический способ

Возможный дубликат Использование метода привязки JavaScript

jonrsharpe 24.08.2018 08:57

вам не обязательно использовать привязку, например: onClick = {this.doSomething}, если она определена как onClick = {() => this.doSomething ()}, она будет работать без нее.

thsorens 24.08.2018 09:06

@thsorens у меня есть твое, можешь объяснить еще более технически

Ramya 24.08.2018 09:09
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
3
42
1

Ответы 1

Что на самом деле делает эта строка?

Использование метода привязки JavaScript

bind creates a new function that will have this set to the first parameter passed to bind().

Это необходимо, потому что в библиотеке DOM и многих частях JavaScript скрытый / неявный параметр функции this изменен, чтобы указывать на различные скрытые объекты.

Хороший пример касается обработчиков событий в JavaScript, где параметр this не такой, как кажется:

HTML:

<button id = "someButton" name = "Bar">Hello</button>

JavaScript (запускается после загрузки DOM):

function Foo() {
    this.name = "Foo";
}
Foo.prototype.eventHandler( event ) {
    console.info( event.type ); // will always print "click"
    console.info( this.name ); // will print either "Foo" or "Bar"
}

var button = document.getElementById("someButton"); // HTMLButton

var fooInstance = new Foo(); // fooInstance.name == "Foo"

button.addEventListener( 'click', fooInstance.eventHandler );

Если вы запустите этот код, нажмите кнопку и установите точку останова в Foo.prototype.eventHandler, тогда вы увидите, что this.name - это "Bar", а не "Foo" - даже если вы передали ссылку на fooInstance.eventHandler, который наверняка знает о fooInstance при вызове?

Это не так.

Это связано с тем, что DOM API заменяет thisfooInstance.eventHandler экземпляром button. Я не знаю точной причины, но я считаю, что это связано с поддержанием обратной совместимости с обработчиками событий JavaScript на основе HTML старой школы, такими как эти:

<button onclick = "alert(this.name)" name = "Baz">Click me</button>

(Где this относится к содержащему HTMLElement)

Таким образом, используя .bindотменяет, библиотека заменяет this. Вы можете подумать, что, поскольку .bind(this) возвращает другой Function, параметр this все равно будет изменен, но на самом деле это не так. Это связано с тем, что возвращенный Function фактически не может вообще изменить свой член this, в отличие от большинства объектов Function.

В ReactJS:

Использование foo = foo.bind(this) не является чем-то уникальным для ReactJS (это часть JavaScript), но это идиома в ReactJS:

зачем вам связывать функцию в конструкторе

This is because React didn't want to mess with ES6 specifications (binding this to functions from its class is not in the ES6 class spec), but at the same time, wanted to give its users the convenience of ES6 class syntax. You can read more about this below.

Другие вопросы по теме