Как использовать событие onClick в компоненте React Link?


84

Я использую компонент Link из маршрутизатора reactjs, и мне не удается заставить onClickevent работать. Это код:

<Link to={this.props.myroute} onClick='hello()'>Here</Link>

Это способ сделать это или другой способ?

Ответы:


127

Вы передаете hello()строку, что также hello()означает helloнемедленное выполнение .

пытаться

onClick={hello}

32

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

<Link to={this.props.myroute} onClick={hello}>Here</Link>

Или (если метод helloлежит в этом классе):

<Link to={this.props.myroute} onClick={this.hello}>Here</Link>

Обновление: для ES6 и последних версий, если вы хотите привязать какой-либо параметр с помощью метода щелчка, вы можете использовать это:

    const someValue = 'some';  
....  
    <Link to={this.props.myroute} onClick={() => hello(someValue)}>Here</Link>

4
Или лучшеthis.hello.bind(this)
webNeat

4
^ Фактически вы всегда должны связывать действия в конструкторе, так как привязка таким образом может привести к проблемам с производительностью.
Nunchucks

1
Ссылка «на» обязательна, но часто мне просто нужен onClick (), в настоящее время я должен сделать что-то вроде <Link to="" onClick={this.delete}>Delete</Link>. Я желаю, чтобы "к" здесь необязательно.
Newman

2
@newman Зачем использовать Linkбез to? Если он вам не нужен, просто используйте какой-нибудь другой компонент, например, <button>с onClickметодом, и все готово;).
Guilherme Oderdenge

23

Я не верю, что это хороший шаблон для использования в целом. Link запустит ваше событие onClick, а затем перейдет к маршруту, поэтому при переходе к новому маршруту будет небольшая задержка. Лучшая стратегия - перейти к новому маршруту с опорой 'to', как вы это сделали, а в функции componentDidMount () нового компонента вы можете запустить свою функцию приветствия или любую другую функцию. Это даст вам тот же результат, но с гораздо более плавным переходом между маршрутами.

Для контекста, я заметил это при обновлении моего хранилища redux с помощью события onClick в Link, как здесь, и это вызвало задержку ~ 0,3 секунды перед установкой компонента нового маршрута. При этом не было вызова api, поэтому я был удивлен, что задержка была такой большой. Однако, если вы просто регистрируете консоль «привет», задержка может быть незаметна.


У меня есть URL-адрес обратного вызова в моем текущем компоненте, который я сохраняю в файле cookie onClickперед переходом на новый маршрут. Я не получу этот URL-адрес обратного вызова в следующем компоненте, поэтому мне нужно сделать это до самого перехода. Есть ли альтернатива этому? PS: URL-адрес обратного вызова должен быть доступен даже после обновления, поэтому его можно сохранить в магазине.
Parth Mistry

1
Если вы используете реагирующую навигацию: я бы сказал, не используйте Link, просто используйте TouchableOpacity или TouchableWithoutFeedback, тогда в вашей функции onPress вы можете перемещаться и передавать свой URL-адрес в качестве параметра навигации. onPress={() => { this.props.navigation.navigate('NameOfNextScreen', { callbackUrl: 'http://.callbackUrl.com', });Если вы не используете реакцию-навигацию I просто использовал Link onClick и не беспокоился о небольшой проблеме с производительностью. Наверное, не будет заметно.
Nunchucks

Хороший совет! Благодаря!
aspiringsoftwaredev
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.