반응형
리액트 컴포넌트를 동적으로 작성하다
데이터와 함께 전달된 인수에 따라 다른 구성 요소를 렌더링하려고 합니다.일반 또는 React.createElement(Item)를 사용하면 정상적으로 동작하지만 다른 옵션은 모두 실패합니다.
http://jsfiddle.net/zeen/fmhhtk5o/1/
var React = window.React;
var data = {items: [
{ itemClass: 'Item', id: 1, contentsHTML: '', text: 'Item 1'},
{ itemClass: 'Item', id: 2, contentsHTML: '', text: 'Item 2'},
{ itemClass: 'Item', id: 3, contentsHTML: '', text: 'Item 3'},
{ itemClass: 'Item', id: 4, contentsHTML: '', text: 'Item 4'},
{ itemClass: 'Item', id: 5, contentsHTML: '', text: 'Item 5'}
]};
var MyCatalog = React.createClass({
getInitialState: function() {
return { data: { items: [] } };
},
componentDidMount: function () {
this.setState({ data: this.props.data });
},
render: function () {
return (
<div className="catalog">
HELLO!!! I AM A CATALOG!!!
<ItemList data={this.state.data}/>
</div>
);
}
});
var ItemList = React.createClass({
render: function () {
console.log(this.props);
var items = this.props.data["items"].map(function (itemData) {
var klass = itemData['itemClass'] || 'Item';
var ItemFactory = React.createFactory(klass);
//return <ItemFactory key={itemData['id']} data={itemData}/> // no
//return <klass key={itemData['id']} data={itemData}/> // no
//return React.createElement(klass, { key: itemData['id'], data: itemData }); // no
//return <Item data={itemData}/> // ok
//return React.createElement(Item, { data: itemData }); // ok
//return React.createElement('Item', { key: itemData['id'], data: itemData }); // no
//return React.createElement(React.createFactory('Item'), { data: itemData }); // no, error
var component = Components['itemClass'];
return <component data={itemData} key={itemData['id']}/>
});
console.log(items);
return (
React.createElement('div', { className: 'list' },
React.createElement('div', null, 'And I am an ItemList :'),
React.createElement('div', null, items)
)
/*<div className="list">
<div>And I am an ItemList :</div>
<div>
{items}
</div>
</div>*/
);
}
});
var Item = window.Item = React.createClass({
render: function () {
return (
<div className="item">
<div>
Regular item. Nothing special.
</div>
{this.props.children}
</div>
);
}
});
var Components = { 'Item': Item };
React.render(
<MyCatalog data={data}/>,
document.getElementById('app')
);
다양한 종류의 컴포넌트에서 이 케이스를 관리하려면 어떻게 해야 합니까?
이 조작은 유효합니다.
var component = Components[itemData['itemClass']]);
return React.createElement(component, {
data: itemData,
key: itemData['id']
});
이렇게 JSX 구문을 사용할 수 없습니다.<component .../>
왜냐하면 그게 전사가 되면component
아무 것도 언급하지 않을 겁니다
업데이트: 업데이트된 ItemList 컴포넌트 전체는 다음과 같습니다.
var ItemList = React.createClass({
render: function() {
console.log(this.props);
var items = this.props.data["items"].map(function(itemData) {
var component = Components[itemData['itemClass']];
return React.createElement(component, {
data: itemData,
key: itemData['id']
});
});
console.log(items);
return (
<div className="list">
<div>And I am an ItemList</div>
<div>{items}</div>
</div>
);
}
});
이 바이올린으로 동작하고 있는 것을 알 수 있습니다.http://jsfiddle.net/fmhhtk5o/3/
받아들여진 답변은 완전히 정확하지 않고 지나치게 복잡하다.
이 <component .../>와 같은 JSX 구문은 사용할 수 없습니다.이는 컴포넌트가 전치될 때 컴포넌트는 아무것도 참조하지 않기 때문입니다.
이 문제를 피하려면 변수 이름을 대문자로 입력하십시오.
const component = ({ChildClass}) => {
return <ChildClass />
}
언급URL : https://stackoverflow.com/questions/31234500/create-react-component-dynamically
반응형
'programing' 카테고리의 다른 글
Jest 설정 "SyntaxError:예기치 않은 토큰 내보내기" (0) | 2023.03.26 |
---|---|
Yoman for Angular 그러면 Grunt serv가 안 돼 (0) | 2023.03.26 |
스프링 부트 실행 시 IntelliJ 프로세스가 종료 코드 0으로 종료됨 (0) | 2023.03.26 |
REST API 베스트프랙티스: 쿼리 문자열의 arg와 요구 본문의 arg (0) | 2023.03.26 |
jq를 사용하여 문자열을 JSON 파일에서 정수로 변환하려면 어떻게 해야 합니까? (0) | 2023.03.26 |