我在我的reactjs应用程序中有这个:
import Link from 'react-router/lib/Link'
尝试禁用此链接但这没有达到预期的效果:
<Link disable={true}/>
它只是让它变得不可见。如何禁用(基于条件)reactjs Link?
答案 0 :(得分:10)
在react-router包含许多问题,链接组件中没有支持已禁用属性,因此您可以尝试使用此issue:
使用preventDefault()
处理onClick事件。
/* YourComponent.js */
class YourComponent extends React.Component {
render() {
return (
<Link onClick={e => e.preventDefault()} />
);
}
}
pointer-events
属性/* YourComponent.js */
class YourComponent extends React.Component {
render() {
return (
<Link className='disabled-link' />
);
}
}
/* css file */
.disable-link {
pointer-events: none;
}
或者您可以使用内嵌样式
/* YourComponent.js */
class YourComponent extends React.Component {
render() {
return (
<Link style={{ pointerEvents: 'none' }} />
);
}
}
我使用的是方法2,在我的项目中对我来说更清楚。
答案 1 :(得分:0)
您可以根据某些状态有条件地呈现看起来像禁用链接的内容。
例如在打字稿中:
export interface Location {
pathname: string;
search: string;
state: any;
hash: string;
key ?: string;
}
interface LinkProps {
to: string | Location
replace?:boolean
}
interface DisableLinkProps extends LinkProps {
enabled: boolean
linkText:string
}
export class DisableLink extends React.Component<DisableLinkProps, undefined> {
render() {
var element= this.props.enabled ? <span className="disableLinkDisabled">{this.props.linkText}</span> : <Link to={this.props.to} replace={this.props.replace}>{this.props.linkText}</Link>
return element;
}
}
interface DemoClassState {
linkEnabled:boolean
}
export class DemoClass extends React.Component<undefined, DemoClassState> {
constructor(props) {
super(props);
this.state = { linkEnabled:false }
}
toggleLinkEnabled = () => {
this.setState((prevState) => {
return {
linkEnabled: !prevState.linkEnabled
}
});
}
render() {
return <div>
<DisableLink enabled={this.state.linkEnabled} to="/somewhere" linkText="Some link" />
<button onClick={this.toggleLinkEnabled}>Toggle link enabled</button>
</div>
}
}
答案 2 :(得分:0)
这实际上有点棘手。甚至有些不明智的建议。
我选择的路线(没有双关语)是不呈现链接。
我从react-router的Link
组成了一个新组件。
import React from 'react';
import { Link } from 'react-router-dom';
export default function ToggleableLink(props) {
const { disabled, ...rest } = props;
return disabled ? props.children : <Link {...rest}>{props.children}</Link>;
}
用法:
<ToggleableLink disabled={!showTheLink}>Foobar</ToggleableLink>
答案 3 :(得分:0)
另一个选择是让函数根据某些条件返回2个不同的链接。...
const fnSomePath = () =>{
return somecondition ? `www.abc.xyz` : `#`
}
然后调用正在使用链接的函数:
<ListGroupItem>
<NavLink to={{pathname: fnSomePath()}}>
TEXT
</NavLInk>
</ListGroupItem>