Ну шаблоны JSX в сравнении с компонентами Vue - земля и небо. Даже если это будет x-template - все равно.
Всем кому не нравится jsx - вопрос - как бы вы написали бы без всяких фремворков на чистом жс? Вот самый дефолтный ванилла-жс способ без (всяких фрефмворков и библиотек) что-то отрендерить в браузере
function App(state){
return `
<div>
<div>hello ${state.name}</div>
${SumComponent(state.obj)}
</div>
`
}
function SubComponent(obj){
return `<div>${obj.text}</div>`
}
var state = {name: 'world', obj: {text: 'test'}}
document.body.innerHtml(App(state))Кто-то возращать против такого подхода? Смесь верстки и жс это то что изначально предоставляет браузер а всякие шаблоны это уже абстракции (притом неудачные). Вся суть реакта и его jsx - это просто более производительная версия примера выше. Все что делает реакт в отличии от версии выше это два маленьких шага:
1) это замена медленного .innerHtml на создаие элементов через document.createElement .createTextNode и .insertBefore
function App(state){
var el = document.createElement('div');
var el1 = document.createElement('div'); el.appendChild(el1)
el1.appendChild(document.createTextNode(state.name))
el.appendChild(SubComponent(state.obj))
return root;
}
function SubComponent(obj){
var el = document.createElement('div');
el.appendChild(document.createTextNode(obj.text)
return el
}
var state = {name: 'world', obj: {text: 'test'}}
document.body.appendChild(App(state))2) Замена медленного создания нейтив-элементов(через .createElement) и их замены при обновлении на обычные js -объекты которые передаются рендер-функции которая просто сравнит и создаст или обновит нужные элементы
function App(state){
return {
tag: 'div',
children: [
{tag: 'div', children: [state.name]}
SumComponent(state.obj)
]
};
}
function SubComponent(obj){
return {tag: div', children: [obj.text]}
}
var state = {name: 'world', obj: {text: 'test'}}
render(App(state), document.body)То есть, грубо говоря, все чем отличается реакт с jsx первоначальной ванилла-жс версии это только оптимизация скорости.
Если в той первой версии убрать кавычки и вместо .innerHtml написать ReactDOM.render и получите валидную версию реакт-компонент.