React onClick, невозможно прочитать свойство bind из undefined

Я пытаюсь запустить функцию onclick в реакции

Моя кнопка:

<button onClick = {this.logOut.bind(this)}>LogOut</button>

Моя функция

function logOut(){
Auth.signOut()
.then(data => console.info(logout)
.catch(err => console.info(err));
}

но ошибка возвращается. Невозможно прочитать свойство bind неопределенного значения.

Попробуйте добавить this.logOut = this.logOut.bind(this); в свой конструктор, а затем замените вызов на {this.logOut}

Henkan 29.05.2018 10:45

опубликуйте весь компонент, скорее всего, вам нужно удалить ключевое слово function

Lyubomir 29.05.2018 10:45

как @lustoykov: предлагаемое ключевое слово function не требуется внутри класса в ES6

Roopak PutheVeettil 29.05.2018 10:48
Поведение ключевого слова "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
970
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Во-первых, никогда не привязывайте свой метод рендеринга. bind возвращает новый метод каждый раз, когда вы его вызываете, что означает, что реакция не может оптимизировать ваш метод рендеринга. React смотрит на свойства компонентов, чтобы узнать, не изменилось ли что-нибудь, а с функциями сравнивает равенство по ссылке на объект. Поскольку ваша функция каждый раз будет новой функцией, react будет думать, что все меняется.

Во-вторых, вы можете использовать стрелочную функцию в своем компоненте, чтобы не связывать все вместе.

Вот два способа написать это по-другому, во-первых, с помощью bind:

class MyComponent extends Component {
    constructor() {
        this.logOut = this.logOut.bind(this);
    }
    function logOut() {
        //...
    }
    function render() {
        return <button onClick = {this.logOut}>LogOut</button>
    }
}

Во-вторых, с функцией стрелки:

class MyComponent extends Component {
    logOut = () => {
        //...
    }
    function render() {
        return <button onClick = {this.logOut}>LogOut</button>
    }
}

ключевая информация: "никогда не привязывайте свой метод рендеринга"

Kick Buttowski 20.08.2018 04:45

Было бы полезно, если бы вы могли предоставить более подробную информацию.

Просто попробовал пример в коде, и я вижу, что он работает нормально. https://codepen.io/anon/pen/qKBdaB?editors=0011

class Toggle extends React.Component {


  handleClick() {
    console.info('Hello')
 }

render() {
 return (
  <button onClick = {this.handleClick.bind(this)}>
   SayHello
  </button>
);
}
}

ReactDOM.render(
<Toggle />,
  document.getElementById('root')
);

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