React Router в Laravel

Я пытаюсь создать проект Laravel с использованием ReactJS. Я сделал показать данные в таблице. Однако, когда я добавляю некоторые ссылки, такие как Создать, изменить, удалить... , возникают некоторые ошибки:

- Failed context type: The context `router` is marked as required in `Link`, but its value is `undefined`.
- Uncaught Error: You should not use `Link` outside a `Router`

Так:

  1. Я создал RoutePath.js только для создания маршрутов, но не знаю, как их импортировать в Example.js.
  2. При нажатии кнопки «Добавить страницу», «Редактировать страницу...» выполняется перенаправление на пустую страницу, а не ниже домашней страницы. Однако кажется, что страница добавления будет ниже главной страницы.

Я новичок, поэтому, пожалуйста, помогите мне. Спасибо. Вот мой код:

Пример.js

import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import axios from 'axios';
import {Link} from "react-router-dom";
import CreatePost from './CreatePost';
import RoutePath from '../routes/RoutePath';

...

postRow(p){
        return (
            <tr key = {p.id}>
                <td>{p.title}</td>
                <td>{p.description}</td>
                <td><Link to='/edit'></Link></td>
                <td><Link to='/delete'></Link></td>
            </tr>
        )
    }

    render() {
        const posts = this.state.posts.map(post => this.postRow(post));
        return (
                <div>
                    <table border = "1">
                        <thead>
                        <tr>
                            <th>Title</th>
                            <th>Description</th>
                            <th></th>
                            <th></th>
                        </tr>
                        </thead>
                        <tbody>
                        { posts }
                        </tbody>
                    </table>
                    <div>
                        <Link to='/add-post'>Add</Link>
                    </div>
                </div>

        );
    }
}
ReactDOM.render(
    <Example />
    , document.getElementById('homepage')
);

RoutePath.js

import React, {Component} from 'react';
import { Route, BrowserRouter } from "react-router-dom";
import CreatePost from '../components/CreatePost';
import Example from '../components/Example';

export default class RoutePath extends Component{
    render(){
        return(
            <BrowserRouter>
                    <div>
                        <Route exact path='/' component = {Example}/>
                        <Route path='/add-post' component = {CreatePost}/>
                        <Route path='/edit' component = {Edit}/>
                    </div>
            </BrowserRouter>
        )
    }
}

Вы пытаетесь рендерить <Example /> непосредственно в Example.js, вместо этого вы должны позволить ему рендериться из RoutePath, поскольку он завернут в маршрутизатор.

apokryfos 01.03.2019 11:51
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
1
3 321
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий
  1. В RoutePath вам нужно импортировать Switch из 'react-router-dom' сначала.
  2. Тогда вы не должны рендерить в Example, иначе вы должны рендерить в RoutePath
  3. Вам нужно перенаправить приложение JS на RoutePath в вашем app.js.

app.js

require('./homeComponents/RoutePath');

RoutePath.js

import React, {Component} from 'react';
import ReactDOM from 'react-dom';
import { Route, BrowserRouter, Switch } from "react-router-dom";
import CreatePost from '../components/CreatePost';
import Example from '../components/Example';

export default class RoutePath extends Component{
    render(){
        return(
            <BrowserRouter>
                    <Switch>
                        <Route exact path='/' component = {Example}/>
                        <Route path='/add-post' component = {CreatePost}/>
                        <Route path='/edit' component = {Edit}/>
                    </Switch>
            </BrowserRouter>
        )
    }
}
ReactDOM.render(
    <RoutePath />
    , document.getElementById('homepage')
);

Пример.js

import React, { Component } from 'react';
import axios from 'axios';
import {Link} from "react-router-dom";
import CreatePost from './CreatePost';
import RoutePath from '../routes/RoutePath';

postRow(p){
        return (
            <tr key = {p.id}>
                <td>{p.title}</td>
                <td>{p.description}</td>
                <td><Link to='/edit'></Link></td>
                <td><Link to='/delete'></Link></td>
            </tr>
        )
    }

    render() {
        const posts = this.state.posts.map(post => this.postRow(post));
        return (
                <div>
                    <table border = "1">
                        <thead>
                        <tr>
                            <th>Title</th>
                            <th>Description</th>
                            <th></th>
                            <th></th>
                        </tr>
                        </thead>
                        <tbody>
                        { posts }
                        </tbody>
                    </table>
                    <div>
                        <Link to='/add-post'>Add</Link>
                    </div>
                </div>

        );
    }
}

Итак, в основном поток здесь:

  1. Веб-пакет пытается скомпилировать app.js в /public/js по умолчанию.
  2. Для app.js требуется RoutePath, который содержит все ваши данные маршрутизации.
  3. RoutePath пытался отобразить весь ваш компонент, который у вас есть в корне ('/'), и он отобразил Example
  4. Компонент был преобразован в 'homepage' id в вашем лезвии.

Я понимаю. Большое спасибо!

Huy Hoàngg 02.03.2019 12:04

Могу я задать еще один вопрос? Когда я добавляю сообщение и нажимаю кнопку «Добавить», я хочу, чтобы оно автоматически перенаправлялось на домашнюю страницу или любую страницу, которую я хочу, так как я могу это сделать? Я искал в Интернете и нашел «browserHistory» от «react-router», но похоже, что его не существует из-за новой версии React.

Huy Hoàngg 02.03.2019 12:22

Если вы визуализируете объект <Redirect/>, когда вам нужно перенаправить его, он должен работать.

apokryfos 02.03.2019 13:00

Это работает для меня... Мое единственное представление для моего одностраничного приложения — home.blade.php, и я использую BrowserRouter в своем App.js

Route::get('/', function () {
    return view('home');
});

Route::get('/{route}',function(){
    return view('home');
});

Это позволит вам перейти на http://локальный/ и получить домашнюю страницу приложения или http://localhost/о нас и получить маршрут «о нас».

Это лучший метод, чем использование HashRouter, который выглядел бы немного уродливее: http://localhost/#/о нас

Чтобы добавить к тому, что предложил @manley13. Вы также можете сделать это одним вызовом get:

Route::get('/{route?}',function(){
    return view('home');
});

? делает route необязательным.

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