cnzhuanyong 2023-08-17 20:19 采纳率: 38.9%
浏览 5
已结题

如何让 MenuList 下,每个 MenuItem 的宽度,以最长的那一个为准?

如果让每项 MenuItem 宽度往外撑,那么恐怕会很长,而我们希望尽可能短,少占用空间。
若改成每项 MenuItem 宽度往内缩,width=‘fit-content’,那么右边的 ”快捷键文本“ 就不会右对齐,字少的会更短。

这种需求描述就是,默认宽度内缩,但是短的需要补齐最长的那个。

现在的代码是:

  return (
    <div className={menuItemMergeStyle + " " + className} style={{ ...style }}>
      {menuContext.hasCheckmark && checkMarkNode}
      {menuContext.hasIcon && iconNode}
      {contentNode}
      {shortcutNode}
      {menuContext.hasSubmenu && submenuIndicatorNode}
    </div>
  );


对齐问题,我现在有个不优雅的解决方法,
让 content 以及左边的,装在 leftContainer,样式 left = 0,
让 shortcut 以及右边的,装在 rightContainer,样式 right = 0。

但宽度问题 内缩 和 外撑 都无法解决。


不知道这样合适吗?
MenuItem 用 ref 放在 div,然后 获取 div 实际宽度,上传 MenuListContext 以便共享,上传前先对比,如果小于就不上传了,反而下载使用其他 MenuItem 的 div 较长的那个值。

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-08-17 22:23
    关注

    【以下回答由 GPT 生成】

    对于这个问题,使用动态计算 MenuList 下每个 MenuItem 宽度的方法是可行的。以下是实现这个方法的步骤:

    1. 首先,在 MenuList 组件中创建一个新的 Context,并定义一个 state 变量 maxWidth 来存储最长宽度。代码示例如下:
    import React, { createContext, useState } from 'react';
    
    export const MenuListContext = createContext({
      maxWidth: 0,
      setMaxWidth: () => {},
    });
    
    const MenuList = ({ children }) => {
      const [maxWidth, setMaxWidth] = useState(0);
    
      return (
        <div>
          <MenuListContext.Provider value={{ maxWidth, setMaxWidth }}>
            {children}
          </MenuListContext.Provider>
        </div>
      );
    };
    
    export default MenuList;
    
    1. 在 MenuItem 组件中,使用 useRef 创建一个变量 menuItemRef 来获取 MenuItem 的实际宽度,并使用 useContext 获取 MenuListContext。更新代码如下:
    import React, { useRef, useContext, useEffect } from 'react';
    import { MenuListContext } from './MenuList';
    
    const MenuItem = ({ children }) => {
      const menuItemRef = useRef(null);
      const { maxWidth, setMaxWidth } = useContext(MenuListContext);
    
      useEffect(() => {
        if (menuItemRef.current.offsetWidth > maxWidth) {
          setMaxWidth(menuItemRef.current.offsetWidth);
        }
      }, [maxWidth, setMaxWidth]);
    
      return (
        <div ref={menuItemRef}>
          {children}
        </div>
      );
    };
    
    export default MenuItem;
    
    1. 在 MenuList 组件的父组件中使用 MenuList 和 MenuItem 组件,并设置 MenuItem 的样式为 display: inline-block。示例代码如下:
    import React from 'react';
    import MenuList from './MenuList';
    import MenuItem from './MenuItem';
    
    const App = () => {
      return (
        <MenuList>
          <MenuItem>
            // 第一个 MenuItem 的内容
          </MenuItem>
          <MenuItem>
            // 第二个 MenuItem 的内容
          </MenuItem>
          // 其他 MenuItem
        </MenuList>
      );
    };
    

    这样,每个 MenuItem 的宽度将以最长的那个为准。请注意,这个解决方案假设 MenuItem 是水平排列的,如果 MenuItem 是垂直排列的,需要进行相应的调整。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月10日
  • 修改了问题 8月17日
  • 修改了问题 8月17日
  • 修改了问题 8月17日
  • 展开全部

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题