React onClick и preventDefault () обновление/перенаправление ссылок?

Я рендеринг ссылки с react:

render: ->
  `<a className="upvotes" onClick={this.upvote}>upvote</a>`

затем, выше у меня есть функция upvote:

upvote: ->
  // do stuff (ajax)

перед ссылкой У меня был span в этом месте, но мне нужно переключиться на ссылку, и вот проблема-каждый раз, когда я нажимаю на .upvotes страница обновляется, что я пробовал до сих пор:

событие.метод preventDefault() - не работает.

upvote: (e) ->
  e.preventDefault()
  // do stuff (ajax)

событие.это происходит() - не рабочий.

upvote: (e) ->
  e.stopPropagation()
  // do stuff (ajax)

return false - не работает.

upvote: (e) ->
  // do stuff (ajax)
  return false

Я также пробовал все вышеперечисленное, используя jQuery в моем индексе.html, но ничего не работает. Что мне здесь делать и что я делаю не так? Я проверил событие.тип и click Итак, я думаю, что я должен быть в состоянии избежать перенаправления как-то?

Извините, я новичок, когда дело доходит до реакции.

спасибо!

11 ответов


события React на самом деле являются синтетическими событиями, а не собственными событиями. Как написано здесь:

делегирование событий: React фактически не присоединяет обработчики событий к самим узлам. Когда React запускается, он начинает прослушивание всех событий на верхнем уровне с помощью одного прослушивателя событий. Когда компонент монтируется или размонтируется, обработчики событий просто добавляются или удаляются из внутреннего сопоставления. Когда происходит событие, React знает, как отправить это использование этого сопоставления. Если в сопоставлении не осталось обработчиков событий, обработчики событий React являются простыми no-ops.

попробуйте использовать Use Event.stopImmediatePropagation:

upvote: (e) ->
  e.stopPropagation();
  e.nativeEvent.stopImmediatePropagation();

полная версия решения будет обертывать метод upvotes внутри onClick, передавая e и используя собственный e.preventDefault ();

upvotes = (e, arg1, arg2, arg3 ) => {
    e.preventDefault();
    //do something...
}

render(){
    return (<a type="simpleQuery" onClick={ e => this.upvotes(e, arg1, arg2, arg3) }>
      upvote
    </a>);
{

попробуйте bind (this), чтобы ваш код выглядел как ниже --

 <a className="upvotes" onClick={this.upvote.bind(this)}>upvote</a>

или если вы пишете в ES6 react component в конструкторе, вы можете сделать это

constructor(props){
   super(props);
   this.upvote = this.upvote.bind(this);
}

upvote(e){   // function upvote
   e.preventDefault();
   return false

}

отображения: -> <a className="upvotes" onClick={(e) => {this.upvote(e); }}>upvote</a>


суть, которую я нашел и работает для меня:

const DummyLink = ({onClick, children, props}) => (
    <a href="#" onClick={evt => {
        evt.preventDefault();
        onClick && onClick();
    }} {...props}>
        {children}
    </a>
);

кредит для srph https://gist.github.com/srph/020b5c02dd489f30bfc59138b7c39b53


Это потому, что эти обработчики не сохраняют объем. Из документации реагировать: реагировать документации

проверьте раздел" no autobinding". Вы должны написать обработчик как: onClick = () = > {}


Если вы используете флажок

<input 
    type='checkbox'
    onChange={this.checkboxHandler}
/>

это происходит и stopImmediatePropagation не будет работать.

потому что вы должны использовать onClick={этот.checkboxHandler}


Если вы используете React Router, я бы предложил заглянуть в библиотеку react-router-bootstrap, которая имеет удобный компонент LinkContainer. Этот компонент предотвращает перезагрузку страницы по умолчанию, поэтому вам не придется иметь дело с событием.

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

import { LinkContainer } from 'react-router-bootstrap';

<LinkContainer to={givePathHere}>
    <span className="upvotes" onClick={this.upvote}>upvote</span>
</LinkContainer>

у меня были некоторые проблемы с якоря и теги preventDefault в прошлом, и я всегда забываю, что я делаю неправильно, вот что я выяснил.

проблема, с которой я часто сталкиваюсь, заключается в том, что я пытаюсь получить доступ к атрибутам компонента уничтожая их непосредственно как с другими реагируют компонентов. это не сработает, страница перезагрузится, даже e.preventDefault():

function (e, { href }) {
  e.preventDefault();
  // Do something with href
}
...
<a href="/foobar" onClick={clickHndl}>Go to Foobar</a>

кажется, разрушение вызывает ошибку (Cannot read property 'href' of undefined), что не отображается на консоли, вероятно, из-за полной перезагрузки страницы. Поскольку функция находится в ошибке,preventDefault не звонил. Если href равен#, ошибка отображается правильно, так как фактической перезагрузки нет.

теперь я понимаю, что Я могу получить доступ только к атрибутам в качестве второго аргумента обработчика для пользовательских компонентов React, а не для собственных тегов HTML. Поэтому, конечно, для доступа к атрибуту тега HTML в событии это будет так:

function (e) {
  e.preventDefault();
  const { href } = e.target;
  // Do something with href
}
...
<a href="/foobar" onClick={clickHndl}>Go to Foobar</a>

Я надеюсь это помогает другим людям, таким как я, озадаченным не показанными ошибками!


Я не нашел ни одного из упомянутых вариантов, чтобы быть правильным или работать для меня, когда я пришел на эту страницу. Они дали мне идеи, чтобы проверить вещи, и я обнаружил, что это работает для меня.

dontGoToLink(e) {
  e.preventDefault();
 }

render() {
  return (<a href="test.com" onClick={this.dontGoToLink} />});
}

в таком контексте

function ActionLink() {
  function handleClick(e) {
    e.preventDefault();
    console.log('The link was clicked.');
  }

  return (
    <a href="#" onClick={handleClick}>
      Click me
    </a>
  );
}

Как вы можете видеть, вы должны вызвать preventDefault() явно. Я думаю, что этой docs, может быть полезно.