У меня есть один файл (мастер), который вызывает другой файл (загружается) с помощью jquery.load().
В загруженном файле работает javascrips, но код jsx игнорируется.
Можно ли загрузить код jsx таким образом? Если да, то как?
Если нет, то какие у нас альтернативы - как обрабатывать jsx-код в загружаемых файлах?
Код главной страницы:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>React</title>
<script src="https://fb.me/react-with-addons-0.13.2.js"></script>
<script src="https://fb.me/JSXTransformer-0.13.2.js"></script>
<script src="https://code.jquery.com/jquery-1.10.0.min.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$("#loaded").load("loaded.html", function(responseText, textStatus, req) {});
});
</script>
</head>
<body>
<p>Master page</p>
<div id="loaded"></div>
</body>
</html>
Код загруженной страницы:
<script type="text/javascript">
console.log("JQUERY WORKS");
</script>
<script type="text/jsx">
console.log("REACT WORKS");
</script>
<p>loaded page</p>
Изменение: что я пытаюсь выполнить: я работаю над веб-приложением, которое загружает "фрагменты страницы" с загрузкой jquery, и мне нужно отобразить компонент React внутри этого фрагмента.
С React такой рабочий процесс не кажется правильным. Лучшим подходом является (например):
установить реактивные инструменты
npm установить -g реактивные инструменты
разрабатывать компоненты в.jsx файлах в (например) папке jsx
автоматически компилировать jsx, если отредактирован в.js файлы на (например) папку js с помощью команды console
jsx --extension jsx --watch jsx/js/
использовать.js файлы в веб-приложении
Вы должны отделить логику JS/jQuery от логи React
Я бы посоветовал вам создать не-React программу поверх вашего приложения, чтобы управлять вашими фрагментами
Прочитайте этот пост первые предложения о извлекая и Eval uating dynamicaly загружен сценарий и о вставке <script>
теги, указывающие на самостоятельной работы компонента (см после решения 2)
Решение 1:
// index.js
import React from 'react'
import { render } from 'react-dom'
$(() => {
window.components = {}
window.loadComponent = componentKey =>
fetch('/components/${ componentKey }')
.then(response => response.text())
.then(text => {
window.components[componentKey] = eval(text)
render(window.components[componentKey],
document.getElementById('anchor-${ componentKey }'))
})
В лучшем подходе использовался бы подход Redux для обеспечения как единого источника правды, так и односторонних принципов работы с данными
Решение 2 Здесь мы инкапсулируем наш компонент с простой логикой рендеринга
Теперь компонент можно связать в вашей DOM с помощью <script>
// fragment-bundle.js
import React from 'react'
import { render } from 'react-dom'
import Fragment from './Fragment/Fragment'
render(<Fragment/>, document.getElementById('anchor-fragment'))
Не уверен, что вы пытаетесь сделать здесь, но трансформатор JSX поставляется с методом преобразования, поэтому вы можете попробовать что-то вроде:
$.get('loaded.html', function(jsx) {
var transformed = JSX.transform(jsx);
$('#loaded').html('<script>'+transformed.code+'</script>');
})