Добавление события клика в React.Js

Я изучаю 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, и мне пришлось инициализировать его отдельно, используя гидрат.

Вы используете приложение create-response-app и последнюю версию React? Если да, извлеките this из onClick.

ProEvilz 07.01.2019 03:32

Либо удалите this, либо привяжите обработчик кликов к классу в конструкторе.

Ben Beck 07.01.2019 03:35

если вы объявляете функцию th, как в приведенном выше коде, вам не нужно ее связывать. ты просто так пишешь. onClick = {this.handleClick} ИЛИ onClick = {()=>{this.handleClick()}}

kyun 07.01.2019 03:49
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
144
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Вы должны использовать bind

onClick = {this.handleClick.bind(this)}

или используйте функцию стрелки

onClick = {()=>this.handleClick()}

вместо этого должен быть привязан в конструкторе

ProEvilz 07.01.2019 03:34

Вам нужно объявить метод обработчика после метода рендеринга. Вот базовая реализация вашего кода в 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 будут рассматривать это как ошибку / предупреждение, если рендеринг не является самым последним методом в классе.

Alexander Staroselsky 07.01.2019 04:01

но я не думаю, что я изменил что-то еще, чтобы это работало. Я также думал, что javascript поддерживает подъем, но это сработало, поскольку проблем с привязкой нет, потому что стрелочные функции не нуждаются в этой привязке.

Syed Sadiq ali 07.01.2019 04:31

Технически вы удалили строку, касающуюся обработчика Alert 2 onClick, который был в вопросе, который был причиной проблемы, описанной в других ответах. Когда вы удалили проблемный обработчик событий, код заработал. Причина не в порядке методов.

Alexander Staroselsky 07.01.2019 05:24

Обработчик кликов на 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 каждый раз, когда компонент визуализирует и повторно отображает, следовательно, пакет файл становится большим. Поэтому рекомендуется привязывать его только в конструкторе.

Спасибо. Это было правильное решение, однако я понял, что события запускаются только тогда, когда они отображаются на клиенте. Рендеринг на сервере мешает работе. У вас есть идеи, как заставить это работать?

Christopher Vickers 07.01.2019 04:03

Прости! Я понятия не имею о рендеринге на стороне сервера. Пожалуйста, проверьте эту ветку, может быть полезно stackoverflow.com/questions/36233309/…

Hemadri Dasari 07.01.2019 04:12

вот попробуйте вот так, как вы определяете свою функцию 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"));

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