Отрисовка компонента React на экспресс-маршруте

У меня есть приложение, которое использует экспресс-сервер и интерфейс create-react-app. Структура выглядит так. (Не включая все файлы в структуре - только те, которые имеют значение)

Client-
     build
     etc
     public
     src-
         assets
         components- 
                 landing-
                    landing.js
                 github-
                    github.js
                 steam-
                    steam.js
         App.js
         index.js
routes-
     routes.js
index.js

Мой файл index.js запускает экспресс-сервер и выглядит следующим образом:

const express = require( 'express' );

const app = express();
const PORT = process.env.PORT || 5000;

require('./routes/routes')( app );

app.use( express.static( 'client/build' ));

app.listen( PORT, () => {
    console.info( "Server is running on port 5000 " );
});

Файл маршрута на стороне сервера выглядит следующим образом:

module.exports = ( app ) => {

    app.get( '/', ( req, res ) => {
        console.info("Hello");
        res.send( "Hello" );
    });

    app.get( '/steam', ( req, res ) => {
        res.send( "Place for Steam!!");
    });

    app.get( '/github', ( req, res ) => {
        res.send("Place for Github!!");
    });
}

Мой файл app.js

class App extends Component {
    render() {
        return (
            <div className = "App">
                <BrowserRouter>
                    <div className = "container">
                        <Route path = "/" component = { Landing }/>
                        <Route path = "/steam" exact component = { Steam } />
                        <Route path = "/github" exact component = { Github } />
                    </div>
                </BrowserRouter>
            </div>

        );
    }
}

export default App;

На стороне клиента мой основной файл в файле landing.js выглядит следующим образом.

class Landing extends Component{
    render(){
        return(
            <div className = "container">
                <div className = "row">
                    <div className = "col-md-6">
                        <div className = "bg">
                            <img src = "https://www.bleepstatic.com/content/hl-images/2016/12/23/Steam-Logo.jpg" alt = "" />
                            <div className = "overlay">
                                <a href = "/steam" className = "custombutton custombutton-white custombutton-big">Steam Info</a>
                            </div>
                        </div>
                    </div>
                    <div className = "col-md-6">
                        <div className = "bg">
                            <img src = "https://linuxforlyf.files.wordpress.com/2017/10/github-universe1.jpg" alt = "" />
                            <div className = "overlay">
                                <a href = "/github" className = "custombutton custombutton-white custombutton-big">Github Info</a>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        )
    }
}

export default Landing;

В приведенном выше компоненте меня интересует тег a, который ведет к экспресс-маршруту /steam или /github, что является преднамеренной причиной, по которой я хочу перезагрузить страницу, и на странице я получаю только данные res.send, что делает смысл, потому что это экспресс-маршрут. Но я хочу визуализировать свой компонент steam по маршруту /steam. (то же самое с github). Я надеялся, что мой BrowserRouter в App.js изменит компонент в зависимости от маршрута, но это не так. Я получаю только экспресс-данные. Как я могу визуализировать мой компонент реакции Steam на маршруте express'/steam'. Ясно, что я странным образом смешиваю серверную и клиентскую стороны.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
6 596
1

Ответы 1

Просто используйте res.render('index'); для всех внутренних маршрутов.

Здесь мы создаем одностраничное приложение с реакцией, что означает, что есть только один файл записи (только один файл html, обычно index.html), страница отображается по-разному, потому что наш код js проверяет URL-адрес и решает, что показывать (какой путь к веб-интерфейсу к использовать). Все они происходят после того, как браузер получает файл html вместе с включенными файлами js / css. Все, что должен сделать бэкэнд при получении запроса страницы, - это отправить тот же файл html (и файлы js / css после того, как html проанализирован браузером). Конечно, для запросов data / xhr и недействительных запросов нам необходимо отправить данные и 404.html соответственно.

Это не одностраничное приложение. Я делаю это многостраничным приложением. Я пытаюсь перенаправить на маршрут "/ steam" с помощью тега <a>, а затем отобразить там компонент "Steam" (я сделаю этот компонент Steam чем-то вроде одностраничного приложения, так что похоже, что каждый экспресс-маршрут будет иметь один страничное приложение, такое как github, steam и т. д.).

kinny94 10.04.2018 19:01

@kiiiiNNNNNNNNNyyyy это похоже, просто позвольте внутренним маршрутам возвращать страницу, содержащую точку монтирования внешнего интерфейса, например у вас есть DOM-узел #steam в steam.html и ReactDOM.render(<SteamPage/>, document.getElementById('steam')); для вашего внешнего интерфейса, затем верните steam.html для /steam на внутреннем интерфейсе. Но это может быть необязательно, вы можете просто собрать их вместе в index.html во внешнем интерфейсе и использовать React-Router, чтобы контролировать, какой контент отображать, когда ссылка ведет пользователя на разные страницы.

PanJunjie潘俊杰 11.04.2018 09:03

@PanJunjie 潘俊杰, который должен работать в многостраничной системе, но я использую одностраничное приложение, так что там делать?

akshay kishore 15.11.2018 07:51

@akshaykishore Это должно быть то, о чем мой ответ, но ответ и приведенный выше комментарий имеют довольно похожие решения. Короче говоря, «пусть бэкэнд вернет правильный HTML».

PanJunjie潘俊杰 16.11.2018 11:01

Другие вопросы по теме