我正在使用react:
呈现链接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)
返回false - 无效。
upvote: (e) ->
// do stuff (ajax)
return false
我也在我的index.html中使用jQuery尝试了以上所有内容,但似乎没有任何效果。我该怎么做,我做错了什么?我已经检查了event.type并且它是click
所以我想我应该能够以某种方式避免重定向?
对不起,对于React来说,我是新手。
谢谢!
答案 0 :(得分:49)
该解决方案的完整版本将在onClick中包含方法upvotes,传递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>);
{
答案 1 :(得分:44)
React事件实际上是Synthetic Events,而不是Native Events。正如它写的here:
事件委托:React实际上并没有将事件处理程序附加到节点本身。当React启动时,它会使用单个事件侦听器开始侦听顶级的所有事件。安装或卸载组件时,只需在内部映射中添加或删除事件处理程序。当事件发生时,React知道如何使用此映射调度它。当映射中没有事件处理程序时,React的事件处理程序是简单的无操作。
尝试使用使用Event.stopImmediatePropagation
:
upvote: (e) ->
e.stopPropagation();
e.nativeEvent.stopImmediatePropagation();
答案 2 :(得分:14)
尝试绑定(this),以便您的代码如下所示 -
<a className="upvotes" onClick={this.upvote.bind(this)}>upvote</a>
或者如果您在构造函数中使用es6 react组件编写,则可以执行此操作
constructor(props){
super(props);
this.upvote = this.upvote.bind(this);
}
upvote(e){ // function upvote
e.preventDefault();
return false
}
答案 3 :(得分:6)
渲染: - &gt;
<a className="upvotes" onClick={(e) => {this.upvote(e); }}>upvote</a>
答案 4 :(得分:1)
我找到并为我工作的要点:
const expectedAction =
{
[CALL_API]: {
endpoint: '/collections/1/items',
method: 'POST',
body: "[1,2,3]",
types:
[
ADD_ITEMS,
{ type: ADD_ITEMS_SUCCESS },
ADD_ITEMS_FAIL
]
}
};
srph https://gist.github.com/srph/020b5c02dd489f30bfc59138b7c39b53的信用
答案 5 :(得分:0)
这是因为这些处理程序不保留范围。来自反应文档:react documentation
检查“无自动装订”部分。您应该编写处理程序,如:onClick =()=&gt; {}
答案 6 :(得分:0)
如果您使用复选框
<input
type='checkbox'
onChange={this.checkboxHandler}
/>
stopPropagation 和 stopImmediatePropagation 将无效。
因为您必须使用 onClick = {this.checkboxHandler}
答案 7 :(得分:0)
如果您使用的是React Router,我建议您查看一下有一个方便的组件LinkContainer的react-router-bootstrap库。此组件可防止默认页面重新加载,因此您无需处理该事件。
在你的情况下,它可能看起来像:
import { LinkContainer } from 'react-router-bootstrap';
<LinkContainer to={givePathHere}>
<span className="upvotes" onClick={this.upvote}>upvote</span>
</LinkContainer>
答案 8 :(得分:0)
过去我遇到过锚标记和preventDefault
的麻烦,我总是忘记我做错了什么,所以这就是我想到的。
我经常遇到的问题是我尝试通过直接解构来访问组件的属性,就像使用其他React组件一样。 这不起作用,页面将重新加载,即使使用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>
我希望这可以帮助像我这样的其他人因为没有显示错误而感到困惑!
答案 9 :(得分:0)
当我进入此页面时,我发现上述任何选项都不正确或不适合我。他们确实给了我一些测试的想法,我发现这对我有用。
dontGoToLink(e) {
e.preventDefault();
}
render() {
return (<a href="test.com" onClick={this.dontGoToLink} />});
}
答案 10 :(得分:0)
在这样的背景下
function ActionLink() {
function handleClick(e) {
e.preventDefault();
console.log('The link was clicked.');
}
return (
<a href="#" onClick={handleClick}>
Click me
</a>
);
}
如您所见,必须显式调用preventDefault()。 我认为this文档可能会有所帮助。
答案 11 :(得分:0)
对我有用的一个不错的简单选择是:
<a href="javascript: false" onClick={this.handlerName}>Click Me</a>
答案 12 :(得分:0)
这些方法都不适合我,所以我只用CSS解决了这个问题:
.upvotes:before {
content:"";
float: left;
width: 100%;
height: 100%;
position: absolute;
left: 0;
top: 0;
}
答案 13 :(得分:0)
就像纯 js 做 preventdefault : 在课堂上你应该像这样创建一个处理程序方法:
handler(event) {
event.preventDefault();
console.log(event);
}
答案 14 :(得分:0)
您应该在调用方法时传递事件对象。例如
const handleOnSubmit = (e) => {
console.log("in submit");
e.preventDefault();
};
你应该这样称呼它
<form onSubmit={(e) => handleOnSubmit(e)}>
您应该将 e 作为事件对象传递的位置