κΈ°λ₯ μ μμ²νκ±°λ λ²κ·Έλ₯Όλ³΄κ³ νμκ² μ΅λκΉ?
κ³€μΆ©
νμ¬ νλμ 무μμ λκΉ?
λ€μ (κ°μ²΄) μ€ λν«μ΄ μ 곡λ©λλ€.
class HoverMenu extends React.Component {
render() {
if (typeof document === 'undefined') return null
const root = document.getElementById('root')
return ReactDOM.createPortal(<div>Hello World</div>, root)
}
}
class Para extends React.Component {
render() {
return (
<span>
Some Text
<HoverMenu />
</span>
)
}
}
div#root
λ μ‘΄μ¬νλ μ ν¨ν div
κ²½μ° SSR ν μνμ λ€μ μ€λ₯κ° νμλ©λλ€.
Warning: Expected server HTML to contain a matching <div> in <span>
HoverMenu
μ μ μλ₯Ό λ€μκ³Ό κ°μ΄ μ
λ°μ΄νΈνλ©΄ κ²½κ³ κ° μ¬λΌμ§λλ€.
class HoverMenu extends React.Component {
componentDidMount() {
this.setState({ isActive: true })
}
render() {
const { isActive} = this.state
if (!isActive) return null
const root = document.getElementById('root')
return ReactDOM.createPortal(<div>Hello World</div>, root)
}
}
setState
μμ componentDidMount
setState
λ‘ μΈν μ΄μ€ λ λλ§ λλ¬Έμ κ·Έλ κ²νμ§ μλ κ²μ΄ μ’μ΅λλ€.
λλ κ·Έ μ€λ₯κ° λμκ² λ§νλ κ²μ μ μ΄ν΄νμ§ λͺ»ν©λλ€. μ΄λ€ κ²½μ°μλ <div />
λ μλ² μΈ‘μμ λ λλ§λμ§ μμ΅λλ€. HoverMenu
DOM div
λ DOM span
λ΄λΆμμ λ λλ§λμ§ μκΈ° λλ¬Έμμ΄ μ€λ₯λ νΉν νΌλ μ€λ½μ΅λλ€. ( HoverMenu
μ΄ React span
μμ μ€μ²©λμ΄ μκΈ° λλ¬Έμ μ΄λ° μΌμ΄ λ°μνλμ§ κΆκΈν©λλ€.)
μμλλ λμμ 무μμ λκΉ?
μ€λ₯κ° λ°μνμ§ μμ΅λλ€. λλ μ μ΄λ μ€λ₯ λ©μμ§κ° λ λͺ νν©λλ€.
μ΄λ€ λ²μ μ Reactμ μ΄λ€ λΈλΌμ°μ / OSκ°μ΄ λ¬Έμ μ μν₯μ λ°μ΅λκΉ?
ν¬λ‘¬ 65
λ°μ 16.2
(SSRλΆν° Next 5.1κΉμ§)
setStateλ₯Ό ν΅ν΄ ν΄λΌμ΄μΈνΈμμ λ€μ λ λλ§νμ¬ ν΄κ²°ν μλμλ λΉμ·ν λ¬Έμ κ° μμ΅λλ€.
μ κ²½μ°μλ ν¬νΈ λ΄λΆμμ λͺ¨λ¬μ λ λλ§νλ €κ³ ν©λλ€. Modal
κ΅¬μ± μμλ μλ²μμ λ λλ§ λ λ null
λ°ννκ³ ν΄λΌμ΄μΈνΈμ ν¬νΈμ λ§λλλ€. κ·Έλ¬λ DOMμ μν ν μλ§μ΄λ©λλ€.
μλ₯Ό λ€μ΄ μ£Ό κ΅¬μ± μμ λ΄μμ λ€μκ³Ό κ°μ΄ μ¬μ©νλ©΄ λ€μκ³Ό κ°μ΅λλ€.
<Modal>
This is a test
</Modal>
<div className="some-div-after-the-modal">
</div>
μν ν μ΄κ²μ μ»λ λμ :
<!-- Inside the portal container -->
<div class="modal-wrapper">
<div class="modal-content">This is a test</div>
</div>
<!-- In the main component -->
<div class="some-div-after-the-modal">
</div>
λλ μ΄κ²μ μ»λλ€ :
<!-- Inside the portal container -->
<div class="some-div-after-the-modal">
<div class="modal-content">This is a test</div>
</div>
<!-- In the main component -->
<div class="some-div-after-the-modal">
</div>
κ·Έλ¦¬κ³ κ²½κ³ λ λμΌν©λλ€ ( Expected server HTML to contain a matching <div> in <div>
). 컀μ€ν
SSR λ°©λ²κ³Ό ν¨κ» React 16.3μ μ¬μ©ν©λλ€.
μ΄κ²μ΄ μλ λ λμμΈμ§ νμ€νμ§ μμ΅λλ€.
μλΆ κ³΅κΈ ν¬νΈμ μ§μλμ§ μμ§λ§ (https://github.com/facebook/react/issues/13097) λ©μμ§ μ체λ μλ―Έκ° μμ΅λλ€. μ‘°μ¬νκ³ μμ ν΄μΌν©λλ€.
@gaearon μμ μ λͺ©μ μ
invariant violation: Portal is not support on SSR. For more detail, please refer https://github.com/facebook/react/issues/13097
κΆλ¦¬?
κΈνμ§ μλ€λ©΄ κΈ°κΊΌμ΄ν©λλ€.
SSR Doc μ΄μμ μΉ μ¬μ΄νΈ μ μ₯μλ‘ κ³ννκ³ μμΌλ―λ‘ μν λ©μ»€λμ¦μ μ΅μν΄μΌν©λλ€.
μ΄ μ‘°μ¬κ° μ κ³νμ λμμ΄ λ κ² κ°μ΅λλ€.
https://github.com/facebook/react/pull/13379
SSRμμ ν¬νΈμ΄ "μ무κ²λ"λ λλ§λμ§ μλ μ΄μ λ 무μμ λκΉ?
μ무κ²λ λ λλ§νλ κ²μ΄ μ΅μ μΈ κ² κ°μ§ μμ΅λλ€. ν¬νΈ μ½ν μΈ λ₯Ό λ€λ₯΄κ² λ§λλ κ²μ΄ μλ² λ λλ§μ κ°μΉκ° μλ€κ³ μκ°νμ§ μμ΅λλ€.
μ°λ¦¬λ μμ€νμ€λ₯Ό μν΄ μλ² λ λλ¬μ κ°νΈκ³Ό ν¨κ» μ΄κ²μΌλ‘ λμμ¬ κ²μ λλ€.
ν¬νΈμ κ°λ μ μΌλ‘ ν΄λΌμ΄μΈνΈ μ μ© κ΅¬μ± μμμ λλ€. μΌλ°μ μΌλ‘ μλ²μμ λ λλ§ νκ³ μΆμ§ μμ λͺ¨λ¬κ³Ό κ°μ κ²μ μ¬μ©λ©λλ€. λν dom μμλ₯Ό μ¬μ©ν©λλ€. μ΄λ domμ΄ μκΈ° λλ¬Έμ renderToStringμ΄ μ¬μ©νμ§ μμ΅λλ€. λλ μλ²μμ κ·Έλ€κ³Ό ν¨κ» ν μμλ μλ―Έμλ κ²μ΄ 무μμΈμ§ μμ§ λͺ»ν©λλ€. λν λμ§λ κ²μμ κ°μΉμλ κ²μ΄ 보μ΄μ§ μμ΅λλ€.
λͺ¨λ¬κ³Ό κ°μ κ²λ€μ μ¬μ©
κ·Έκ²μ νλμ μ¬μ© μ¬λ‘μ΄μ§λ§ λ°λμ ν΄λΌμ΄μΈνΈ μ μ©μ΄ μλ μ¬μ΄λ λ° λ° μ΄μ μ μ¬ν λ€λ₯Έ μ¬λ‘λ μμ΅λλ€.
κ·Έλ€μ λν dom μμλ₯Ό μ·¨ν©λλ€.
μ€λ₯Έμͺ½ β νμ¬ λμμΈμμ. λ³κ²½ λ μ μμ΅λλ€. https://github.com/facebook/react/pull/8386#issuecomment -262375265
λλ λν λμ§λ κ²μμ κ°μΉμλ κ²μ λ³΄μ§ λͺ»ν©λλ€.
λμ§κΈ°μ κ°μΉλ ν¬νΈμ΄ μλνμ§ μλλ€λ κ²μ λͺ
μ μ μΌλ‘ μΈμ νλ κ²μ
λλ€. {domNode && ReactDOM.createPortal(stuff, domNode)}
λλ μ΄μ μ μ¬ν κ²μΌλ‘ μ½κ² ν΄κ²°ν μ μμ΅λλ€. DOM λ
Έλλ₯Ό κ°μ Έμ¬ μ μλμ§ μ¬λΆλ₯Ό νμΈνκΈ° μν΄ μ΄λ―Έ μ΄λ€ μ’
λ₯μ κ²μ¬λ₯Ό μνν΄μΌνκΈ° λλ¬Έμμ΄ μμ μμ ν¬νΈμ λ΄ λ³΄λ΄μ§ μλλ‘ μ νν μμλ μΆ©λΆν λ°μ΄ν°κ° μμ΄μΌν©λλ€.
μ΄ λ¬Έμ λ₯Ό "μ’μ 첫 λ²μ§Έ λ¬Έμ "λ‘ μμ νκ³ μΆμ΅λλ€.
+1
μ΄ λ¬Έμ μ λν΄ μμ ν μ μμ΅λκΉ?
νμ€ν. λλ λΉμ μ΄ ν μ μλ€κ³ μκ°ν©λλ€. κ·Έλμ μΌλ§λ λ©λ¦¬ κ°μ΅λκΉ? λλ μ€μ λ‘ κ·Έκ²μ μ§μ΄ λ€κΈ°λ₯Ό μκ°νκ³ μμ΅λλ€.
μλ νμΈμ μ¬λ¬λΆ, λ¬Έμ κ°μλ νμΌμ μ΄λ»κ² μ°Ύμ μ μλμ§ μλ©΄ λμμλ°μ μ μμ΅λλ€.
μ΄ λ¬Έμ μ λν λΆλΆμ μΈ pull μμ²μ΄ μμ΅λλ€.
https://github.com/facebook/react/pull/15473
μμ§ μ무λ μλμ? λλ κ·Έκ²μ λ°μλ€μ΄κ³ μΆλ€.
μ΄κ²μ μνλ 무μμ λκΉ? μ΄λ»κ² μ¬ν ν μ μμ΅λκΉ?
μ΄κ²μ΄ μ¬μ ν λ¬Έμ μ λκΉ?
μ΄ λ¬Έμ μ λν μλ΅λλ°μ§ λͺ»νμ΅λλ€.
μ΄ λ¬Έμ μ μνλ μμ§ μ΄λ € μλ€κ³ μκ°ν©λλ€.
μ΄ λ¬Έμ λ₯Ό 맑μ μ μμ΅λκΉ?
μλ νμΈμ,μ΄ λ¬Έμ μ λν΄ μμ νλ μ¬λμ΄ μμ΅λκΉ? κ·Έλ μ§ μλ€λ©΄ κ°μ Έ κ°κ³ μΆμ΅λλ€.
μ무λ μμ νμ§ μμΌλ©΄
μ΄κ²μ΄ μ¬μ ν λ¬Έμ μ λκΉ? κ·Έκ²μ κ³ μΉλ €κ³ μλν κ² κ°μ§λ§ κ·Όλ³Έμ μΈ λ¬Έμ λ μ€μ λ‘ μΌλΆ μ¬λλ€μ΄ ν¬νΈμ΄ μλ² μΈ‘ λ λλ§μμ μλνκΈ°λ₯Ό μνλ€λ κ²μ λλ€. κ·Έλ λ€λ©΄μ΄ λ¬Έμ λ₯Ό μ’ κ²° ν μ μμ΅λκΉ?
div μμλ₯Ό μΆκ°νλ©΄ μ μμ μΌλ‘ μλν©λλ€.
`class Para extends React.Component {
render () {
λ°ν (
)
}
}`
κ°μ₯ μ μ©ν λκΈ
μλΆ κ³΅κΈ ν¬νΈμ μ§μλμ§ μμ§λ§ (https://github.com/facebook/react/issues/13097) λ©μμ§ μ체λ μλ―Έκ° μμ΅λλ€. μ‘°μ¬νκ³ μμ ν΄μΌν©λλ€.