2015-10-20 33 views
6

在普通的舊式Semantic-UI WITHOUT React中,我已經能夠在Modal中放置一個表單而沒有任何問題。React + Semantic-UI:在UI中使用窗體MODAL

使用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'); 

由於上文提到的。它顯示正常,但由於不變侵犯,它無法正常工作。

我該如何解決此問題並使其工作?

回答

10

您想使用detachable = false選項初始化componentDidMount中的模態。

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

這將阻止模態在全局dimmer對象中移動,並且DOM仍將由React擁有和管理。其他選項記錄在here

我創建了一個示例JSFiddle供您測試。

+0

嗨@ J3Y您的解決方案適用於的jsfiddle用非常簡單的HTML結構。我的項目比這個更復雜一些。我創建了一個JSFiddle來演示我的問題。在SAFARI上,Modal隱藏在調光器下面。在FIREFOX上,JSFiddle可以工作......但實際上在瀏覽器中打開FIREFOX中的實際項目,Modal仍然隱藏在調光器下。這是JSFiddle來說明:https://jsfiddle.net/va1zhu4w/3/使可拆卸:false會擺脫不變的違規錯誤,但有一些副作用,如小提琴中所示。怎麼解決? – preston

+0

在jsfiddle.net/va1zhu4w/3我已經在div容器周圍添加了,並且我在Semantic-UI的UI SIDEBAR中包裝了ConfirmEdit Modal ...我添加了一個css margin-top,所以按鈕將不會隱藏在固定菜單下.....只是想我會提及這些只是爲了讓它更容易....感謝 – preston

+0

不錯,除了那是我的回答主要工作? – J3Y

1

好吧......我想我已經想到了這一點前面....

我決定來分析DOM和直接操作的解決方案DOM。

我曾試圖尋找其他更優雅的少hack-y解決方案,但事情並沒有解決。我試過Material-UI的模態與Semantic-UI形式集成,但發現它不會滾動,如果模態的內容像表格等一樣長......

我也試圖依靠語義UI的API(可用設置等),但它們都有一些負面影響。

所以這裏是我找到解決方案。 我查看了MODAL顯示並查看其在DOM中的位置時生成的HTML。

事實證明,當調光器處於活動狀態,語義的UI顯示一個div這個類的調光器

ui dimmer modals page transition visible active 

我發現這個div是兄弟而不是另一個股利與兒童一類

ui fluid container pushable 

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

所以我所做的每次我觸發我的模態,我立即調用代碼來使模態成爲我的其他內容的子容器... 這種方式我的模式沒有被調光器覆蓋。

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)隨着我使用語義UI一個模式裏面顯示形式的經驗反應,如果不設置語義UI的UI MODAL的可拆卸特性,它不可兼容性違規等錯誤。 解決方法是將可分離設置爲false。 2.)在那之後,你可能會遇到模態和調式覆蓋模糊的問題,因此它不僅看起來很糟糕,而且你也不能點擊輸入字段等等。 至少在我的情況下,解決方案是使用jQuery操作dom並修復任何Semantic-UI忘記自動執行的操作。

我希望可以幫助別人的未來....一直停留在這個現在3天....

我不知道這是不是最好的解決辦法....但它沒有工作.... 讓我知道如果您有任何更好的解決方案......

1

好吧...我發現一個更好的答案。

我上面給出的第一個答案是移動的調光器相同的父模態時態可以在處於較低層次的任何容器。

這樣,模態和模態的形式通過調光器不再覆蓋。

現在的問題(ATLEAST在我的情況),是調光器只覆蓋了窗口的某一部分,而不是整個窗口,這是它應該做的。在這種情況下,如果您嘗試將css高度設置爲100%,則無關緊要,因爲它可能已經是100%,但父容器只能達到該點,因此也會變暗。

因此,這是更好的解決方案,我發現。

我發現,如果在層次申報模式更高,在我來說,我宣佈它在目標容器之前的最頂層容器。

這是目標容器:

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

而且這是在告訴反應渲染到容器:

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

內的最頂層的div容器是我宣佈UI MODAL與設置detachable:false ...

現在,當我觸發UI MODAL顯示,然後我使用jQuery將模式移動到更高的div容器,在這種情況下是t他的目標容器:

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

這樣,調光器的模式和形式背後,但它也涵蓋了整個窗口完全和以動態的方式。因此,如果您有一張桌子很多,條目很多且整個文檔很長,調光器仍然會完整覆蓋整個文檔,而無需進行任何手動調整。

-2

在模態設置中使用context。這對我有效。

0

設置爲可拆卸:false在我的經驗中不是一個好主意,因爲模態('show')通常也會在頁面中創建一個Himmer,它會遇到z-index問題。

我使用react-semanticui-modal組件來解決這個問題,使用this,使您可以自由地在您的反應項目中使用語義模式。