响应 onClick 并防止 Default()链接刷新/重定向?

我正在呈现一个链接与反应:

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

然后,在上面,我有 upvote 函数:

upvote: ->
// do stuff (ajax)

在链接之前,我在那个地方有 span,但是我需要切换到链接,这就是问题所在——每次我点击 .upvotes,页面都会刷新,到目前为止我已经尝试过了:

EventDefault ()-不工作。

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

Event. stop 繁殖()-不起作用。

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

返回假的-不工作。

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

我还在 index.html 中使用 jQuery 尝试了以上所有方法,但似乎都没有效果。我在这里应该做什么,我做错了什么?我已经检查了 event. type,它是 click,所以我想我应该能够避免重定向?

不好意思,说到反应,我还是个菜鸟。

谢谢!

207184 次浏览

React events are actually Synthetic Events, not Native Events. As it is written here:

Event delegation: React doesn't actually attach event handlers to the nodes themselves. When React starts up, it starts listening for all events at the top level using a single event listener. When a component is mounted or unmounted, the event handlers are simply added or removed from an internal mapping. When an event occurs, React knows how to dispatch it using this mapping. When there are no event handlers left in the mapping, React's event handlers are simple no-ops.

Try to use Use Event.stopImmediatePropagation:

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

This is because those handlers do not preserve scope. From react documentation: react documentation

Check the "no autobinding" section. You should write the handler like: onClick = () => {}

try bind(this) so your code looks like below --

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

or if you are writing in es6 react component in constructor you could do this

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


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


}

The Gist I found and works for me:

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

Credit for srph https://gist.github.com/srph/020b5c02dd489f30bfc59138b7c39b53

render: -> <a className="upvotes" onClick={(e) => {this.upvote(e); }}>upvote</a>

A full version of the solution will be wrapping the method upvotes inside onClick, passing e and use native 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>);
{

If you use checkbox

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

stopPropagation and stopImmediatePropagation won't be working.

Because you must using onClick={this.checkboxHandler}

If you are using React Router, I'd suggest looking into the react-router-bootstrap library which has a handy component LinkContainer. This component prevents default page reload so you don't have to deal with the event.

In your case it could look something like:

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


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

I've had some troubles with anchor tags and preventDefault in the past and I always forget what I'm doing wrong, so here's what I figured out.

The problem I often have is that I try to access the component's attributes by destructuring them directly as with other React components. This will not work, the page will reload, even with e.preventDefault():

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

It seems the destructuring causes an error (Cannot read property 'href' of undefined) that is not displayed to the console, probably due to the page complete reload. Since the function is in error, the preventDefault doesn't get called. If the href is #, the error is displayed properly since there's no actual reload.

I understand now that I can only access attributes as a second handler argument on custom React components, not on native HTML tags. So of course, to access an HTML tag attribute in an event, this would be the way:

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

I hope this helps other people like me puzzled by not shown errors!

I didn't find any of the mentioned options to be correct or work for me when I came to this page. They did give me ideas to test things out and I found that this worked for me.

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


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

In a context like this

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


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

As you can see, you have to call preventDefault() explicitly. I think that this docs, could be helpful.

A nice and simple option that worked for me was:

<a href="javascript: false" onClick={this.handlerName}>Click Me</a>

just like pure js do preventdefault : in class you should like this create a handler method :

handler(event) {
event.preventDefault();
console.log(event);
}

You should pass the event object when you call the method. e.g

const handleOnSubmit = (e) => {
console.log("in submit");
e.preventDefault();
};

you should call this like

<form onSubmit={(e) => handleOnSubmit(e)}>

where you should pass e as the event object