在reactjs中切换下拉菜单

2023-12-29

我的导航栏上有一个简单的下拉菜单的以下代码:https://jsfiddle.net/jL3yyk98/10/ https://jsfiddle.net/jL3yyk98/10/

索引.html

<div id="menu-button"></div>

导航菜单.js

var NavMenu = React.createClass({
    getDefaultProps: function()
    {
        return {
            isOpen: false
        };
    },

    render: function()
    {
        if (this.props.isOpen)
        {
            return (
                <div className="dropdown">
                    <ul>
                        <li><a href="#">News</a></li>
                        <li><a href="#">About</a></li>
                        <li><a href="#">Guidelines</a></li>
                        <li><a href="#">Exchange</a></li>
                        <li><a href="#">Forum</a></li>
                    </ul>
                </div>
            );
        }
        return null;
    }
});

NavMenuButton.js

var NavMenuButton = React.createClass({

    getInitialState: function()
    {
        return {
            isOpen: false
        };
    },

    toggleMenu: function(e)
    {
        e.stopPropagation();
        this.setState({isOpen: !this.state.isOpen});
    },

    onClose: function()
    {
        this.setState({isOpen: false});
    },

    componentDidMount: function ()
    {
        document.body.addEventListener('click', this.onClose);
    },

    componentWillUnmount: function ()
    {
        document.body.removeEventListener('click', this.onClose);
    },

    render: function()
    {
        return (
            <div>
                <a onClick={this.toggleMenu} href="#">Menu</a>
                <NavMenu isOpen={this.state.isOpen} />
            </div>
        );
    }

});

React.render(<NavMenuButton />, document.getElementById('menu-button'));

据我所知,根据我当前的代码,当用户单击菜单按钮关闭菜单时,将会调用toggleMenu 方法和onClose 方法(因为它们也有效地单击了主体);并且首先调用 onClose 方法,这意味着状态设置为 false,但随后调用toggleMenu 方法并将其设置回 true。为什么会这样,如何修复它以便单击菜单按钮可以切换菜单and单击正文隐藏菜单?

如果这种方法看起来错误,我应该使用什么方法?我对反应还很陌生,所以我仍在学习什么发生在哪里以及为什么发生。

另外,我不能使用全身 div 作为解决方案,它需要是一个典型的下拉菜单;因此,如果用户想与页面的其他部分进行交互(也许单击链接),那么他们就可以做到这一点。


您的问题是,单击链接也会调用正文单击侦听器。这意味着您的状态将从:

  1. 点击链接
  2. 单击主体上的侦听器称为
  3. this.state.open 设置为 false
  4. 使用 this.state.open false 调用渲染
  5. 单击名为的链接上的侦听器
  6. this.state.open 设置为 true
  7. 使用 this.state.open true 调用渲染

e.stopPropagation() 在 React 中不起作用。一种解决方法是:

handleBodyClick: function(e)
{
    if (e.target.nodeName !== 'A') {
       this.setState({isOpen: false});
    }
},

另一种方法(也是更好的方法)是让点击监听器不在 body 上,而是在 div 上,并使其尽可能大(基本上与 body 大小相同)。

这是一个将点击绑定到 div 而不是 body 的示例: https://jsfiddle.net/jL3yyk98/ https://jsfiddle.net/jL3yyk98/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在reactjs中切换下拉菜单 的相关文章

