React: cloneElement와 ν•¨κ»˜ μ œκ³΅λ˜λŠ” ν•„μˆ˜ μ†Œν’ˆμ€ μ—¬μ „νžˆ β€‹β€‹μ½˜μ†”μ— κ²½κ³ λ₯Ό ν‘œμ‹œν•©λ‹ˆλ‹€.

에 λ§Œλ“  2015λ…„ 07μ›” 27일  Β·  3μ½”λ©˜νŠΈ  Β·  좜처: facebook/react

μ΄ν•΄ν•˜κΈ° 쉽도둝 예제λ₯Ό μž‘μ„±ν–ˆμ§€λ§Œ 기본적으둜 "ν•„μˆ˜ props λˆ„λ½"으둜 인해 μ½˜μ†”μ— κ²½κ³ κ°€ ν‘œμ‹œλ©λ‹ˆλ‹€.

propsλŠ” React.cloneElement κ°€ μžˆλŠ” μš”μ†Œμ— μ œκ³΅λ˜λ―€λ‘œ λˆ„λ½λœ props에 λŒ€ν•œ κ²½κ³ λ₯Ό κΈ°λŒ€ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 이것이 극단적 인 경우 일 수 μžˆλ‹€λŠ” 것을 μ΄ν•΄ν•©λ‹ˆλ‹€ ...

https://jsfiddle.net/kdsvgbzu/1/

<A name="name" value="value">
    <B></B>
</A>
class A extends React.Component {
    render() {
        return (
            <div>
                {React.Children.map(this.props.children, function(child) {
                    return React.cloneElement(child, {
                        name: this.props.name,
                        value: this.props.value
                    });
                }, this)}
            </div>
        );
    }
}

A.propTypes = {
    name: PropTypes.string.isRequired,
    value: PropTypes.string.isRequired
};

class B extends React.Component {
    render() {
        return <span>{this.props.name} : {this.props.value}</span>;
    }
}

B.propTypes = {
    name: PropTypes.string.isRequired,
    value: PropTypes.string.isRequired
};

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

@tleunen μ‹€μ œ μ‚¬μš© 사둀가 무엇인지 λͺ¨λ₯΄κ² μ§€λ§Œ μžμ‹μ—κ²Œ μ†Œν’ˆμ„ 전달할 μ±…μž„μ΄ μžˆλŠ” μž¬μ‚¬μš© κ°€λŠ₯ν•œ ꡬ성 μš”μ†Œλ₯Ό κ΅¬ν˜„ν•˜λŠ” λ™μ•ˆ 이 문제λ₯Ό λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€.

ReactDOM.render(
   <NumberSelector>
    <ComponentRequiringTheNumber />
  </NumberSelector>
)

κ²°κ΅­, λ‚˜λŠ” 더 μš°μ•„ν•œ μ†”λ£¨μ…˜μ΄λΌλŠ” 것을 λ°œκ²¬ν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.

ReactDOM.render(
   <NumberSelector>
    {({number}) => <ComponentRequiringTheNumber number={number} />}
  </NumberSelector>
)

ComponentRequiringTheNumber 의 쒅속성이 λͺ…μ‹œμ μ΄κ³  NumberSelector 의 역할이 λͺ…확해지기 λ•Œλ¬Έμ— 훨씬 더 μ’‹μ•„ν•©λ‹ˆλ‹€. 이런 μ‹μœΌλ‘œ μ€‘μ²©λœ ꡬ성 μš”μ†Œμ— 제곡된 μ†Œν’ˆμ€ 관련이 μžˆμ„ λ•Œλ§Œ ν‰κ°€λ©λ‹ˆλ‹€.

λ°”μ΄μ˜¬λ¦°μ— 적용: https://jsfiddle.net/ap1e9rk3/1/

λͺ¨λ“  3 λŒ“κΈ€

이것은 μ˜λ„μ μž…λ‹ˆλ‹€. μš”μ†Œ 생성 μ‹œ props의 μœ νš¨μ„±μ„ κ²€μ‚¬ν•˜λ©΄ 더 μœ μš©ν•œ 였λ₯˜κ°€ μƒμ„±λ©λ‹ˆλ‹€. λ˜ν•œ Flow와 같은 정적 μœ ν˜• μ‹œμŠ€ν…œμ˜ λ™μž‘κ³Ό 더 λ°€μ ‘ν•˜κ²Œ μΌμΉ˜ν•©λ‹ˆλ‹€. ν˜„μž¬λ‘œμ„œλŠ” μ΄λŸ¬ν•œ μ†Œν’ˆμ„ 선택 μ‚¬ν•­μœΌλ‘œ ν‘œμ‹œν•˜λŠ” 것이 κ°€μž₯ μ’‹μŠ΅λ‹ˆλ‹€. λ˜ν•œ A와 같은 λΆ€λͺ¨μ—μ„œ B와 같은 μžμ‹μœΌλ‘œ μ†Œν’ˆμ„ μ „λ‹¬ν•˜λŠ” 또 λ‹€λ₯Έ 지원 방법을 μ œκ³΅ν•˜λŠ” μ»¨ν…μŠ€νŠΈλΌλŠ” κΈ°λŠ₯을 λ‚˜μ€‘μ— λ„μž…ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

그것이 λ‚΄κ°€ μƒκ°ν–ˆλ˜ κ±°μ£ . @spicyj 감사

@tleunen μ‹€μ œ μ‚¬μš© 사둀가 무엇인지 λͺ¨λ₯΄κ² μ§€λ§Œ μžμ‹μ—κ²Œ μ†Œν’ˆμ„ 전달할 μ±…μž„μ΄ μžˆλŠ” μž¬μ‚¬μš© κ°€λŠ₯ν•œ ꡬ성 μš”μ†Œλ₯Ό κ΅¬ν˜„ν•˜λŠ” λ™μ•ˆ 이 문제λ₯Ό λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€.

ReactDOM.render(
   <NumberSelector>
    <ComponentRequiringTheNumber />
  </NumberSelector>
)

κ²°κ΅­, λ‚˜λŠ” 더 μš°μ•„ν•œ μ†”λ£¨μ…˜μ΄λΌλŠ” 것을 λ°œκ²¬ν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.

ReactDOM.render(
   <NumberSelector>
    {({number}) => <ComponentRequiringTheNumber number={number} />}
  </NumberSelector>
)

ComponentRequiringTheNumber 의 쒅속성이 λͺ…μ‹œμ μ΄κ³  NumberSelector 의 역할이 λͺ…확해지기 λ•Œλ¬Έμ— 훨씬 더 μ’‹μ•„ν•©λ‹ˆλ‹€. 이런 μ‹μœΌλ‘œ μ€‘μ²©λœ ꡬ성 μš”μ†Œμ— 제곡된 μ†Œν’ˆμ€ 관련이 μžˆμ„ λ•Œλ§Œ ν‰κ°€λ©λ‹ˆλ‹€.

λ°”μ΄μ˜¬λ¦°μ— 적용: https://jsfiddle.net/ap1e9rk3/1/

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