Использование статического HTML с реакцией

Я изучаю, как использовать React, и до сих пор мне это очень нравится. Однако я столкнулся с некоторой проблемой.

Как практика с React, я пытаюсь создать меню навигации, в котором отображается различный контент на основе активного элемента или вкладки. Эти разные взгляды будут, для моих целей, статичными по своей природе, в основном информативными, с некоторыми встроенными аудио или видео. Но в каждом представлении может быть много контента. Для меня имеет смысл создавать отдельные HTML файлы и использовать их контент в этих разных представлениях. Однако единственный способ сделать это без использования внешней библиотеки - статический контент для каждого представления в своем собственном компоненте React, который ничего не делает, но визуализирует этот статический контент.

Мне это кажется глупым. Есть ли способ сделать то, что я пытаюсь сделать в React? Если нет, есть ли там легкая или широко используемая библиотека, которая позволит мне это сделать? Спасибо заранее!

Ответы

Ответ 1

Если вы хотите загрузить весь html во время загрузки страницы, вы должны динамически создать script в процессе сборки или сервере:

var PAGE_HTML={"page1.html": "...","page2.html":"..."};

Вы можете сделать это в node для каталога, подобного этому:

var readAll = require('read-dir-files').read;
readAll('./pages', 'utf-8', false, function(err, files){
    if (err) return doSomething(err);

    fs.writeFile('dist/pages.js', "var PAGE_HTML=" + JSON.stringify(files), function(err){
        // ...
    });
});

В React вы можете иметь такую ​​структуру:

var App = React.createClass({
    getInitialState: function(){ return {page: "page2.html"} },
    navigate: function(toPage){
        this.setState({page: toPage})
    },
    render: function(){
        return <div>
            <ul>
                <li onClick={this.navigate.bind(null, "page1.html")}>Page 1</li>
            </ul>
            <div dangerouslySetInnerHTML={{__html: PAGE_HTML[this.state.page]}} />
        </div>;
    }
});

Боковое замечание: нет ничего плохого в том, что у вас есть компоненты React для контента страницы, это просто не лучший формат для всех типов контента. Если вам нужна страница, на которой у вас будет много интерактивных компонентов, тогда может быть смысл представить ее как компонент.

Ответ 2

Недавно у нас была аналогичная проблема с попыткой интегрировать статический HTML в наше приложение React (в этом случае HTML был шаблоном, в который в него были бы включены компоненты React, поэтому он был потенциально более сложным, чем ваша ситуация). Как и вы, мы хотели иметь возможность создавать необработанный HTML (чтобы он мог быть сгенерирован стандартными инструментами).

Коллега создала эту библиотеку для выполнения задачи:

https://github.com/mikenikles/html-to-react

Он анализирует дерево HTML, преобразуя его в "дерево реакций", которое вы можете внедрить в компонент React. Это позволяет избежать использования опасноSetInnerHtml и не требует предварительной обработки времени сборки в HTML.