rog*_*ger 5 javascript href reactjs react-router
我想Link
在某些条件下禁用:
render() {
return (<li>{this.props.canClick ?
<Link to="/">Test</Link> :
<a>Test</a>}
</li>)
}
Run Code Online (Sandbox Code Playgroud)
<Link>
必须指定to
,所以我不能禁用<Link>
,我必须使用<a>
一个好的解决方案是使用onClick()
对象event
。只需在你的 jsx 中执行此操作:
<Link to='Everything' onClick={(e) => this._onClick(e)}
Run Code Online (Sandbox Code Playgroud)
在你的_onClick
函数中:
_onClick = (e) => {
e.preventDefault()
}
Run Code Online (Sandbox Code Playgroud)
React 中的完整示例:
import React, { Component } from 'react'
import {Link} from 'react-router-dom'
export default class List extends Component {
_onClick = (e) => {
e.preventDefault()
}
render(){
return(
<div className='link-container'>
<Link to='Something' onClick={e => this._onClick(e)}
</div>
)
}
}
Run Code Online (Sandbox Code Playgroud)
小智 7
你可以设置链接的onClick属性:
render () {
return(
<li>
{
this.props.notClickable
? <Link to="/" className="disabledCursor" onClick={ (event) => event.preventDefault() }>Link</Link>
: <Link to="/" className="notDisabled">Link</Link>
}
</li>
);
};
Run Code Online (Sandbox Code Playgroud)
然后使用cursor属性通过css禁用悬停效果.
.disabledCursor {
cursor: default;
}
Run Code Online (Sandbox Code Playgroud)
我认为应该这样做?
您的代码已经看起来非常干净和精简。不知道为什么你想要一个“更简单”的方式。我会完全按照你的方式去做。
但是,这里有一些替代方案:
这个可能和你能得到的一样简短和甜蜜:
render() {
return (<li>
<Link to="/" style={this.props.canClick ? {pointerEvents: "none"} : null}>Test</Link>
</li>)
}
Run Code Online (Sandbox Code Playgroud)
作为替代方案,您可以使用通用<a>
标记并onClick
为条件添加侦听器。如果您有很多要控制其状态的链接,这可能更适合,因为您可以对所有链接使用相同的功能。
_handleClick = () => {
if(this.props.canClick) {
this.context.router.push("/");
}
}
render() {
return (
<li>
<a onClick={this._handleClick}>Test</a>});
</li>
);
}
Run Code Online (Sandbox Code Playgroud)
假设您使用的是context.router
. 如果没有,请添加到您的课程中:
static contextTypes = {
router: React.PropTypes.object
}
Run Code Online (Sandbox Code Playgroud)
正如我上面提到的,我仍然认为你的方法是“最好的”。您可以用跨度替换锚标记,以摆脱禁用链接的样式(例如指针光标、悬停效果等)。
render() {
return (<li>{this.props.canClick ?
<Link to="/">Test</Link> :
<span>Test</span>}
</li>)
}
Run Code Online (Sandbox Code Playgroud)