随机推荐

  • 呼叫 IVR 时动词记录超时的问题

    我们正在尝试使用 Twilio 为这些 IVR 创建自动化测试框架 我们从 Twilio 向 IVR 发出出站呼叫 使用动词 Say Play 与 IVR 进行交互 并使用 Record 来捕获 IVR 所说的内容 然后我们将其转录并做出断
  • C# 二进制数据转换为字符串

    这是交易 我找到了一个源代码并对其进行了一些更改 以便我可以从 com6 上的接收器检索数据 我收到的数据是二进制的 我想要的是将其转换为字符串 以便我可以剪切字符串的一部分并单独解码它们 我怎样才能做到这一点 源代码如下 using Sy
  • 在 Android 上将 mp3 转换为 wav

    关于 wav 到 mp3 的反向转换似乎有很多问题 但没有一个问题是相反的 我的情况是我可以使用隐写术将数据嵌入到 wav 文件中 我可以将它们转换为 ogg 并返回 隐写术与格式无关 并且可以在格式转换后继续存在 我现在想做的是构建 Au
  • 如何加载libandroid_runtime

    我正在开发一个项目 该项目被编译成 JAR 然后使用 javaws 进行部署 在我的一门课程中 我需要加载设备上目录 system lib 中找到的 libandroid runtime so 我该怎么做呢 System load liba
  • 当 alpha =0 时画布会损坏 RGB

    我正在使用 HTML 画布来投影图像 当我尝试操纵图像数据的 Alpha 通道时 我发现只要将其归零 像素中的其他值就会发生变化 即使设置为较低的数字 它们似乎也会发生变化 从控制台执行此操作 canvas document getElem
  • CXF BusException 命名空间没有 DestinationFactory http://cxf.apache.org/transports/http

    我正在尝试支持 basic cxf rs example 1 但使用我自己的服务impl这更简单 我的所有方法都返回字符串 当我尝试运行该服务器时 出现此异常 我建立了一个干净的项目 所以我要重新开始 大师 pom http maven a
  • StemDocument R 文本挖掘

    我的数据是一个txt文件 如下所示 字数 doc概述1客户1 store 1 marge 1 price 2 stock 2经济学2 文档的编号已排序 从最小到最大 现在我想要每个文档属于该文档的所有单词 现在它们站在一列中 但我想要文本文
  • 我应该使用一个大的 SQL Select 语句还是几个小的 SQL Select 语句?

    我正在使用从 MySQL 发送的数据构建一个 PHP 页面 是不是更好有 1 SELECT具有 4 个表连接的查询 或者 4 small SELECT没有表连接的查询 我确实从 ID 中选择 哪种方法更快 每种方法的优缺点是什么 我只需要每
  • 导入二维数据的 Python 和内存高效方法

    我正在尝试运行一些使用 Python 分析数据的脚本 我很快就对它占用的 RAM 空间感到惊讶 我的脚本从文件中读取两列整数 它通过以下方式导入它 import numpy as N from sys import argv infile
  • Antd - 有没有办法改变卡片标题的背景颜色?

    通过添加 style 属性 我只能更改 Card 组件主体部分的颜色 我怎样才能更改标题部分
  • 我是否需要内存屏障来访问已完成的线程修改的内存?

    以下为 C 术语 我有一个线程 A 和线程 B 共享对整数值 P 的访问 线程 A 初始化该值并在运行时更新它 然后线程A完成 线程 B 等待线程 A 完成 标准操作系统 API 调用 无论使用什么操作系统 并想要读取 P 线程 B 是否需
  • MySQL 更新并从另一个表中选择

    我有3张桌子 Kommuner 和 Fylker 公司 公司表有一个空字段forretningsadresse fylke但另一个领域forretningsadresse kommune有一个值 所以基本上 我需要填写forretnings
  • 表与两个相关表的总和

    我在这里提出这个 我确信是 简单的问题 我不知道如何解决 我有这个架构 有了这个数据 我的预期结果是 对于 约翰 纳什 PERSON NAME TOTAL FRUIT TOTAL COOKIE JOHN NASH 10 38 对于 奥斯卡
  • 包装一个对象

    我有一个对象 它有一堆公共属性 没有 getter 和 setter 坏的 因此 我创建了一个包含属性的类 并为它们创建了 getter 和 setter 我的计划是将对象包装在我的类中 因此这意味着不能直接访问属性 我有点不确定该怎么做
  • 如何在 Web Api 操作中锁定长异步调用?

    我有这样的场景 我有一个 WebApi 和一个端点 触发时会执行大量工作 大约 2 5 分钟 这是一个具有副作用的 POST 端点 我想限制执行 以便如果向此端点发送 2 个请求 不应该发生 但安全总比遗憾更好 其中一个请求将必须等待以避免
  • Android手机与穿戴模块之间共享文件

    几个月前 我最初只使用移动模块开始我的项目 现在我也有兴趣为可穿戴设备配置我的应用程序 也就是说 我的所有文件 Java XML drawables 等 都在移动模块中 所以我是否需要将我想要在移动模块和可穿戴模块之间共享的所有文件传输到新
  • 如何获取 Tensorflow seq2seq 嵌入输出

    我正在尝试使用张量流训练序列到序列模型 并一直在查看他们的示例代码 我希望能够访问编码器创建的向量嵌入 因为它们似乎具有一些有趣的属性 然而 我真的不清楚这是怎么回事 在单词的向量表示示例中 他们详细讨论了这些嵌入的用途 但似乎没有提供访问
  • 如何在开发机器上使用ansible模板本地创建文件

    我从 ansible 开始 正在寻找一种方法来使用 ansible 剧本在服务器和本地环境上创建样板项目 我想在本地使用 ansible 模板来创建一些通用文件 但是我如何使用ansible在本地执行某些操作呢 我读了一些 local ac
  • SSRS 报告每个参数值的重复表

    大家对这里的一般性问题感到抱歉 但我一直在互联网上查找 但找不到解决方案 我有一份 SSRS 报告 在运行之前用户必须输入一个参数 Location 在查询中 指定仅返回该位置匹配的结果 IE where Company location
  • 在reactjs中切换下拉菜单

    我的导航栏上有一个简单的下拉菜单的以下代码 https jsfiddle net jL3yyk98 10 https jsfiddle net jL3yyk98 10 索引 html div div 导航菜单 js var NavMenu