更容易在React中禁用链接的方法?

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>

Mil*_*ari 9

一个好的解决方案是使用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)

我认为应该这样做?


Chr*_*ris 6

您的代码已经看起来非常干净和精简。不知道为什么你想要一个“更简单”的方式。我会完全按照你的方式去做。

但是,这里有一些替代方案:


使用指针事件

这个可能和你能得到的一样简短和甜蜜:

render() {
    return (<li>
      <Link to="/" style={this.props.canClick ? {pointerEvents: "none"} : null}>Test</Link>
    </li>)
}
Run Code Online (Sandbox Code Playgroud)

使用 onClick 侦听器

作为替代方案,您可以使用通用<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)

更好的 OP 代码版本

正如我上面提到的,我仍然认为你的方法是“最好的”。您可以用跨度替换锚标记,以摆脱禁用链接的样式(例如指针光标、悬停效果等)。

render() {
    return (<li>{this.props.canClick ? 
        <Link to="/">Test</Link> : 
        <span>Test</span>}
    </li>)  
}
Run Code Online (Sandbox Code Playgroud)