【问题标题】:Is it okay to call onClick on an anchor tag in ReactJS可以在 ReactJS 中的锚标记上调用 onClick
【发布时间】:2019-01-09 14:04:55
【问题描述】:

伙计们,

我的组件中有一个锚标记,如下所示:

class myComponent {

    render () {
        return (
            <a href="/link/to/other/page">Link</a>
        );
    }
}

我想在用户点击此标签时调用分析函数,如下所示:

analytics.submitData({event: "page redirection"});

请注意,我没有设置状态或调用任何反应函数。 如果我只是在锚标签的 onClick 事件上调用一个函数可以吗?像这样的:

anchorClickHandler() {
    analytics.submitData({event: "page redirection"});
}

<a href="/link/to/other/page" onClick={this.anchorClickHandler.bind(this)}>Link</a>

有没有更好的方法来做到这一点? 因为一旦发生重定向,组件卸载就会被调用,我不确定我的 onClick 处理程序是否会被调用。我是不是想错了?

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    您应该使用 span 创建自己的元素,例如:

    <span className='sub' onClick={this.anchorClickHandler}>Link</span>
    

    使用 CSS 对其应用相同的样式(或内联 CSS,如果这是一个快速修复):

    .sub {
        cursor: pointer,
        color: blue
    }
    

    然后在您向我们展示的功能中更改您的页面:

    anchorClickHandler = event => {
        analytics.submitData({event: "page redirection"});
        // Navigate to /link/to/other/page
        window.location.href = '/link/to/other/page';
    }
    

    【讨论】:

    • 我将使用this.history.push() 而不是window.location.href = //..。感谢您对此的回答。这正是我需要知道的。
    • 好吧,这两个功能都应该适合你。很高兴我能帮上忙
    • 您不应将span 元素用于链接,因为通过键盘导航的人无法访问它。
    【解决方案2】:

    在锚标签上调用 onClick 是可以的。为了防止点击锚标签时重定向,你只需调用 event.preventDefault()

    anchorClickHandler(event) {
        event.preventDefault()
        analytics.submitData({event: "page redirection"});
        window.location.href = event.target.getAttribute('href');
    }
    

    【讨论】:

    • 我同意,但我认为我需要一个更好的解决方案来解决window.location.href = //..
    • “更好”是什么意思?
    • 可能是history.push 更好:))
    • @GiangLe 非常感谢!这有帮助。
    【解决方案3】:

    锚标签经常与 onclick 事件一起被滥用,通过将 href 设置为“#”或“javascript:void(0)”来防止页面刷新来创建伪按钮。

    在复制/拖动链接、在新选项卡/窗口中打开链接、添加书签以及 JavaScript 仍在下载、出错或被禁用时,这些值会导致意外行为。这也会向辅助技术(例如屏幕阅读器)传达不正确的语义。在这些情况下,建议改用&lt;button&gt;。一般来说,您应该只使用锚点进行导航,并使用正确的 URL。

    【讨论】:

    • 你能详细说明原因吗?
    • 这是完全错误的,HTML 不关心你在元素中放置的属性的顺序
    • @Treycos 感谢您的指出。这个答案让我更加困惑。
    • 这是一个完全不同的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 2019-10-06
    • 2015-07-30
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多