react-router:如果激活<Link>,如何禁用它?

Pip*_*ipo 25 javascript reactjs react-router

<Link>如果其URL已经激活,如何禁用react-router?例如,如果我的URL在点击时不会改变<Link>我想要阻止点击或渲染<span>而不是a <Link>.

我想到的唯一解决方案是使用activeClassName(或activeStyle)和设置pointer-events: none;,但我更喜欢使用在IE9和IE10中运行的解决方案.

Den*_*nov 16

您可以使用CSS的pointer-events属性.它适用于更多浏览器.例如你编码:

class Foo extends React.Component {
  render() {
    return (
      <Link to='/bar' className='disabled-link'>Bar</Link>
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

和CSS:

.disabled-link {
  pointer-events: none;
}
Run Code Online (Sandbox Code Playgroud)

链接:

如何禁用HTML链接附答案同时使用建议disabled,并pointer-events: none获得最大的浏览器的支持.

a[disabled] {
    pointer-events: none;
}
Run Code Online (Sandbox Code Playgroud)

链接到源:如何禁用链接

  • 值得注意的是,“指针事件”技术只会禁用指针设备的点击。仍然可以使用键盘选择并激活链接。 (12认同)

dan*_*lie 12

我不会问为什么你会想要这种行为,但我想你可以包装<Link />你自己的自定义链接组件.

<MyLink to="/foo/bar" linktext="Maybe a link maybe a span" route={this.props.route} />

class MyLink extends Component {
    render () {
        if(this.props.route === this.props.to){
            return <span>{this.props.linktext}</span>
        }
        return <Link to={this.props.to}>{this.props.linktext}</Link>
    }
}
Run Code Online (Sandbox Code Playgroud)

(ES6,但你可能会得到一般的想法...)

  • 我明白为什么那会有用.如果<span>标记替换为<b>或<strong>标记,则单击链接时链接将变为面包屑列表中的粗体项.单击另一个痕迹导航链接将重新显示上一次单击的<Link>标记,并将粗体+禁用链接状态应用于新单击的链接. (4认同)
  • 我还建议使用`{this.props.children}`而不是添加新的props`linktext`.这样,您就可以将此组件用作普通的`Link`组件. (3认同)

nbe*_*hat 6

另一种可能性是,如果已经在同一路径上单击,则禁用单击事件。这是适用于react-router v4的解决方案。

import React, { Component } from 'react';
import { Link, withRouter } from 'react-router-dom';

class SafeLink extends Component {
    onClick(event){
        if(this.props.to === this.props.history.location.pathname){
            event.preventDefault();
        }

        // Ensure that if we passed another onClick method as props, it will be called too
        if(this.props.onClick){
            this.props.onClick();
        }
    }

    render() {
        const { children, onClick, ...other } = this.props;
        return <Link onClick={this.onClick.bind(this)} {...other}>{children}</Link>
    }
}

export default withRouter(SafeLink);
Run Code Online (Sandbox Code Playgroud)

然后,您可以将链接用作(其他任何道具Link都可以使用):

<SafeLink className="some_class" to="/some_route">Link text</SafeLink>
Run Code Online (Sandbox Code Playgroud)


小智 5

这对我有用:

<Link to={isActive ? '/link-to-route' : '#'} />
Run Code Online (Sandbox Code Playgroud)

  • 它将移至页面顶部。`href="#"` 对于用户来说确实很烦人。 (15认同)