κΈ°λ₯ μ μμ²νκ±°λ λ²κ·Έλ₯Όλ³΄κ³ νμκ² μ΅λκΉ?
μ΄κ²μ λ²κ·Έμ΄κ±°λ μ μ΄λ λ μ νν κ²½κ³ λ° μ€λ₯ λ©μμ§μ λν μμ²μ
λλ€.
νμ¬ νλμ 무μμ λκΉ?
μΌλΆ μμ±μ μΆκ°νκΈ° μν΄ μμμ 볡μ νκ³ μμλλ° μ»¨ν μ€νΈ Consumer νμ νΈλ¦¬λ₯Ό 볡μ ν΄μλ μλλ€λ μ¬μ€μ κ°κ³Όνμ΅λλ€.
import React from 'react';
import {render} from 'react-dom';
const { Provider, Consumer} = React.createContext();
const Comp = ({children})=> <Provider>{cloneKids(children)}</Provider>;
const cloneKids=(children)=>React.Children.map(children, child =>
React.cloneElement(child, child.props,
child.props.children&&
cloneKids(child.props.children)));
render(
<Comp><Consumer>{console.log}</Consumer></Comp>,
document.getElementById('root')
);
μ΄ μ½λλ # 12241λ‘ λμ λ κ²½κ³ λ° μ€λ₯λ₯Ό μμ±ν©λλ€.
κ²½κ³ : 컨ν μ€νΈ μλΉμκ° μ¬λ¬ νμ λλ ν¨μκ° μλ νμλ‘ λ λλ§λμμ΅λλ€. 컨ν μ€νΈ μλΉμλ ν¨μ μΈ λ¨μΌ μμμ κΈ°λν©λλ€. ν¨μλ₯Ό μ λ¬νλ€λ©΄ κ·Έ μ£Όμμ νν λλ μ ν κ³΅λ°±μ΄ μλμ§ νμΈνμμμ€.
κ·Έλ¦¬κ³ (λ νΌλ μ€λ¬μ)
TypeError : λ λλ§μ ν¨μκ° μλλλ€.
μμλλ λμμ 무μμ λκΉ?
μλ§λ React.cloneElementκ° ν¨μλ₯Ό 볡μ νλ €κ³ νμ§ μμμΌν©λκΉ? κ·Έκ²μ΄ 무μμνλ κ²°κ³Όλ ν¨μκ° μλλλ€.
κ²½κ³ λΆλΆ "κΈ°λ₯μ΄ μλ μμ"μ λ€λ₯Έ κ²½κ³ μ λΆλ¦¬λμ΄μΌν©λλ€. λμμ κΈ°λ₯μ΄ μλ μ¬λ¬ μλ μ ν μλ κ°μμ μ μμΌλ―λ‘λ³΄λ€ μ νν κ²½κ³ λ₯Ό λ°ν ν μ μμ΅λλ€.
μ΄λ€ λ²μ μ Reactμ μ΄λ€ λΈλΌμ°μ / OSκ°μ΄ λ¬Έμ μ μν₯μ λ°μ΅λκΉ?
Stackblitz / Chrome 65μμ react 16.3.0μΌλ‘ ν μ€νΈλμμΌλ©° Chrome 65 λ° Firefox 59μμλ 16.3.2λ‘ ν μ€νΈλμμ΅λλ€.
λ¬Έμ λ cloneElement
(컨ν
μ€νΈμ λν νΉλ³ν λ
Όλ¦¬κ° μμ)κ° μλλΌ props.children
(μ΄ κ²½μ° ν¨μ)λ₯Ό Children.map()
μ λ¬νλ€λ κ²μ
λλ€. (κΈ°λ₯μ κΈ°λνμ§ μμ). Children.map
λ μΌλ° React λ
Έλμμλ§ μλν©λλ€.
μλ§λ Children.map
λ React λ
Έλκ° μλ κ²μ λ°κ²¬νλ©΄ κ²½κ³ λ₯Ό νμ ν μ μμ΅λλ€.
λ κ²½μ° λͺ¨λ Reactκ° μ€κ³λμ§ μμ μμ μ μννλ €λ κ²μ²λΌ λ€λ¦½λλ€. μ μ΄κ²μ΄ νμν©λκΉ?
κ°μ¬!
λΆλͺ¨κ° νκ°μ λν 컨ν μ€νΈλ₯Ό μ 곡 ν μ€λΉκ° λ λκΉμ§ λͺ κ°μ§ μμ μμ±μ λν νκ°λ₯Ό μ°κΈ°ν©λλ€. μλ₯Ό λ€λ©΄ :
<Parent ><Child prefix-prop="string expression"></Parent>
(νν μΈμ΄λ μλ° μ€ν¬λ¦½νΈκ° μλκ³ μ격μΌλ‘ νκ°λ©λλ€. μ λ Childλ₯Ό μ μ΄νμ§ μμΌλ©° μμμ΄ μΌλ§λ μ§μμ μ μμ΅λλ€).
μμ΄λ λ΄λΆμ μΌλ‘ λ€μκ³Ό κ°μ΄λ©λλ€.
<Child prop={evaluate("string expression")} />
μ΄λ₯Ό μν΄ λΆλͺ¨λ μμμ λ°©λ¬Ένμ¬ ννμμ΄ ν¬ν¨ λ "prefix-prop"μμ±μ ννμ κ°μ΄ ν¬ν¨ λ "prop"μμ±μΌλ‘ λ³νν©λλ€. 볡μ λ κ΅¬μ± μμ μμ±μ λ³κ²½νλ μ μΌν λ°©λ²μ λλ€. λ¬Όλ‘ μ»¨ν μ€νΈ μλΉμλ 볡μ λμ΄μλ μλλ©° λ³κ²½ν μμ±μ΄ μμ΅λλ€.
λλ μμμΌλ‘μμ ν¨μ λλ λ λλ§ ν¨μ λλ μ΄μ μ μ¬ν κ²μ μ¬μ©ν΄μΌνλ€λ κ²μ μκ³ μμ§λ§ (νκ°λ₯Ό μ§μ°μν€κΈ° μν΄) νλ‘ν νμ΄ν λΌμ΄λΈλ¬λ¦¬μ μ¬μ©μ (HTML λ° JSPμμ μμΌλ©° μ’ μ’ HTML λ° νν μΈμ΄ μ΄μμ μ΄λ³΄μ)λ₯Ό μ€κ³νκ³ μμ΅λλ€. μλ§λμ΄ νκΈ°λ²μ μ΄ν΄νμ§ λͺ»ν κ²μ λλ€.
<Parent>{ context=> <Child prop={context.evaluate(x)} />}</Parent>
(κ²λ€κ° ν¨μ λ°λ‘ μμ 곡백μ μμ΄ λ²λ¦¬λ©΄ # 12689λ‘ νΌλλ©λλ€.)
κ·Έλ¦¬κ³ κ·Έλ€μμ΄ νμμ 빨리 μ΄ν΄νμ§ λͺ»ν κ²μ
λλ€ :
<Parent display={ context=> <Child prop={context.evaluate(x)} />} />
컨ν μ€νΈ μλΉμλ μμ κΈ°λ₯μ μ¬μ©νλ―λ‘ λμΌν λ¬Έμ κ° μμ΅λλ€.
μ΄κ²μ λ§€μ° μ΄κΈ° μμ μ΄λ―λ‘ μ¬μ ν μ΅μ μ κ³ λ €νκ³ μμ§λ§ μ΄λ»κ² λ 첫 λ²μ§Έ μΈμ©λ¬Έμμμ κ°μ΄ κΉ¨λν λΆλͺ¨-μμ νκΈ°λ²μ λλ¬νκ³ μΆμ΅λλ€. μλ§λ λλ "κΉ¨λν"νκΈ°λ²μ κΈ°λ₯μ μΈ νκΈ°λ²μΌλ‘ λ³ννλ λ°λ²¨ νλ¬κ·ΈμΈμ μμ±ν΄μΌ ν κ²μ λλ€.
κ·Έλ¬λ μ΄μ©λ©΄ λ΄κ° λκ°λ₯Ό λμΉκ³ μκΈ° λλ¬Έμ μ΄λ€ μ견μ΄λ κ°μ¬νκ² μ΅λλ€. λ΄ μ¬μ©μκ° JSPλ₯Ό λ λ Reactλ₯Ό μ±ννκΈ°λ₯Ό μ λ§λ‘ μνμ§λ§ νκΈ°λ²μ΄ λ무 μνΈνλμ΄ μμΌλ©΄ μ΄λ° μΌμ΄ λ°μνμ§ μμ΅λλ€.
λ΄κ° κ°μ§κ³ λ Έλ λ λ€λ₯Έ μμ΄λμ΄λ κΈ°λ₯μ λΆλͺ¨, μλ§λ Component (μΌμ’ μ HOC)λ₯Ό λ°ννλ κ²μ λλ€.
({context})=>
context.parent("context expression",
context2=><Child prop={context2.evaluate("sub-expression")} context={context2} />)
Childλ λ€μ context.parent () νΈμΆμ ν¬ν¨ ν μ μμ΅λλ€.
λ¬Όλ‘ parent ()λ λ°ννλ κ΅¬μ± μμμ render ()μμ 컨ν μ€νΈ Consumerλ₯Ό μ¬μ©ν μ μμΌλ―λ‘ μ»¨ν μ€νΈ μνμ μμ ν μ μμ΅λλ€.
()=>
parent("context expression",
context2=><Child prop={context2.evaluate("sub-expression")} />)
_ μ¬κΈ°μ λ¬Έμ λ componentκ°λλ parent ()λ React 컨ν μ€νΈμ μ‘μΈμ€ ν μ μμ§λ§, Evaluation ()μ Component_λ₯Ό λ°ννμ§ μλ ν React 컨ν μ€νΈμ μ‘μΈμ€ ν μ μλ€λ κ²μ λλ€.
μ€μ λ‘ μμ±μ μ€μ νλ €κ³ ν λλ λΆκ°λ₯ν©λλ€.
λ°λΌμ μΈλΆ μ»΄ν¬λνΈμμ React 컨ν μ€νΈμ μ‘μΈμ€νλ κ²μ΄ μ΄μμ μ΄λΌκ³ μκ°ν©λλ€. κ°μ κ²
React.getContext(Consumer, data=> ...)
λ΄κ° μ³λ€λ κ²μ κΈ°μ΅νλ€λ©΄, μ΄κ²μΌλ‘ μ΄λ €μμ κ²ͺμ λ ν μ€νΈ νλ μ μν¬λ₯Ό μ¬μ©νμ¬ μλμΌλ‘ Consumer.render ()λ₯Ό νΈμΆνλ €κ³ μλνμ§λ§ μλ―Έμλ κ²μ μ»μ§ λͺ»νμ΅λλ€.
μΆμ : μμ 첫 λ²μ§Έ νκΈ°λ²μ μνΈμ²λΌ λ³΄μΌ μ μμ§λ§ μ€μ λ‘λ νμ¬ JSP νμμ λ§€μ° μ΅μνλ―λ‘ μ¬μ©μμκ² ν맀 ν μ μλ€κ³ μκ°ν©λλ€. :)
<context:parent ctx="context-expression">
HTML...<context:evaluate expr="sub-expression" />...HTML
</context:parent>
μ΄κ²μ΄ μμ£Ό λμ€λ κ²μ²λΌ 보μ΄μ§ μκΈ° λλ¬Έμ λ«μ΅λλ€.
κ°μ₯ μ μ©ν λκΈ
λ¬Έμ λ
cloneElement
(컨ν μ€νΈμ λν νΉλ³ν λ Όλ¦¬κ° μμ)κ° μλλΌprops.children
(μ΄ κ²½μ° ν¨μ)λ₯ΌChildren.map()
μ λ¬νλ€λ κ²μ λλ€. (κΈ°λ₯μ κΈ°λνμ§ μμ).Children.map
λ μΌλ° React λ Έλμμλ§ μλν©λλ€.μλ§λ
Children.map
λ React λ Έλκ° μλ κ²μ λ°κ²¬νλ©΄ κ²½κ³ λ₯Ό νμ ν μ μμ΅λλ€.λ κ²½μ° λͺ¨λ Reactκ° μ€κ³λμ§ μμ μμ μ μννλ €λ κ²μ²λΌ λ€λ¦½λλ€. μ μ΄κ²μ΄ νμν©λκΉ?