2016-03-30 1 views
31

Я рендеринг связи с реагировать:React onClick и preventDefault() ссылка refresh/redirect?

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

Тогда, выше я имею upvote функции:

upvote: -> 
    // do stuff (ajax) 

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

event.preventDefault() - не работает.

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

event.stopPropagation() - не работает.

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

возвращение ложным - не работает.

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

Я также попытался все вышеперечисленное с помощью JQuery в моей index.html, но ничего не похоже на работу. Что мне делать и что я делаю неправильно? Я проверил event.type, и это click, поэтому я предполагаю, что мне удастся избежать перенаправления так или иначе?

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

Спасибо!

+0

вы пытаетесь использовать синтаксис es2015 для функций? – erichardson30

+0

Какие компоненты вы создаете? Stateless? createClass? – markthethomas

+0

Можете ли вы подтвердить, что onClick фактически нажимает 'upvote'? Это может быть проблемой контекста. – thangngoc89

ответ

25

Реагирующие события на самом деле являются синтетическими событиями, а не родными событиями. Как написано here:

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

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

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

это не работает на последней реакционной версии (15.2.1) – Kepro

+1

Спасибо! Он работает для меня для React 15.2.0 – Xander

0

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

Проверьте раздел «отсутствие автоматической привязки».Вы должны написать обработчик, как: OnClick =() => {}

14

попытка связать (это), так что ваш код выглядит, как показано ниже -

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

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

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

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

} 
+0

Это не имеет значения. Вы получаете upvotes, потому что люди имеют это в своем обработчике событий и имеют совершенно другую проблему. – Dimitar

0

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

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

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

+1

Могу ли я предлагать не использовать 'onClick' в качестве переданного имени функции функции, а что-то вроде' handleClick' вместо? Это запутанно, другие менее опытные разработчики могут подумать, что это действительно связанное событие с компонентом, в то время как это не так. Кроме того, при этом вы создаете новую функцию каждый раз, когда компонент повторно отображает, даже если он получает те же реквизиты. Это считается плохой практикой. – elQueFaltaba

6

оказывают: -> <a className="upvotes" onClick={(e) => {this.upvote(e); }}>upvote</a>

10

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

upvotes(e){ 
    //do something... 
    e.preventDefault(); 
} 

render(){ 
    return (<a type="simpleQuery" onClick={(e) => {this.upvotes(e)}}> 
     upvote 
    </a>); 
{ 
+1

Должен быть принятый ответ. –

+0

Да, это должен быть принятый ответ. –

+0

Это было очень чисто для моего использования, спасибо. –

0

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

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

stopPropagation и stopImmediatePropagation не будет работать.

Потому что вы должны с помощью OnClick = {this.checkboxHandler}