Динамическое отображение компонента React
в React JSX, похоже, невозможно сделать что-то вроде этого:
render: function() {
return (
<{this.props.component.slug} className='text'>
{this.props.component.value}
</{this.props.component.slug}>
);
}
Я получаю ошибку разбора: неожиданный токен {. Разве это не реакция? можете справиться?
я проектирую этот компонент так, чтобы под капотом значения, хранящиеся в this.props.component.slug
будет содержать допустимые элементы HTML (h1,p и т. д.). Есть ли способ заставить это работать?
4 ответов
вы не должны помещать компонент slug в фигурные скобки:
var Hello = React.createClass({
render: function() {
return <this.props.component.slug className='text'>
{this.props.component.value}
</this.props.component.slug>;
}
});
React.renderComponent(<Hello component={{slug:React.DOM.div, value:'This is my header'}} />, document.body);
вот рабочая скрипка:http://jsfiddle.net/kb3gN/6668/
кроме того, вы можете найти компилятор JSX полезным для отладки таких ошибок: http://facebook.github.io/react/jsx-compiler.html
Как ранее указывал nilgun, компонент slug не должен быть завернут в фигурные скобки.
Если вы решили сохранить его в переменной, убедитесь, что оно начинается с большой буквы.
вот пример:
var Home = React.createClass({
render: function() {
return (
<div>
<h3>This is an input</h3>
<CustomComponent inputType="input" />
<h3>This is a text area</h3>
<CustomComponent inputType="textarea" />
</div>
);
}
});
var CustomComponent = React.createClass({
render: function() {
// make sure this var starts with a capital letter
var InputType = this.props.inputType;
return <InputType />;
}
});
React.render(<Home />, document.getElementById('container'));
вот рабочая скрипка:https://jsfiddle.net/janklimo/yc3qcd0u/
Если вы намереваетесь ввести фактический компонент, вы можете сделать что-то вроде этого, что очень удобно для тестирования, или по какой-либо причине вы хотите динамически вводить компоненты для рендеринга.
var MyComponentF=function(ChildComponent){
var MyComponent = React.createClass({
getInitialState: function () {
return {
};
},
componentDidMount: function () {
},
render: function () {
return (
<div className="MyComponent">
<ChildComponent></ChildComponent>
</div>
);
}
});
return MyComponent;
};
var OtherComponentF=function(){
var OtherComponent = React.createClass({
getInitialState: function () {
return {
};
},
componentDidMount: function () {
},
render: function () {
return (
<div className="OtherComponent">
OtherComponent
</div>
);
}
});
return OtherComponent;
};
var AnotherComponentF=function(){
var AnotherComponent = React.createClass({
getInitialState: function () {
return {
};
},
componentDidMount: function () {
},
render: function () {
return (
<div className="AnotherComponent">
AnotherComponent
</div>
);
}
});
return AnotherComponent;
};
$(document).ready(function () {
var appComponent = MyComponentF(OtherComponentF());
// OR
var appComponent = MyComponentF(AnotherComponentF());
// Results will differ depending on injected component.
ReactDOM.render(React.createElement(appComponent), document.getElementById("app-container"));
});
редактировать: может быть, вы забыли добавить /** @jsx React.DOM */
в начале js?
можно использовать React.DOM
но:
render: function() {
return React.DOM[this.props.component.slug](null, this.props.component.value);
}
http://jsbin.com/rerehutena/2/edit?html,js, выход
Я не эксперт React, но я думаю, что каждый компонент должен быть построен с определенным тегом в начале. Таким образом, она могла бы представлять собой ясную цель.