微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

自定义钩子和级联下拉菜单

如何解决自定义钩子和级联下拉菜单

我是新手,我正在边做边学。现在我正在使用自定义 Hook 在组件之间共享逻辑。

这里是自定义 Hook 内部的逻辑

const useDropDownLogic = () => {
    const { menu } = useContext(MenuContext)
    const brand = [...new Set(menu.map(i => i.brand))]
    const [category,setCategory] = useState([])

    const brandChange = (e) => {
        const { type,textContent } = e.target
        setCategory([...new Set(menu.filter(i => i.[type] == textContent).map(i => i.category))])}

    return {
        brandChange,brand,category
    }
}
 
export default useDropDownLogic;

这是使用自定义 Hook 的第一个组件

const DropDownBrand = () => {
  const {brandChange,brand} = useDropDownLogic();
  const dropdownRef = useRef(null);
  const [isActive,setIsActive] = useDetectOutsideClick(dropdownRef,false);
  const onClick = () => setIsActive(!isActive)

  return (
    <div id="dropdownbrand">
      <div className="menu-container menu-brand">
        <label className = 'nav-label'>Select a Brand</label>
        <button onClick={onClick} className="menu-trigger brand-btn">
        <i className="fas fa-chevron-down fa-2x drop-arrow"></i>
        </button>
        <nav
          ref={dropdownRef}
          className={`drop-menu ${isActive ? "active" : "inactive"}`}
        >
          <ul>
          {brand.map((i) => (<li key={nanoid()} type = 'brand' value={i} onClick = {(e) => brandChange(e)}>{i}</li>))}
          </ul>
        </nav>
      </div>
    </div>
  );
};

导出认的 DropDownBrand;

这里是第二个

    const DropDownCategory = () => {
  const { category } = useDropDownLogic()
  const dropdownRef = useRef(null);
  const [isActive,false);
  const onClick = () => setIsActive(!isActive)

console.log(category);
  return (
    <div id="dropcategory">
      <div className="menu-container menu-brand">
        <label className = 'nav-label'>Select a Brand</label>
        <button onClick={onClick} className="menu-trigger brand-btn">
        <i className="fas fa-chevron-down fa-2x drop-arrow"></i>
        </button>
        <nav
          ref={dropdownRef}
          className={`drop-menu ${isActive ? "active" : "inactive"}`}
        >
          <ul>
          {category.map((i) => (<li key={nanoid()} type = 'category'>{i}</li>))}
          </ul>
        </nav>
      </div>
    </div>
  );
};

export default DropDownCategory;

基本上我可以填充第一个下拉列表但不能填充第二个。我不明白为什么类别状态没有更新到 DropDownCategory 组件中

对我做错了什么有任何暗示吗?

非常感谢

解决方法

我明白了,

我正在改变方法。将状态移动到父组件并传递函数来处理点击事件。然后在 Parent 上,我将更新 dstate 并将其作为道具传递给孩子。 Nyhting 还没有分享,但它会来

,

钩子中没有持久化状态,它是一种共享逻辑和功能的方式。因为你正在定义

const [category,setCategory] = useState([])

在钩子内部,每次调用钩子时都会定义它。在您的情况下,dropdowncategory 和 dropdownbrand 都有自己的个人状态变量,称为类别。

要解决此问题,请在菜单上下文(或任何其他上下文)内定义 [category,setCategory] ​​并将值拉入您的钩子中。这样 useDropDownLogic() 的所有实例都与全局上下文值相关联。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?