MUI Snackbar 组件为什么不做成 static function 的模式?

起源

从前一直好奇一个问题,MUI Snackbar 用起来也太繁琐了

// MUI Snackbar
function App() {
  const [open, setOpen] = useState(false)

  return <>
    <Button onClick={handleClick}>Open simple snackbar</Button>
    <Snackbar
      open={open}
      onClose={handleClose}
    />
  </>
}

antd 以前的调用多方便啊,在全局任何地方都能调用

// antd message 静态方法(现在已经不推荐了)
message.open('xxx')

现在 antd 也开始推荐 hooks 方式了

// antd message 现在推荐的调用方式
function App() {
  const [messageApi, contextHolder] = message.useMessage()

  const info = () => {
    messageApi.info('Hello, Ant Design!')
  };

  return <>
    {contextHolder}
    <Button type="primary" onClick={info}>
      Display normal message
    </Button>
  </>
}

为什么呢?

我虽然用的 MUI,但图方便,一直用的 react-hot-toast。今天用到的时候,突然发现一个问题,MUI Snackbar 键盘可访问性很好,按钮点击弹出 Snackbar 后,按一下 tab,直接就导航到了 Snackbar 相关按钮上,而 react-hot-toast,根本无法使用键盘导航。

想了一下才注意到,hooks 方式调用时,Snackbar 在 DOM 结构上紧邻触发的 Button,点击时焦点在 Button 上,下一个元素就是 Snackbar,自然按一下 tab 就导航到了;而静态方法的实现原理是,在顶层提供一个 Provider,所有的 toast 都被挂载在那一个 Provider 上,自然就无法键盘导航了。

我不确定 MUI 是不是出于这方面的考虑,但我十分赞同:不应该仅为了调用方便,而牺牲交互性。这也是我为什么对 MUI 推崇备至:不仅设计哲学统一,还充分考虑到了键盘可访问性、无障碍等方面,这些方面 antd 目前还不够完善。

如非特别声明,本站作品均为原创,遵循【自由转载-保持署名-非商用-非衍生 创意共享 3.0 许可证】。

对于转载作品,如需二次转载,请遵循原作许可。