在 React 中禁用链接的更简单方法?

Posted

技术标签:

【中文标题】在 React 中禁用链接的更简单方法?【英文标题】:Easier way to to disable link in React? 【发布时间】:2016-11-14 06:22:53 【问题描述】:

我想在某些情况下禁用Link

render() 
    return (<li>this.props.canClick ? 
        <Link to="/">Test</Link> : 
        <a>Test</a>
    </li>)  

&lt;Link&gt;必须指定to,所以我不能禁用&lt;Link&gt;,我必须使用&lt;a&gt;

【问题讨论】:

【参考方案1】:

你可以设置链接的 onClick 属性:

render () 
  return(
    <li> 
     
      this.props.notClickable
      ? <Link to="/" className="disabledCursor" onClick= (event) => event.preventDefault() >Link</Link>
      : <Link to="/" className="notDisabled">Link</Link>
    
    </li>
  );
;

然后通过 css 使用 cursor 属性禁用悬停效果。

.disabledCursor  
  cursor: default;

我认为这应该可以解决问题?

【讨论】:

也许可以编辑您的答案并举例说明如何在可能的情况下禁用 CSS 中的悬停效果?这将使未来可能不知道如何操作的新用户更容易:) 是的,我的错。如果我是对的,这是一个解决方案。 :) 编辑了原帖。 这是禁用链接的有效方法,但您应该在代码中添加条件。 我认为你答案上的onClick方法需要有一个参数'e',比如,(e) => e.preventDefault() onClick= (event) => event.preventDefault() 对我有用【参考方案2】:

您的代码已经看起来相当干净和苗条。不知道为什么你想要一个“更简单”的方式。我会按照你的方式做。

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


使用指针事件

这可能是你能得到的最简短和甜蜜的:

render() 
    return (<li>
      <Link to="/" style=this.props.canClick ? pointerEvents: "none" : null>Test</Link>
    </li>)


使用 onClick 监听器

作为替代方案,您可以使用通用的&lt;a&gt; 标记并为条件添加onClick 侦听器。如果您有很多要控制其状态的链接,这可能更适合,因为您可以对所有链接使用相同的功能。

_handleClick = () => 
  if(this.props.canClick) 
    this.context.router.push("/");
  


render() 
   return (
     <li>
       <a onClick=this._handleClick>Test</a>);
     </li>
   );  

假设您使用的是context.router,上述内容将起作用。如果没有,请添加到您的课程中:

static contextTypes = 
  router: React.PropTypes.object


OP代码的更好版本

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

render() 
    return (<li>this.props.canClick ? 
        <Link to="/">Test</Link> : 
        <span>Test</span>
    </li>)  

【讨论】:

【参考方案3】:

一个好的解决方案是使用onClick()event 对象。只需在您的 jsx 中执行此操作:

<Link to='Everything' onClick=(e) => this._onClick(e)

在您的 _onClick 函数中:

_onClick = (e) => 
    e.preventDefault()

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>
        )
    

【讨论】:

【参考方案4】:

将 URL 设为 null 似乎可以解决问题:

const url = isDisabled ? null : 'http://www.***.com';

return (
  <a href=url>Click Me</a>
);

【讨论】:

【参考方案5】:

简而言之,在 React 中禁用链接更简单?

<Link to="#">Text</Link>

【讨论】:

【参考方案6】:

我认为您应该将 to=null 属性设置为禁用链接。

<Link to=null />

您的代码:

render() 
    return (<li>
        <Link to=this.props.canClick?'/goto-a-link':null >Test</Link>
    </li>)  

【讨论】:

这不会阻止文本看起来像一个链接。 这并没有禁用我应用中的链接。您有参考链接或文档吗? 设置&lt;Link=null&gt; 会返回以下错误:Warning: Failed prop type: The prop 'to' is marked as required in 'Link', but its value is 'null'.【参考方案7】:

# 中的to 属性传递给链接应该可以解决问题

您可以根据需要定义链接。如果你想禁用它,只需在 props.link 中传递 #

render() 
    return (<li><Link to=props.link>Test</Link></li>);  

【讨论】:

以上是关于在 React 中禁用链接的更简单方法?的主要内容,如果未能解决你的问题,请参考以下文章

在 QTreeView 中找到 QModelIndex 可见行的更简单方法

检查和测试 logrotate 配置的更简单方法

使用“in”在 Play Framework 1.x / JPA 中构建查询的更简单方法?

使用标签栏控制器实现导航栏项目的更简单方法?

了解类型参数是不是在 c# 2.0 中实现接口的更简单方法是啥?

在 Git 中仅暂存已修改文件的更简单方法(未删除)