Это мой компонент, я использую встроенную функцию стрелки, чтобы изменить маршрут onClick
div, но я знаю, что это не очень хороший способ с точки зрения производительности
1. Встроенная функция стрелки
changeRoute (routeName) {
console.log(routeName)
}
render() {
return (
<>
<div onClick={() => this.changeRoute("page1")}>1</div>
<div onClick={() => this.changeRoute("page2")}>2</div>
</>
)
}
2. Если я использую привязку конструктора, то как я могу передать реквизит?
constructor() {
super(props)
this.changeRoute = this.changeRoute.bind(this)
}
changeRoute (routeName) {
console.log(routeName)
}
render() {
return (
<>
<div onClick={this.changeRoute}>1</div>
<div onClick={this.changeRoute}>2</div>
</>
)
}
3. Если я уберу функцию стрелки, то функция вызывается на самом рендере.
changeRoute (routeName) {
console.log(routeName)
}
render() {
return (
<>
<div onClick={this.changeRoute("page1")}>1</div>
<div onClick={this.changeRoute("page2")}>2</div>
</>
)
}
4. Если я использую встроенное связывание, то это также не лучше с производительностью
changeRoute (routeName) {
console.log(routeName)
}
render() {
return (
<>
<div onClick={this.changeRoute.bind(this, "page1")}>1</div>
<div onClick={this.changeRoute.bind(this, "page2")}>2</div>
</>
)
}
Тогда как я могу продолжить с лучшими способами передачи параметров?
javascript
reactjs
Темный рыцарь
источник
источник
Ответы:
Вы можете использовать функцию стрелки для определения вашего
changeRoute
обработчика.Это известно как
Class field syntax
. Подробнее об этом здесь в официальных документах реагируют.Тогда вы можете использовать эту функцию прямо так:
Вам не нужно беспокоиться о привязке. Функции стрелок наследуют родительские функции
this
.источник
executing on the go
. Мой ответ в ответ на это. Я пытаюсь сказать вам, что ваш обработчик кликов не будет,execute on the go
если вы определите обработчик, как я опубликовал.Вы можете добавить данные в свой div:
Затем вы можете получить эти данные в вашем обработчике onClick:
источник
№ 1 в порядке.
# 2 тоже «хорошо», но вам нужно пропустить реквизиты, тогда функция рендеринга будет выглядеть точно так же, как # 1 . Вы будете вызывать
bind
функцию 'd, потому что вы заменили ее в конструкторе.№ 3 просто неверен, так как функция вызывается во время рендеринга.
И что касается № 4, отреагировать документы
Это приводит к снижению производительности, когда ваша функция используется в ее дочерних компонентах, и вызывает повторное рендеринг дочерних компонентов (это не в вашем случае). Так что вы не должны делать № 4 .
источник
Лучший способ в настоящее время - обернуть ваш обработчик событий в
useCallback
ловушку, поскольку он будет препятствовать созданию вашей функции обработчика при каждом вызове render.Для получения дополнительной информации проверьте - используйте Обратные документы
источник