UIkit 的 Modal 在 React 中无法正常打开怎么办?
我在 React 项目里引入了 UIkit,想用它的 Modal 组件,但点击按钮完全没反应,控制台也没报错。我按照文档加了 data-uk-modal 属性,也引入了 JS 文件,是不是哪里写错了?
这是我的代码:
import UIkit from 'uikit';
export default function MyModal() {
return (
<>
<button className="uk-button uk-button-default" type="button" data-uk-toggle="target: #my-modal">
打开弹窗
</button>
<div id="my-modal" data-uk-modal>
<div className="uk-modal-dialog">
<button className="uk-modal-close-default" type="button" data-uk-close></button>
<div className="uk-modal-header">标题</div>
<div className="uk-modal-body">内容</div>
</div>
</div>
</>
);
}
UIkit依赖真实的DOM节点,但React组件首次渲染时,UIkit可能还没来得及绑定事件。你那个
data-uk-toggle写法在纯HTML里没问题,放React里就凉了。最直接的办法是别用data属性,改用JS手动打开:
还有一种情况是如果你的UIkit是通过CDN或者全局引入的,记得确保在index.html里先加载了
uikit.min.js和uikit.min.css,光import UIkit包不够。另外提醒一下,关闭按钮的
data-uk-close在React里有时候也会失灵,如果点X关不掉,同样改成onClick={() => UIkit.modal('#my-modal').hide()}就行。最直接的办法是放弃 data 属性,用 JS 手动控制:
核心改动就几点:
用 useEffect 在组件挂载后调用 UIkit.modal() 初始化。按钮的点击改成 onClick 手动调用 show(),关闭按钮同理用 hide()。这样 UIkit 才能正确绑定事件。
如果你非想用 data 属性也不是不行,但得在 useEffect 里手动触发 UIkit 的事件绑定,而且容易出各种奇怪问题,不如直接用 JS 方法省心。