Я изучаю React.Js. Я пытаюсь прикрепить событие, чтобы что-то записать в консоли, но не могу запустить свою функцию. Кто-нибудь знает, как прикрепить событие onClick к div реакции? Прошу прощения, если это основной вопрос, но я пробовал несколько разных методов, и ни один из них не работает.
Я пробовал два способа запустить функцию, показанную ниже, но ни один из них не работает.
Итак, я понял, что причина того, что события не работали, заключалась в том, что я выполнял рендеринг на стороне сервера. Если я выполняю рендеринг на клиенте, событие запускается. Кто-нибудь знает, как заставить его срабатывать, если я изначально рендерил на сервере?
class Individual extends React.Component {
handleClick = () => {
alert("GREAT");
}
render() {
const indDiv = {
margin: '5px',
width: '100px',
height: '120px',
cursor: 'pointer',
border: '5px solid pink',
color: 'blue',
float: 'left'
};
return (
<div>
<div onClick = {this.handleClick.bind(this)}>
Alert 1
</div>
<div onClick = {() => this.handleClick}>
Alert 2
</div>
<div style = {indDiv}>
{this.props.num}. {this.props.name}.
</div>
</div>
);
}
}
Спасибо всем, кто способствовал этому. После всего, что я обнаружил, поскольку изначально я создал это как часть, отрисовываемую сервером, мне пришлось присоединить события после того, как страница была отрисована. Я использовал ReactJS.Net, и мне пришлось инициализировать его отдельно, используя гидрат.
Либо удалите this, либо привяжите обработчик кликов к классу в конструкторе.
если вы объявляете функцию th, как в приведенном выше коде, вам не нужно ее связывать. ты просто так пишешь. onClick = {this.handleClick} ИЛИ onClick = {()=>{this.handleClick()}}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы должны использовать bind
onClick = {this.handleClick.bind(this)}
или используйте функцию стрелки
onClick = {()=>this.handleClick()}
вместо этого должен быть привязан в конструкторе
Вам нужно объявить метод обработчика после метода рендеринга. Вот базовая реализация вашего кода в jsfiddle.
https://jsfiddle.net/ufyxwv8p/
class Individual extends React.Component {
render() {
const indDiv = {
margin: '5px',
width: '100px',
height: '120px',
cursor: 'pointer',
border: '5px solid pink',
color: 'blue',
float: 'left'
};
return (
<div>
<div onClick = {this.handleClick}>
Click to show in console
</div>
<div style = {indDiv}>
{this.props.num}. {this.props.name}.
</div>
</div>
);
}
handleClick = () => {
console.info('this is:', this);
}
}
ReactDOM.render(<Individual/>,document.getElementById("app"))
Порядок в этой ситуации не имеет значения. Фактически, многие стандартные конфигурации ESLint будут рассматривать это как ошибку / предупреждение, если рендеринг не является самым последним методом в классе.
но я не думаю, что я изменил что-то еще, чтобы это работало. Я также думал, что javascript поддерживает подъем, но это сработало, поскольку проблем с привязкой нет, потому что стрелочные функции не нуждаются в этой привязке.
Технически вы удалили строку, касающуюся обработчика Alert 2 onClick, который был в вопросе, который был причиной проблемы, описанной в других ответах. Когда вы удалили проблемный обработчик событий, код заработал. Причина не в порядке методов.
Обработчик кликов на Alert 1 уже работает. При использовании синтаксиса свойств класса bind нет необходимости в () => {}.
Ваш обработчик кликов на Alert 2 не работает, потому что вы написали встроенную стрелочную функцию, которая возвращает другую функцию. Называть его нужно, например, () => this.handleClick().
Вот рабочий фрагмент вашего кода.
class Individual extends React.Component {
handleClick = () => {
alert("GREAT");
};
render() {
const indDiv = {
margin: "5px",
width: "100px",
height: "120px",
cursor: "pointer",
border: "5px solid pink",
color: "blue",
float: "left"
};
return (
<div>
<div onClick = {this.handleClick}>Alert 1</div>
<div onClick = {() => this.handleClick()}>Alert 2</div>
<div style = {indDiv}>
{this.props.num}. {this.props.name}.
</div>
</div>
);
}
}
ReactDOM.render(<Individual />, document.getElementById("app"));<script src = "https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div id = "app"></div>Оба способа вызова функции-обработчика неверны в вашем коде.
В вашем коде handleClick - это стрелочная функция, поэтому ручная привязка не требуется.
Если это не стрелочная функция, ручная привязка всегда должна выполняться только в конструкторе. Никогда не выполняйте привязку где-либо еще, как это было при рендере.
Когда вы используете onClick = {() => this.handleClick}, это неправильно. Это должно быть onClick = {() => this.handleClick ()}. Если нет Paranthesis, то это правильно onClick = {this.handleClick}
Так что измени
<div onClick = {this.handleClick.bind(this)}>
Alert 1
</div>
<div onClick = {() => this.handleClick}>
Alert 2
</div>
К
<div onClick = {()=> this.handleClick()}>
Alert 1
</div>
<div onClick = {() => this.handleClick()}>
Alert 2
</div>
Причина, по которой вы не должны выполнять привязку где-либо еще в компоненте, кроме конструктора, потому что, например, вы выполнили привязку непосредственно в рендере, поэтому в этом случае происходит создание новой функции в файле пакета webpack каждый раз, когда компонент визуализирует и повторно отображает, следовательно, пакет файл становится большим. Поэтому рекомендуется привязывать его только в конструкторе.
Спасибо. Это было правильное решение, однако я понял, что события запускаются только тогда, когда они отображаются на клиенте. Рендеринг на сервере мешает работе. У вас есть идеи, как заставить это работать?
Прости! Я понятия не имею о рендеринге на стороне сервера. Пожалуйста, проверьте эту ветку, может быть полезно stackoverflow.com/questions/36233309/…
вот попробуйте вот так, как вы определяете свою функцию handleclick, неправильно, я отредактировал ваш код онлайн в песочнице, чтобы он работал. вызовите функцию так, как вы вызываете Alert 1, чем определите функцию так, как я загрузил изображение
Ссылка на коды и ящик вашего кода проверьте, что
Проверьте это изображение этого кода, если у вас нет времени просмотреть весь код.
class Individual extends React.Component {
handleClick = () => {
alert("GREAT");
};
render() {
const indDiv = {
margin: "5px",
width: "100px",
height: "120px",
cursor: "pointer",
border: "5px solid pink",
color: "blue",
float: "left"
};
return (
<div>
<div onClick = {this.handleClick}>Alert 1</div>
<div onClick = {this.handleClick}>Alert 2</div>
<div style = {indDiv}>
{this.props.num}. {this.props.name}.
</div>
</div>
);
}
}
ReactDOM.render(<Individual />, document.getElementById("app"));
Вы используете приложение create-response-app и последнюю версию React? Если да, извлеките
thisизonClick.