当前位置: 首页 > 面试题库 >

使用React Hooks的可重用下拉菜单

董元徽
2023-03-14
问题内容

正如我从React文档中获得的那样,使用钩子不需要大量的代码重构,并且可以轻松地将其包含在现有代码中。我想使可重用的下拉列表,从反应组件渲染方法调用。这是我的代码:

//navigation.js
import {DropdownToggler} from './dropdown.js';
export class ErrorTriangle extends Component {
   render(){
     return(
        {DropdownToggler({uiElement: {
            toggler: <img src={MyImg}/>,
            field: <div className={'errorMessage'}>
                       <p>Dropdown content</p>
                   </div >
        }})
       }
     )
   }
}

//dropdown.js
import React, {useEffect, useRef, useState} from "react";
import {store} from "../api/redux/store";

const DropdownToggler = (props) => {
    const myRef = useRef(null);
    const [showField, setShow] = useState(false);
    const isMobile = store.getState().isMobile;

   const remove = (e) => {
    e.stopPropagation();

    if (myRef && myRef.current.contains(e.target)) {
        return
    }
    setShow(false);
    if (isMobile===true) {
        document.removeEventListener('touchend', remove, false)
    } else {
        document.removeEventListener('mouseup', remove, false)
    }
};

const show = (e) => {
    e.stopPropagation();
    if (showField) {
        return
    }
    setShow(true);
    if (isMobile===true) {
        document.addEventListener('touchend', remove, false)
    } else {
        document.addEventListener('mouseup', remove, false)
    }
};

return (
    <>
        {React.cloneElement(props.uiElement.toggler, {
            onTouchEnd: (e) => show(e),
            onMouseUp: isMobile ? null : (e) => show(e)
        })}

        {showField ? React.cloneElement(props.uiElement.field, {ref: node => myRef.current= node}) : null}
    </>
)
};
export {DropdownToggler};

并得到错误:只能在函数组件的主体内部调用挂钩。我已经检查了有关此问题的现有信息:

  1. react-hot-loader版本是4.8.0
  2. 我的react和react-dom是同一版本16.8.4;
  3. 我的babel-config包含:
        'use strict';

    module.exports = {
       presets: ['@babel/preset-env', '@babel/preset-react'],
       plugins: ["@babel/plugin-proposal-class-properties", "jsx-control-statements", "react-hot-loader/babel"],
    };

也许问题是我违反了钩子规则https://reactjs.org/warnings/invalid-hook-call-
warning.html
。将不胜感激详细的解释(示例)或想法。


问题答案:

更改

export class ErrorTriangle extends Component {
   render(){
     return(
        {DropdownToggler({uiElement: {
            toggler: <img src={MyImg}/>,
            field: <div className={'errorMessage'}>
                       <p>Dropdown content</p>
                   </div >
        }})
       }
     )
   }
}

export function ErrorTriangle (props) {
     return(
        {DropdownToggler({uiElement: {
            toggler: <img src={MyImg}/>,
            field: <div className={'errorMessage'}>
                       <p>Dropdown content</p>
                   </div >
        }})
       }
     )
}

要么

更改

{DropdownToggler({uiElement: {
            toggler: <img src={MyImg}/>,
            field: <div className={'errorMessage'}>
                       <p>Dropdown content</p>
                   </div >
        }})
       }

{<DropdownToggler uiElement={{
    toggler: <img src={MyImg}/>,
    field: <div className={'errorMessage'}>
                <p>Dropdown content</p>
            </div >
  }}/>
}

说明

简而言之,如果您使用的是类,则应像这样<Component />而不是普通的函数那样调用组件函数,Component()或者可以从使用类更改为使用组件函数



 类似资料:
  • 问题内容: 嗨,我想使用Ajax在下拉菜单上管理数据。 数据库字段: 1.id 2.名称 3.部门 myDesgin.php 1.如果我选择了一个下拉菜单,要更改另一个下拉菜单,则取决于使用Ajax选择的值。 2.是否有可用的代码,如果我选择一个下拉菜单,它将转到另一个子窗口并使用 Ajax 以表格式(如报告)显示数据。 提前致谢。 请给我示例代码,因为我是ajax的初学者,如果有人提供带有代码的

  • 问题内容: 我打算根据其他下拉菜单的选择使用AJAX填充下拉框。我遵循了使用位于此处的jQuery的教程-http: //remysharp.com/2007/01/20/auto-populating-select-boxes-using-jquery- ajax/ ,并在选择框名称中更改了选择框ID名称。在脚本中。 当主复选框的值发生更改时,将发送ajax并返回如下: 这与教程代码中返回的JS

  • 本文向大家介绍bootstrap下拉菜单使用方法解析,包括了bootstrap下拉菜单使用方法解析的使用技巧和注意事项,需要的朋友参考一下 Bootstrap框架中的下拉菜单组件是一个独立的组件,具体来学习一下 下拉菜单(Dropdown) ☑ LESS版本:对应的源文件dropdowns.less 下拉菜单–属性声明式方法(一) ☑ 被点击的菜单项链接或按钮需要添加自定义属性 data-togg

  • 问题内容: 我需要从下拉菜单中选择一个元素。 例如: 1)首先,我必须单击它。我这样做: 2)之后,我必须选择一个好的元素,让我们说Mango。 我试图这样做,但是没有用。 问题答案: 除非你的点击触发了某种Ajax调用来填充列表,否则你实际上不需要执行该点击。 只需找到元素,然后枚举选项,然后选择所需的选项即可。 这是一个例子:

  • 问题内容: 我无法正常使用下拉菜单。我可以使导航栏完美显示,但是当我单击“ Dropdown”(二者之一)时,它不会显示下拉菜单。我曾尝试查看有关此问题的其他文章,但没有什么能解决每个人的问题。我直接从bootstrap网站复制了源代码,但似乎无法在我的机器上使用它。谁有想法?我盯着它看了一个小时,似乎无法弄清楚问题出在哪里。 问题答案: 也许尝试 看看是否行得通。

  • 你好,我正在使用selenium,并且已经成功地设置了id历史的文本字段,但是无法从