Как вызвать компонент на JSX используя значение state?
У меня есть класс родитель, из которого вызывается компонент-ребёнок (вызов - ). Подскажите, пожалуйста, какой правильный синтаксис записи для вызова этого компонента, если его имя будет лежать в state. Например this.state = {component: Area}. А при вызове <{this.state.component}/> - не подходит
JSX тип не может быть выражением, а получение свойства объекта через точку - это тоже выражение.
Поэтому надо это выражение надо заранее вычислить и присвоить переменной. Обязательно с большой буквы (с маленькой буквы называются только заранее заданные теги).
Собственно прямо как написано в разделе документации ссылку на который я Вам уже давал.
Что-то в духе
render(){
let AreaComponent = components[this.state.component];
...
return <Calculated>
}
сomponents - это множество в котором Вы ваши компоненты по имени искать будете. Они же не из воздуха берутся. И структура которая магическим образом соотносит js строчку с каким-то js-объектом (реактовским классом с именем совпадающим со строчкой) все равно нужна. Видимо ваше затруднение лежит в том где ее эту структуру взять.
То есть грубо говоря вам нужен объект вида:
let components = {
'AwesomeComponent': AwesomeComponent,
'SuperComponent': SuperComponent,
'YetAnotherComponent': AwesomeComponent
}
Если Вы используете es6 модули и импортируете компоненты не одной пачкой, то склейка их в одну структуру ложится на вас, так как на текущий момент нельзя по имени обратиться к переменной содержащий весь скоуп модуля.
Логика по клику кнопки, но могут быть и другие события:
class Test extends React.Component {
constructor() {
super()
this.state = {
showArea: false
}
}
render(){
let child = this._getChild();
let areaNodes;
if(this.state.showArea) {
areaNodes = child;
}
return (
<div>
<button onClick={this._showChild.bind(this)}>Click to show child</button>
{areaNodes}
</div>
)
}
_showChild() {
this.setState({
showArea: !this.state.showArea
})
}
_getChild() {
return <TestChild />
}
}
class TestChild extends React.Component {
render() {
return (
<div>Hello</div>
)
}
}
ReactDOM.render(<Test />, document.getElementById('root'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>
Так в документации к реакту это расписано же. Имя компонента должно начинаться с большой буквы и не должно быть выражением.
const MyComponent = this.state.component;
return <MyComponent />
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
ЗдравствуйтеНужно сделать в Brackets, что бы тег перемещался через строчку, а писать можно было сразу между тегами с пробелами или табуляцией
Пользуюсь плагином jquery-confirm, по клику на элемент создаю вот такую форму:
ПриветХочу научиться работать с современными фронт-енд инструментами, но я что-то совершенно не могу найти ни одного человеческого мануала/скринкаста...