React + Semantic-UI: 在 UI MODAL 中使用表单

React + Semantic-UI: Using Forms inside UI MODAL

在没有 React 的普通旧语义 UI 中,我已经能够毫无问题地将表单放入模态框内。

使用 Semantic-UI + React 版本,我可以在模态框内显示表单,但它并没有像我期望的那样工作。

比如模态显示后,模态里面的表单也显示出来。如果我开始在输入字段中输入,我会显示此错误:

Error: Invariant Violation: findComponentRoot(..., .1.1.1.0.4.0.0.1): Unable to find element. This probably means the DOM was unexpectedly mutated (e.g., by the browser), usually due to forgetting a <tbody> when using tables, nesting tags like <form>, <p>, or <a>, or using non-SVG elements in an <svg> parent. Try inspecting the child nodes of the element with React ID ``.

由于这个错误,我使用输入的其他反应代码没有按预期工作。

这是演示问题的最简单的代码版本:

ConfirmEdit = React.createClass({

    render(){
        return (
            <div className="ui modal editform">
                <form className="ui form">
                    <div className="field">
                        <label>Name</label>
                        <input name="name" type="text" placeholder="Name">
                        </input>
                    </div>
                </form>
            </div>
        );
    }
});

在我添加上述组件的组件中,我确保触发它:

$('.ui.modal.editform').modal('show');

如上所述。它显示正常,但由于不变违规而无法正常工作。

我该如何解决这个问题并让它发挥作用?

您想使用选项 detachable = false 初始化 componentDidMount 中的模式。

$('.ui.modal').modal({detachable: false});

这将防止模式在全局调光器对象内移动,并且 DOM 仍将由 React 拥有和管理。其他选项记录在案 here.

我创建了一个示例 JSFiddle 供您测试。

好吧...我希望我早点想到这个....

我决定分析DOM,直接操作DOM求解。

我曾尝试寻找其他更多 'graceful' 更少 hack-y 的解决方案,但没有成功。我尝试 Material-UI 的模态与 Semantic-UI 表单集成,但发现如果模态的内容很长,如表单等,它不会滚动……

我也曾尝试依赖 Semantic-UI 的 API(可用设置等),但它们都有某种负面影响。

这就是我为找到解决方案所做的工作。 我查看了 MODAL 显示时产生的 HTML 并查看了它在 DOM.

中的位置

事实证明,当调光器处于活动状态时,Semantic-UI 显示一个 div,其中 class 用于调光器

ui dimmer modals page transition visible active

我发现这个 div 是兄弟姐妹,而不是另一个 div 的 child 和

的 class
ui fluid container pushable

其中包含我所有的其他内容。

所以我所做的是每次触发我的模态时,我立即调用代码使模态成为我其他内容的那个容器的 child... 这样我的模式就不会被调光器覆盖。

showModal: function() {
    $('.ui.modal.editform').modal('show');
    //$('.ui.dimmer.modals').dimmer('hide');
    //$('.ui.dimmer.modals').after('.pusher');
    // $('.ui.dimmer.modals').appendTo('#render-target');
    $('.ui.dimmer.modals').appendTo('.ui.fluid.container.pushable');
}

总结一下: 1.) 根据我在 React 中使用 Semantic-UI 在模态内显示表单的经验,如果你不设置 Semantic-UI 的 UI MODAL 的可拆卸 属性,它因不变违规等而出错。 解决方法是设置detachable为false。

2.) 在那之后,你可能会遇到模态的调光器覆盖模态和表单的问题,因此它不仅看起来很糟糕,而且你也无法点击输入字段等...... 至少在我的情况下,解决方案是用 jQuery 操纵 dom 并修复 Semantic-UI 忘记自动执行的任何事情。

我希望以后能对某人有所帮助....现在已经坚持了 3 天....

我不知道这是否是最好的解决方案....但它确实有效.... 如果您有更好的解决方案,请告诉我......

好的...我找到了更好的答案。

我在上面给出的第一个答案是将调光器移动到与模态相同的父级,当模态可以位于层次结构中较低的任何容器中时。

这样做,模态和模态中的窗体就不再被调光器覆盖了

现在的问题(至少在我的情况下)是调光器只覆盖了 window 的特定部分,而不是它应该做的整个 window。在这种情况下,如果您尝试将 css 高度设置为 100% 并不重要...因为它可能已经是 100% 但父容器仅达到该点,因此调光器也是如此.

所以这是我找到的更好的解决方案。

我发现,如果您在层次结构中更高层声明模态,在我的例子中,我在目标容器之前的最顶层容器中声明了它。

这是目标容器:

<div id="render-target"></div>

这是告诉 React 渲染到那个容器:

React.render(<App />, document.getElementById("render-target"));

里面最上面的 div 容器是我用设置 detachable:false...

声明 UI MODAL 的地方

现在当我触发 UI MODAL 显示时,我然后使用 jQuery 将模态移动到更高的 div 容器,在本例中是目标容器:

$('.ui.modal.editform').appendTo('#render-target');

通过这样做,调光器位于模态和形式之后,但它也以动态方式完全覆盖整个 window。因此,如果你有一个很长的 table 并且有很多条目并且整个文档很长,调光器仍然会完全覆盖它而不需要你做任何更多的手动调整。

在模态设置中使用context。这对我有用。

根据我的经验,设置可分离的:false 不是一个好主意,因为 modal('show') 通常也会在您的页面中创建一个 Himmer,它会遇到 z-index 问题。

我做了一个react-semanticui-modal组件来解决这个问题,使用this,让你在你的react项目中自由使用semantic modal

更新后的解决方案是使用semantic-ui-react:

https://github.com/Semantic-Org/Semantic-UI-React

http://react.semantic-ui.com/modules/modal