React: μ»¨ν…μŠ€νŠΈ μ†ŒλΉ„μžμ˜ μžμ‹μ„ λ³΅μ œν•˜λ©΄ ν˜Όλž€μŠ€λŸ¬μš΄ κ²½κ³  및 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€.

에 λ§Œλ“  2018λ…„ 04μ›” 25일  Β·  4μ½”λ©˜νŠΈ  Β·  좜처: facebook/react

κΈ°λŠ₯ 을 μš”μ²­ν•˜κ±°λ‚˜ 버그λ₯Όλ³΄κ³  ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?
이것은 λ²„κ·Έμ΄κ±°λ‚˜ 적어도 더 μ •ν™•ν•œ κ²½κ³  및 였λ₯˜ λ©”μ‹œμ§€μ— λŒ€ν•œ μš”μ²­μž…λ‹ˆλ‹€.

ν˜„μž¬ 행동은 λ¬΄μ—‡μž…λ‹ˆκΉŒ?

일뢀 속성을 μΆ”κ°€ν•˜κΈ° μœ„ν•΄ μžμ‹μ„ λ³΅μ œν•˜κ³  μžˆμ—ˆλŠ”λ° μ»¨ν…μŠ€νŠΈ 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둜 ν…ŒμŠ€νŠΈλ˜μ—ˆμŠ΅λ‹ˆλ‹€.

Question

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

λ¬Έμ œλŠ” cloneElement (μ»¨ν…μŠ€νŠΈμ— λŒ€ν•œ νŠΉλ³„ν•œ 논리가 μ—†μŒ)κ°€ μ•„λ‹ˆλΌ props.children (이 경우 ν•¨μˆ˜)λ₯Ό Children.map() μ „λ‹¬ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. (κΈ°λŠ₯을 κΈ°λŒ€ν•˜μ§€ μ•ŠμŒ). Children.map λŠ” 일반 React λ…Έλ“œμ—μ„œλ§Œ μž‘λ™ν•©λ‹ˆλ‹€.

μ•„λ§ˆλ„ Children.map λŠ” React λ…Έλ“œκ°€ μ•„λ‹Œ 것을 λ°œκ²¬ν•˜λ©΄ κ²½κ³ λ₯Ό ν‘œμ‹œ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

두 경우 λͺ¨λ‘ Reactκ°€ μ„€κ³„λ˜μ§€ μ•Šμ€ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ €λŠ” κ²ƒμ²˜λŸΌ λ“€λ¦½λ‹ˆλ‹€. μ™œ 이것이 ν•„μš”ν•©λ‹ˆκΉŒ?

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

λ¬Έμ œλŠ” 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>

이것이 자주 λ‚˜μ˜€λŠ” κ²ƒμ²˜λŸΌ 보이지 μ•ŠκΈ° λ•Œλ¬Έμ— λ‹«μŠ΅λ‹ˆλ‹€.

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