2017-09-26 3 views
0

예를 들어, <Foo />, <Bar /><Baz />과 같이 명명 된 반응 구성 요소의 배열을 렌더링하려고합니다.JSX 요소의 배열을 렌더링하는 방법 (React 구성 요소)

const rendered = []; 
const getItems = this.props.itemslist.map((item, key) => { 
const TYPE = item.type; 
rendered.push(<TYPE data-attributes={attributes} key={key} />); 
}); 
return (
    <Grid> 
    <Row> 
    {rendered} 
    </Row> 
    </Grid> 
); 

내 배열을 반복 할 수 있으며 콘솔에서 요소의 배열을 볼 수 있지만, 그들은 빈 HTML 요소 "<foo></foo><bar></bar><baz></baz>", 그리고 실제 구성 요소로 렌더링됩니다. 왜 이런 일이 일어나고, 무엇보다 중요한 것은 어떻게 구성 요소를 렌더링 할 수 있습니까?

+0

방금 ​​시도한 코드를 –

+0

에 추가하십시오. 찾고 주셔서 감사합니다 :-) – brainstormtrooper

+0

'item.type'이란 무엇입니까? 'item.type'은 문자열입니까? –

답변

0

import Foo from './Foo'; 
import Bar from './Bar'; 

[ { type: Foo, }, { type: Bar, }, { type: Baz}] 

UPDATE처럼 item.type에서 구성 요소 대신 문자열을 사용한다 : 당신이 사전에 구성 요소를 참조 할 수없는 경우

다음 구성 요소로 문자열을 변환 매핑 객체를 사용 이와 같은 참조

import Foo from './Foo'; 
import Bar from './Bar'; 

const mapper = { 
    Foo: Foo, 
    Bar: Bar, 
} 

// Then use it like this 

const getItems = this.props.itemslist.map((item, key) => { 
    const Type = mapper[item.type]; 
    rendered.push(<Type data-attributes={attributes} key={key} />); 
}); 
+0

하지만 내가 설정 파일을로드 할 때까지 무엇을 가져올 지 모르겠다 ... – brainstormtrooper

+0

@brainstormtrooper 잘 모르겠다 내가 잡았어. 내 요점은 문자열에서, 당신은 구성 요소를 렌더링 할 수 없다는 것입니다. 구성 요소 참조가없는 경우 문자열을 구성 요소에 매핑하는지도 객체를 만듭니다. –

+0

@brainstormtrooper이 부분을 참조하십시오 https://github.com/facebook/react/issues/3365 –

0

첫 번째 실수는 잘못된 e가 .map이다. .map은 각 배열 요소를 탐색하고 변경합니다. 지금은 .forEach 인 것처럼 사용하고 있습니다.

코드는 더 다음과 같아야합니다

const getItems = this.props.itemslist.map((item, key) => { 
    const TYPE = item.type; 
    return <TYPE data-attributes={attributes} key={key} /> 
}); 
0

동적 이름으로 반작용 요소를 만들기위한 React.createElement를 사용할 수 있습니다. 또한 해당 구성 요소를 가져와야합니다.

const rendered = []; 
const getItems = this.props.itemslist.map((item, key) => { 
    const component = React.createElement(item.type, {data-attributes: attributes, key: key}, null); 
    rendered.push(component); 
}); 
return (
    <Grid> 
    <Row> 
    {rendered} 
    </Row> 
    </Grid> 
); 
+0

감사합니다. 나는 그것을 시도했다. 그러나 나는 같은 결과를 얻는다 :-( – brainstormtrooper

+0

당신은 upperCase 문자로 시작하는 문자열이 아니면 그렇지 않으면 반응 성분으로 취급되지 않을 것이다. –

관련 문제