Я хочу прочитать свойства значения события onClick. Но когда я нажимаю на нее, я вижу что-то вроде этого на консоли:
SyntheticMouseEvent {dispatchConfig: Object, dispatchMarker: ".1.1.0.2.0.0:1", nativeEvent: MouseEvent, type: "click", target
Мой код работает правильно. Когда я бегу, я вижу, {column}
но не могу получить его в событии onClick.
Мой код:
var HeaderRows = React.createClass({
handleSort: function(value) {
console.log(value);
},
render: function () {
var that = this;
return(
<tr>
{this.props.defaultColumns.map(function (column) {
return (
<th value={column} onClick={that.handleSort} >{column}</th>
);
})}
{this.props.externalColumns.map(function (column) {
// Multi dimension array - 0 is column name
var externalColumnName = column[0];
return ( <th>{externalColumnName}</th>);
})}
</tr>
);
}
});
Как передать значение onClick
событию в React js?
javascript
reactjs
user1924375
источник
источник
Ответы:
Простой способ
Используйте функцию стрелки:
Это создаст новую функцию, которая вызывает
handleSort
с правильными параметрами.Лучший путь
Извлеките его в подкомпонент. Проблема с использованием функции стрелки в вызове рендеринга заключается в том, что она каждый раз создает новую функцию, которая в итоге вызывает ненужные повторные рендеринг.
Если вы создаете подкомпонент, вы можете передать обработчик и использовать реквизиты в качестве аргументов, которые затем будут перерисовываться только при изменении реквизитов (потому что ссылка на обработчик теперь никогда не меняется):
Субкомпонент
Главный компонент
Старый легкий путь (ES5)
Используйте
.bind
для передачи желаемого параметра:источник
<a>
тегом, где вам нужно передать событие, чтобы использоватьpreventDefault()
bind
.Здесь есть хорошие ответы, и я согласен с @Austin Greco (второй вариант с отдельными компонентами).
Есть еще один способ, который мне нравится - карри .
Что вы можете сделать, это создать функцию, которая принимает параметр (ваш параметр) и возвращает другую функцию, которая принимает другой параметр (в данном случае событие click). тогда вы можете делать с ним все, что захотите.
ES5:
ES6:
И вы будете использовать это так:
Вот полный пример такого использования:
Показать фрагмент кода
Обратите внимание, что этот подход не решает создание нового экземпляра на каждом рендере.
Мне нравится этот подход по сравнению с другими встроенными обработчиками, так как этот, на мой взгляд, более лаконичен и читабелен.
Редактировать:
как предлагается в комментариях ниже, вы можете кэшировать / запоминать результат функции.
Вот наивная реализация:
Показать фрагмент кода
источник
handleChange = param => cache[param] || (e => { // the function body })
В настоящее время, с ES6, я чувствую, что мы могли бы использовать обновленный ответ.
По сути, (для тех, кто не знает), поскольку
onClick
ожидает, что ему передана функция,bind
работает, потому что он создает копию функции. Вместо этого мы можем передать выражение функции стрелки, которое просто вызывает функцию, которую мы хотим, и сохраняетthis
. Вам никогда не нужно связыватьrender
метод в React, но если по какой-то причине вы проигрываетеthis
в одном из ваших компонентных методов:источник
render()
потому что это называется React. Во всяком случае, вам нужныbind
обработчики событий, и только тогда, когда вы не используете стрелки.props
кsuper()
илиthis.props
будет определено во время конструктора , который может привести к путанице.foo = () => {...}
а затем указать в render<button onClick={this.foo}...
единственную причину, чтобы включить функцию стрелки, если вы так используете babel, IMO, если вы хотите захватить некоторую переменную, которая существует только в области видимости метода render () (события могут просто передаваться и не применяться).[[h / t к @ E.Sundin для того, чтобы связать это в комментарии]
Верхний ответ (анонимные функции или привязка) будет работать, но он не самый производительный, поскольку он создает копию обработчика событий для каждого экземпляра, сгенерированного
map()
функцией.Это объяснение оптимального способа сделать это из ESLint-plugin-реакции :
источник
this.state
, вы можете смело менять его с помощью SFC.Это мой подход, не уверен, насколько это плохо, пожалуйста, прокомментируйте
В кликабельном элементе
а потом
источник
encodeURIComponent(JSON.stringify(myObj))
, затем проанализировать егоJSON.parse(decodeURIComponent(myObj))
. Для функций я уверен, что это не будет работать без eval или новой функции (), чего следует избегать. По этим причинам я не использую атрибуты данных для передачи данных в React / JS.этот пример может немного отличаться от вашего. но я могу заверить вас, что это лучшее решение для этой проблемы. Я искал несколько дней решение, которое не имеет проблемы с производительностью. и, наконец, придумал это.
ОБНОВИТЬ
если вы хотите иметь дело с объектами, которые должны быть параметрами. Вы можете использовать,
JSON.stringify(object)
чтобы преобразовать его в строку и добавить в набор данных.источник
источник
Еще одна опция, не включающая
.bind
или не использующая ES6, - это использование дочернего компонента с обработчиком для вызова родительского обработчика с необходимыми реквизитами. Вот пример (и ссылка на рабочий пример ниже):Основная идея заключается в том, чтобы родительский компонент передавал
onClick
функцию дочернему компоненту. Дочерний компонент вызываетonClick
функцию и может получить доступ к любомуprops
переданному ей (иevent
), что позволяет вам использовать любоеevent
значение или другие реквизиты внутри родительского элемента.onClick
.Вот демонстрация CodePen, демонстрирующая этот метод в действии.
источник
Попытка ответить на вопрос OP, включая вызовы e.preventDefault ():
Предоставленная ссылка ( ES6 )
Функция компонента
источник
Я понимаю, что это довольно поздно для вечеринки, но я думаю, что гораздо более простое решение может удовлетворить многие варианты использования:
Я полагаю, вы также можете использовать
data-
атрибут.Простой, семантический.
источник
Просто создайте такую функцию
и позвоните в нужное вам место
<Icon onClick = {() => {methodName (theParamsYouwantToPass); }} />
источник
Вы можете просто сделать это, если вы используете
ES6
.источник
Реализация показа общего количества от объекта путем передачи количества в качестве параметра от основного к вспомогательным компонентам, как описано ниже.
Вот MainComponent.js
А вот
SubComp.js
Попробуйте реализовать выше, и вы получите точный сценарий того, как параметры передачи работают вactjs для любого метода DOM.
источник
Я написал компонент-обертку, который можно использовать повторно для этой цели, основываясь на принятых здесь ответах. Если все, что вам нужно сделать, это передать строку, однако, просто добавьте атрибут data и прочитайте его из e.target.dataset (как предлагали некоторые другие). По умолчанию моя обертка будет связываться с любым реквизитом, который является функцией, и начинается с 'on' и автоматически передает реквизит данных вызывающей стороне после всех других аргументов события. Хотя я не проверял его на производительность, он даст вам возможность избежать создания класса самостоятельно, и его можно использовать так:
или для компонентов и функций
или если вы предпочитаете
заявить, что за пределами вашего контейнера (около вашего импорта)
Вот использование в контейнере:
Вот код оболочки 'withData.js:
источник
У меня есть ниже 3 предложения на это на JSX onClick Events -
На самом деле нам не нужно использовать функцию .bind () или Arrow в нашем коде. Вы можете просто использовать в своем коде.
Вы также можете переместить событие onClick из th (или ul) в tr (или li), чтобы повысить производительность. В основном у вас будет n «прослушивателей событий» для вашего элемента n li.
// И вы можете получить доступ
item.id
кonItemClick
методу, как показано ниже:Я согласен с упомянутым выше подходом к созданию отдельных компонентов React для ListItem и List. Этот код выглядит хорошо, однако, если у вас есть 1000 li, то будет создано 1000 прослушивателей событий. Пожалуйста, убедитесь, что у вас не так много слушателей событий.
источник
Я добавил код для передачи значения события onclick в метод двумя способами. 1 используя метод связывания 2. используя метод стрелки (=>). см. методы handlesort1 и handlesort
источник
Ниже приведен пример, который передает значение на событие onClick.
Я использовал синтаксис es6. Помните, что в компоненте класса стрелка функция не связывается автоматически, поэтому явно связывается в конструкторе.
источник
Я предполагаю, что вам придется привязать метод к экземпляру класса React. Безопаснее использовать конструктор для связывания всех методов в React. В вашем случае, когда вы передаете параметр методу, первый параметр используется для привязки контекста метода «this», поэтому вы не можете получить доступ к значению внутри метода.
источник
источник
Это очень простой способ.
источник
источник
Выход из ниоткуда на этот вопрос, но я думаю, что
.bind
добьется цели. Найдите пример кода ниже.источник
Используя функцию стрелки:
Вы должны установить этап 2:
npm установить babel-preset-stage-2:
источник
Есть 3 способа справиться с этим:
Привязать метод в конструкторе как: -
Используйте функцию стрелки, создавая ее как: -
Третий способ заключается в следующем:
источник
Вы можете использовать свой код следующим образом:
Здесь e для объекта события, если вы хотите использовать методы события, как
preventDefault()
в вашей функции handle, или хотите получить целевое значение или имя какe.target.name
.источник
Я нашел решение передачи param в качестве атрибута тега довольно разумным.
Однако у него есть ограничения:
Вот почему я придумал эту библиотеку: Reaction-Event-Param
Это:
Пример использования:
источник
Было много соображений производительности, все в вакууме.
Проблема с этими обработчиками заключается в том, что вам нужно их карри, чтобы включить аргумент, который вы не можете назвать в реквизитах.
Это означает, что компоненту нужен обработчик для каждого кликабельного элемента. Давайте согласимся, что для нескольких кнопок это не проблема, верно?
Проблема возникает, когда вы обрабатываете табличные данные с десятками столбцов и тысячами строк. Там вы заметили влияние создания такого количества обработчиков.
Дело в том, что мне нужен только один.
Я устанавливаю обработчик на уровне таблицы (или UL или OL ...), и когда происходит щелчок, я могу определить, какая ячейка была нажата, используя данные, доступные с тех пор в объекте события:
Я использую поля тэгов, чтобы проверить, что щелчок произошел в допустимом элементе, например, игнорировать щелчки в нижних колонтитулах.
RowIndex и cellIndex дают точное местоположение нажатой ячейки.
Textcontent - это текст ячейки, по которой щелкнули.
Таким образом, мне не нужно передавать данные ячейки обработчику, он может самообслуживаться.
Если мне нужно больше данных, данных, которые не должны отображаться, я могу использовать атрибут набора данных или скрытые элементы.
С простой навигацией по DOM все под рукой.
Это используется в HTML с тех пор, как ПК было намного проще.
источник
Есть несколько способов передать параметр в обработчиках событий, некоторые из них следующие.
Вы можете использовать функцию стрелки, чтобы обернуть вокруг обработчик события и передать параметры:
Приведенный выше пример эквивалентен вызову
.bind
или вы можете явно вызвать bind.Помимо этих двух подходов, вы также можете передавать аргументы в функцию, которая определена как функция карри.
источник
Используйте закрытие , это приведет к чистому решению:
<th onClick={this.handleSort(column)} >{column}</th>
Функция handleSort вернет функцию с уже установленным столбцом значений .
Анонимная функция будет вызываться с правильным значением, когда пользователь нажимает кнопку th.
Пример: https://stackblitz.com/edit/react-pass-parameters-example
источник
Простое изменение требуется:
использование
<th value={column} onClick={that.handleSort} >{column}</th>
вместо
<th value={column} onClick={that.handleSort} >{column}</th>
источник