μλ€ μ!
μ΄ μμ© νλ‘κ·Έλ¨μλ "λμλ§ μΉμ
"μ΄λΌλ κ΅¬μ± μμκ° μμ΅λλ€. κΈ°λ³Έμ μΌλ‘ μ¬μ©μκ° μλ§μΌλ‘ λ§λλ κ΅¬μ± μμμ λν 미리 μ μ λ ν
μ€νΈλ₯Ό νμνλ μμμ
λλ€.
λμλ§μ νμ ν κ΅¬μ± μμλ₯Ό "λμλ§ μΉμ "κ΅¬μ± μμμ μλ¦¬κ³ μΆμ΅λλ€. μ§κΈμ λͺ κ°μ§ μ‘μ κ³Ό μ€ν μ΄μ ν¨κ» Fluxλ₯Ό μ¬μ©νκ³ μμ΅λλ€. μ΄κ²μ λμμ§ μκ³ κ½€ μ μλνμ§λ§,μ΄ μμΈμ μν΄ νΉλ³ν μ μ λ 2 κ°μ νμΌμ΄μλ μλΉν ν° μ€μ μ λλ€. λν λ€λ₯Έ μμ μΌλ‘ μΈν΄ "λμλ§ μΉμ "μμ μ΄ λμ€ν¨μΉνλ λ± μ¬λ¬ κ°μ§ λ€λ₯Έ λ¬Έμ κ° λ°μνμ΅λλ€ ( "ν견 μ€μ λμ€ν¨μΉ ν μ μμ"μ€λ₯κ° λ°μ ν¨).
κ·Έλ¬λ "help section"μ singleton μΌλ‘ μ μ ν μ μλ€λ©΄ "help section"μ μΈμ€ν΄μ€ λ₯Ό μ»μ μ μμΌλ―λ‘ import helpSection from './HelpSection
μ¬μ©νλ©΄λ©λλ€. λ΄κ°ν΄μΌ ν μΌμ λ΄κ° λ³κ²½νκ³ μΆμ μμ±μ μ€μ νλ λ©μλλ₯Ό helpSection
μ λ
ΈμΆνκ³ νΈμΆνλ κ²μ
λλ€.
κ΅¬μ± μμκ° λ€λ₯Έ κ΅¬μ± μμλ₯Ό λ³κ²½νμ¬ Reactμ λ¨λ°©ν₯ λ°μ΄ν° νλ¦μ κΉ¨λ¨λ¦¬λ κ²μ μκ³ μμ§λ§ λλ‘λ κ·Έλ§ν κ°μΉκ° μμ΅λλ€. μ κ° μκ°νλ λ°©μμ μΌμ’ μ μμ , μΌλΆ μμ λ° κ΅¬μ± μμλ₯Ό νλμ κ°μ²΄λ‘ κ²°ν©ν κ²μ λλ€. λ§μ κ΅¬μ± μμκ° λ°νμμ ν λ²λ§ μΈμ€ν΄μ€νλλ―λ‘ κ²½μ°μ λ°λΌ λ§€μ° μ μ© ν μ μμ΅λλ€.
λλ μ΄ JSfiddle μ΄μΈμ μΉμμ μ΄κ²μ λν μ°Έμ‘°λ₯Ό μ°Ύμ μ μμμ΅λλ€.
μ λ JavaScriptμ Reactμ μ΄λ³΄μμ΄λ―λ‘ λͺ κ°μ§ λͺ
λ°±ν μμ μ λμΉκ³ μμ μ μμ΅λλ€.
μ΄κ²μ λν΄ μ΄λ»κ² μκ°νμλκΉ?
μ½μ΄ μ£Όμ
μ κ°μ¬ν©λλ€.
(PS λͺ¨νΈν μ μ λν΄ μ£μ‘ν©λλ€. μμ΄λ μ λͺ¨κ΅μ΄κ° μλλλ€ ... : smile :)
μ΄κ²μ React μ½μ΄μ λ²κ·Έ λΌκΈ°λ³΄λ€λ μ¬μ©λ² μ§λ¬Έμ²λΌ 보μ λλ€. StackOverflowμ κ°μ μ¬μ΄νΈμμλ React μ½μ΄μμ λ²κ·Έλ₯Ό μΆμ νκΈ° μν΄ github λ¬Έμ λ₯Ό μ¬μ©νλ €κ³ νλ―λ‘ μ¬μ© μ§λ¬Έμ λν λ΅λ³μ΄ λ μ’μ΅λλ€. μ΄λ¬ν μ΄μ λ‘μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ €κ³ νμ§λ§ μ¬κΈ°μμ λνλ₯Ό κ³μνκ±°λ StackOverflowλ‘ μ΄λνμμμ€.
κ·νμ μ§λ¬Έκ³Ό κ΄λ ¨νμ¬ μ μ κ°μΈμ μΈ κΆμ₯ μ¬νμ μ±κΈ ν€μ νΌνλ κ²μ
λλ€.
http://stackoverflow.com/questions/137975/what-is-so-bad-about-singletons
λ΅μ₯μ λ³΄λ΄ μ£Όμ
μ κ°μ¬ν©λλ€.
λ΄κ° μμ§ λͺ»νλ μ±κΈ ν€μΌλ‘ React μ»΄ν¬λνΈλ₯Ό μμ±νλ λ°©λ²μ΄ μ΄λ―Έ μμ΅λκΉ? (λλ μ λ°° μ€ ν λͺ
μ΄ νκ°ν λκΉμ§ JSfiddleμ μ λ’°νμ§ μμ΅λλ€). μλ κ²½μ° λ¬Έμμμ μ°Ύμ μ μμΌλ―λ‘ λμ 곡μ νμμμ€.
"κ΅¬μ± μμ κ° ν΅μ "λ¬Έμ νμ΄μ§μμ :
λΆλͺ¨-μμ κ΄κ³κ°μλ λ κ΅¬μ± μμ κ°μ ν΅μ μ μν΄ μ체 κΈλ‘λ² μ΄λ²€νΈ μμ€ν μ μ€μ ν μ μμ΅λλ€.
...
νλμ€ ν¨ν΄μ μ΄κ²μ λ°°μ΄νλ κ°λ₯ν λ°©λ² μ€ νλμ λλ€.
보μλ€μνΌ μ±κΈ ν€μ μΈκΈλμ§ μμμ΅λλ€. λΉμ μ΄ μ€ StackOverflow λ§ν¬μμ λ§μ μ¬λλ€μ΄ μ€μ λ‘ μ±κΈ ν€μ μ¬μ©νλ κ²μ΄ μ΄λ€ κ²½μ°μ μ μ©νλ€κ³ λ§νμ΅λλ€. λ λ²μ§Έ λ΅λ³μμ :
μ±κΈ ν€μ νλμ λ¬Έμ λ₯Ό ν΄κ²°ν©λλ€.
μμ κ²½ν©.
μμμ΄ μλ€λ©΄
(1) λ¨μΌ μΈμ€ν΄μ€ λ§ κ°μ§ μ μμ΅λλ€.
(2) λ¨μΌ μΈμ€ν΄μ€λ₯Ό κ΄λ¦¬ν΄μΌν©λλ€.
μ±κΈ ν€μ΄ νμν©λλ€.
μ΄κ²μ λ΄ μ μ€ μΌμ΄μ€μ²λΌ λ€λ¦½λλ€ (κ·Έλ¦¬κ³ React μΈκ³μμλ κ½€ λ§μ΄).
κ΅¬μ± μμλ₯Ό μ¬μ©νλ κ΄λ ¨ λ°©λ²μ²λΌ 보μ΄λ―λ‘ GitHubμ λ¬Έμ λ‘ μ¬μ ν κ΄λ ¨μ΄ μλ€κ³ μκ°νλ©° λ¬Έμμ μ΄μ λν μ°Έμ‘°κ° ν¬ν¨λμ΄μΌνλ€κ³ μκ°ν©λλ€.
React κ΅¬μ± μμ μΈμ€ν΄μ€μλ ν΄λΉ μΈμ€ν΄μ€κ° νΈλ¦¬ λ΄λΆμμλ μμΉλ₯Ό νμ νλ λ° νμν λ΄λΆ μνκ° μμ΅λλ€. λμΌν μΈμ€ν΄μ€λ₯Ό μ¬λ¬ μμΉμμ λ λλ§ ν μ μμ΅λλ€. λ°λΌμ μ±κΈ ν€ μΈμ€ν΄μ€μ κ°λ μ React μΈκ³μμ μλ―Έκ° μμ΅λλ€.
κ·Έ λ°μ΄μ¬λ¦°μ νμλ κ²μ μ€μ λ‘ λ¨μΌ μΈμ€ν΄μ€ μΈμλ‘ μΈν΄ μ±κΈ ν€μ΄λΌκ³ λΆλ₯΄λ κ²μ΄ μλλλ€. μ체 μνλ₯Ό κ°μ§ λͺ¨λκ³Ό λΉμ·ν©λλ€. κ·Έλ° λ€μ μΈμ€ν΄μ€κ° λ λλ§ λ λ ν¬ν¨ λ (κ·Έλ¬λ μ€μ λ‘λ "μ μ") μνλ₯Ό μ¬μ©ν©λλ€. κΈλ‘λ² μνμμ λ§μ΄νΈ λ μΈμ€ν΄μ€μ λν μ°Έμ‘°λ₯Ό μμ΄κ³ μ μ₯νκ³ λ§μ΄νΈ λ μΈμ€ν΄μ€μ λν μ λ°μ΄νΈλ₯Ό κ°μ ν©λλ€. μ΄μ μ€μ λ‘ λ λ§μ κ²μ λ λλ§νλ κ²μ λ§μ μλ μμ΅λλ€. μ΄λ‘ μΈν΄ 첫 λ²μ§Έ νλͺ©μ΄ μ λ°μ΄νΈλμ§ μμ΅λλ€. μ μ¬ν μμ μ μ½κ² μννκ³ 1 κ° μ΄μμ λ λλ§μ μ§μν μ μμ΅λλ€.
μ°λ¦¬ λ¬Έμμμ μ΄κ²μ μ°Έμ‘°νλ κ²μ κ΄ν΄μλ κ·Έλ κ²νμ§ μμ κ²μ λλ€. Reactλ‘ λ¬μ± ν μμλ λ§μ ν¨ν΄μ΄ μμ§λ§ λͺ¨λμ λν΄ μ΄μΌκΈ°νμ§λ μκ² μ΅λλ€.
μκ°μλ΄μ΄ λ΅μ₯ ν΄ μ£Όμ
μ κ°μ¬ν©λλ€, James.
첫째, κ·νμ μμ μ μμ ν μ΄ν΄νκ³ JSfiddleμ μ΄ν΄λ³Έ μ¬μ€μ κ°μ¬λ립λλ€. λ§μ§λ§μΌλ‘ λ§μ λλ¦¬κ² μ΅λλ€.
λμκ² νλ€μλ μΌμ λ μ½κ² λ§λ€κ³ μΆλ€. λͺ μ€μ λ¬Έμ κ° λ κ²μ΄λ©° μμΌλ‘ μ΄λ³΄μμκ² λμμ΄ λ κ²μ΄λΌκ³ μκ°ν©λλ€.
λλ νμ μμ²λ λκΈμ μ°κ²λλλ° .. ν¨κ» μ½μ΄ μ£Όμ μ κ°μ¬ν©λλ€. :λ―Έμ:
μλ νμΈμ @all ,
λ€λ₯Έ κ΄μ μ μΆκ°νμ¬μ΄ λνλ₯Ό λ μ΄λ¦¬κ³ μΆμ΅λλ€. Wir react @ 16 ν¬νΈ μ μ¬μ©νμ¬ DOMμ νΉμ μ§μ μ μ»΄ν¬λνΈλ₯Ό λ§μ΄νΈ ν μ μμ΅λλ€. μ΄ μ¬μ© μ¬λ‘μμλ μ΄μ κ°μ΄ App.jsx
λ§μ΄νΈλλ νΉμ λ€λ₯Έ κ΅¬μ± μμλ‘ λ λλ§λμ΄μΌνλ λͺ¨λ¬ λλ μλ¦Όκ³Ό κ°μ λ€λ₯Έ κ΅¬μ± μμλ₯Ό λΉλνκ³ μμ΅λλ€.
App.jsx
[...]
render() {
return (<SingletonOverlay></SingletonOverlay>)
}
[...]
Notification.jsx
import React from 'react';
import ReactDOM from 'react-dom';
import NotificationComponent from './Notification.js';
import SingletonOverlay from '../general/Overlay.js';
export default class Notification extends React.Component {
constructor(props) {
super(props);
this.state = {
element: null
};
}
componentDidMount() {
this.setState({ element: ReactDOM.findDOMNode(SingletonOverlay) });
}
render() {
return this.state.element
? ReactDOM.createPortal(
<NotificationComponent>That is a notification</NotificationComponent>,
this.state.element,
)
: null;
}
}
λ€λ₯Έ μ΅μ
μ document.findElementById
λλ μ μ¬ν κΈ°λ₯μ΄μλ domNodeλ₯Ό μ°Ύμμ ReactDOM.findDOMNode
μ μ λ¬νλ κ²μ
λλ€. κ·Έλ¬λ©΄ "React-Cosmos"λ₯Ό κ°μ λ‘ μ’
λ£ν΄μΌνλ―λ‘ κΈ°λΆμ΄ λ§€μ° μ’μ§ μμ΅λλ€.
λ°λΌμ μμμ μΈκΈ ν κΈ°λ₯μ λν΄ μΈμ€ν΄μ€ μ체λ₯Ό μ λ¬νλ λμ ν¨μμ μ λ¬νλ νΉμ κ΅¬μ± μμμ μΈμ€ν΄μ€λ₯Ό κ²μ ν μ μκΈ°λ₯Ό λ°λλλ€. μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ λ°©λ²μ λν λ€λ₯Έ μ κ·Ό λ°©μμλ κ΄μ¬μ΄ μμ΅λλ€.
@jimfb μ΄ κΈ°λ₯ μ μμ κ°μΉκ° μμ΅λκΉ?
κ°μ₯ μ μ©ν λκΈ
μλ νμΈμ @all ,
λ€λ₯Έ κ΄μ μ μΆκ°νμ¬μ΄ λνλ₯Ό λ μ΄λ¦¬κ³ μΆμ΅λλ€. Wir react @ 16 ν¬νΈ μ μ¬μ©νμ¬ DOMμ νΉμ μ§μ μ μ»΄ν¬λνΈλ₯Ό λ§μ΄νΈ ν μ μμ΅λλ€. μ΄ μ¬μ© μ¬λ‘μμλ μ΄μ κ°μ΄
App.jsx
λ§μ΄νΈλλ νΉμ λ€λ₯Έ κ΅¬μ± μμλ‘ λ λλ§λμ΄μΌνλ λͺ¨λ¬ λλ μλ¦Όκ³Ό κ°μ λ€λ₯Έ κ΅¬μ± μμλ₯Ό λΉλνκ³ μμ΅λλ€.App.jsx
Notification.jsx
λ€λ₯Έ μ΅μ μ
document.findElementById
λλ μ μ¬ν κΈ°λ₯μ΄μλ domNodeλ₯Ό μ°ΎμμReactDOM.findDOMNode
μ μ λ¬νλ κ²μ λλ€. κ·Έλ¬λ©΄ "React-Cosmos"λ₯Ό κ°μ λ‘ μ’ λ£ν΄μΌνλ―λ‘ κΈ°λΆμ΄ λ§€μ° μ’μ§ μμ΅λλ€.λ°λΌμ μμμ μΈκΈ ν κΈ°λ₯μ λν΄ μΈμ€ν΄μ€ μ체λ₯Ό μ λ¬νλ λμ ν¨μμ μ λ¬νλ νΉμ κ΅¬μ± μμμ μΈμ€ν΄μ€λ₯Ό κ²μ ν μ μκΈ°λ₯Ό λ°λλλ€. μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ λ°©λ²μ λν λ€λ₯Έ μ κ·Ό λ°©μμλ κ΄μ¬μ΄ μμ΅λλ€.
@jimfb μ΄ κΈ°λ₯ μ μμ κ°μΉκ° μμ΅λκΉ?