Я предполагаю, что в первых 4 строках вы обычно помещаете их между ${
и }
. При этом упомяните эти 3 строки:
<a @click="${this.handler.bind(this)}">link</a>
<a @click="${this.handler}">link</a>
<a @click="${()=>this.handler()}">link</a>
будет очень похож по эффекту. Когда вы присоединяете обработчик событий, вам нужно передать ссылку на функцию / метод для вызова, а вторая строка:
<a @click="${this.handler()}">link</a>
скорее всего будет просто неправ. Это потому, что вы вызовете this.handler()
, как только закончится рендеринг. Единственный способ, которым это может иметь смысл, - это если метод handler
возвращает функцию.
Возвращаясь к первым трем строкам: они действительно будут иметь очень похожий эффект, поскольку во всех из них вы передаете ссылки на локальный метод рендеринга, но:
- первый не требует привязки, так как метод все равно будет вызываться в
this
контексте (но, думаю, это тоже не повредит)
- третий добавляет определение анонимной функции в качестве обработчика событий, который при вызове будет вызывать
this.handler
Так что второй в основном самый простой и легкий для чтения.
Когда дело доходит до необходимости вызывать bind в некоторых случаях: это необходимо, когда ваш метод вызывается из другого контекста. Допустим, вы передаете его как параметр обратного вызова методу, работающему в другом классе. Когда ваш метод будет вызван там, он будет по умолчанию иметь контекст этого другого объекта. Поэтому вам нужно будет использовать .bind (this), чтобы убедиться, что при вызове метода в контексте вашего элемента.
Ваш метод работает, но он запущен из другого this
. Так что, возможно, именно поэтому иногда вы не замечаете необходимости .bind(this)
. Если метод просто показывает сообщение, вызывает какую-либо другую внешнюю службу или что-то еще, что не является частью определения вашего объекта (которое не использует this.something
), он будет работать без использования привязки.
ОБНОВЛЕНИЕ: на самом деле я думаю, что обработчик событий всегда будет запускаться в контексте элемента, который вызвал это событие. Я предполагаю, что lit как раз делает это .bind(this)
, когда мы используем этот @click=
синтаксис, поскольку это имело бы большой смысл.
person
mishu
schedule
21.10.2019