You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Storybook中动态配置Material UI Menu的anchorOrigin与transformOrigin

实现Material UI Menu组件的动态位置配置(集成Storybook)

当然可以动态配置anchorOrigin和transformOrigin,下面是具体实现步骤:

1. 修改自定义Menu组件,支持位置配置Props

注意:你的组件名称和Material UI内置的Menu组件重名了,建议改成CustomMenu避免命名冲突,修改后的组件会接收位置参数并设置默认值,保证不传入参数时也能正常运行:

import React from 'react';
import { ThemeProvider, Button, Menu, MenuItem } from '@mui/material';
// 导入你的自定义主题(根据实际路径调整)
import { muiTheme } from './your-theme-path';

export const CustomMenu = ({
  anchorOrigin = { vertical: 'top', horizontal: 'left' },
  transformOrigin = { vertical: 'top', horizontal: 'left' },
  buttonText = 'Dashboard'
}) => {
    const [anchorEl, setAnchorEl] = React.useState(null);
    const open = Boolean(anchorEl);
    
    const handleClick = (event) => {
        setAnchorEl(event.currentTarget);
    };
    
    const handleClose = () => {
        setAnchorEl(null);
    };

    return (
        <div>
            <ThemeProvider theme={muiTheme}>
                <Button
                    id="demo-positioned-button"
                    aria-controls={open ? 'demo-positioned-menu' : undefined}
                    aria-haspopup="true"
                    aria-expanded={open ? 'true' : undefined}
                    onClick={handleClick}
                    style={{ textTransform: "capitalize" }}
                >
                    {buttonText}
                </Button>
            </ThemeProvider>
            <Menu
                id="demo-positioned-menu"
                aria-labelledby="demo-positioned-button"
                anchorEl={anchorEl}
                open={open}
                onClose={handleClose}
                anchorOrigin={anchorOrigin}
                transformOrigin={transformOrigin}
            >
                <MenuItem onClick={handleClose}>Profile</MenuItem>
                <MenuItem onClick={handleClose}>My account</MenuItem>
                <MenuItem onClick={handleClose}>Logout</MenuItem>
            </Menu>
        </div>
    );
}

2. 配置Storybook,添加动态位置控制项

修改stories.js,配置Storybook的Controls面板,让用户可以直观选择垂直/水平方向的位置参数,实时预览效果:

import { CustomMenu } from './your-menu-component-path';

export default {
  title: 'Components/CustomMenu',
  component: CustomMenu,
  argTypes: {
    anchorOrigin: {
      control: {
        type: 'object',
        fields: {
          vertical: {
            options: ['top', 'center', 'bottom'],
            control: { type: 'select' }
          },
          horizontal: {
            options: ['left', 'center', 'right'],
            control: { type: 'select' }
          }
        }
      },
      defaultValue: { vertical: 'top', horizontal: 'left' }
    },
    transformOrigin: {
      control: {
        type: 'object',
        fields: {
          vertical: {
            options: ['top', 'center', 'bottom'],
            control: { type: 'select' }
          },
          horizontal: {
            options: ['left', 'center', 'right'],
            control: { type: 'select' }
          }
        }
      },
      defaultValue: { vertical: 'top', horizontal: 'left' }
    },
    buttonText: { control: 'text' }
  }
};

export const PositionConfigurable = (args) => <CustomMenu {...args} />;
PositionConfigurable.args = {
  buttonText: 'Dashboard'
};

额外说明

  • 组件通过接收anchorOrigin和transformOrigin props,把原本硬编码的位置配置改成了可动态传入的参数,默认值保证了组件的基础可用性。
  • Storybook的argTypes配置让你在Controls面板中可以分别选择垂直、水平方向的位置,实时查看Menu的位置变化。
  • 如果觉得对象形式的参数不够直观,也可以把垂直和水平方向拆成单独的props(比如anchorVertical、anchorHorizontal),再在组件内部组合成anchorOrigin对象,进一步简化操作。

内容的提问来源于stack exchange,提问作者user3448925

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 17:05:21