0

Я создаю веб-сайт, который будет иметь следующее:React не делает компонент с URL PARAM

  1. страницу, которая содержит список элементов.
  2. страница, которая будет показывать более подробную информацию о качестве отдельного элемента

Я использую react-router ^3.0.0, react-router-redux ^4.0.7 и webpack 2.1.0-beta.20 на сайте. Я пытаюсь настроить свои маршруты так:

import 'babel-polyfill'; 
import React from 'react'; 
import ReactDOM from 'react-dom'; 
import thunk from 'redux-thunk'; 
import {Router, Route, browserHistory} from 'react-router'; 
import {combineReducers, createStore, applyMiddleware} from 'redux'; 
import {Provider} from 'react-redux'; 
import {routerReducer, syncHistoryWithStore} from 'react-router-redux'; 
import {IntlProvider, intlReducer} from 'react-intl-redux'; 
import {addLocaleData} from 'react-intl'; 
import en from 'react-intl/locale-data/en'; 

import {Home} from './app/components/Home/Home'; 
import Profile from './app/components/Profile/Profile'; 
import Login from './app/components/Login/Login'; 
import SignUp from './app/components/SignUp/SignUp'; 
import Items from './app/components/Items/Items'; 
import Item from './app/components/Item/Item'; 
import {requireAuthentication} from './app/components/General/AuthenticatedComponent'; 
import {reducers} from './app/reducers/reducers'; 
import {i18n} from './app/i18n/i18n'; 

import './index.scss'; 

addLocaleData([ 
    ...en 
]); 

// Create the store from the reducers 
const store = createStore(combineReducers({ 
    reducers, 
    routing: routerReducer, 
    intl: intlReducer 
}), i18n, applyMiddleware(thunk)); 

// Create an enhanced history that syncs navigation events with the store 
const history = syncHistoryWithStore(browserHistory, store); 

ReactDOM.render(
    <Provider store={store}> 
     <IntlProvider locale="en" defaultLocale="en"> 
      <Router history={history}> 
       <Route path="/" component={Home}/> 
       <Route path="/profile" component={requireAuthentication(Profile, true)}/> 
       <Route path="/login" component={requireAuthentication(Login, false)}/> 
       <Route path="/signup" component={requireAuthentication(SignUp, false)}/> 

       {/* Items route lists all of the items, Item shows details for one individual item */} 
       <Route path="/items" component={Items}/> 
       <Route path="/items/:itemId" component={Item}/> 
      </Router> 
     </IntlProvider> 
    </Provider>, 
    document.getElementById('root') 
); 

Items В и Item компоненты не имеют никакого отношения, и не зависят друг от друга.

Когда я перехожу к http://localhost/items, компонент Items. Но когда я перейти к http://localhost/items/1, ничего не делает, и я получаю следующее сообщение об ошибке в консоли:

GET http://localhost:3000/items/index.js 

Я попытался это исправить несколько способов, каждый в результате чего же сообщение об ошибке

... 
<Route path="/items" component={Items}/> 
<Route path="/items/:itemId" component={Item}/> 
... 

... 
<Route path="/items" component={Items}> 
    <Route path="/:itemId" component={Item}/> 
</Route> 
... 

... 
<Route path="/items"> 
    <IndexRoute component={Items}/> 
    <Route path="/:itemId" component={Item}/> 
</Route> 
... 

Я могу получить Item компонент для визуализации с парами, когда я делаю это, хотя

... 
// Navigate to http://localhost:3000/1 
<Route path="/:itemId" component={Item}/> 
... 

Но это не так, как я хочу, чтобы URL-адрес, которые будут создан. Кто-нибудь знает, как решить эту проблему? Спасибо за помощь!

+0

У вас есть '{this.props.children}', установленный в компоненте 'Items'? Потому что 'Item' зависит от' Item', если это не установлено 'Item' никогда не будет отображаться. –

+0

@ KeithA. Разве это не имеет значения, если вы их гнездились? (например.2/3 попытки). Я попытался поставить '{this.props.children}' в 'Items' с той же ошибкой. Кроме того, я не хочу, чтобы компонент 'Item' отображался внутри' Items', так как они имеют совершенно разные макеты. – TFischer

+0

О да, извините, я бы сказал об этом. Является ли эта ошибка «GET http: // localhost: 3000/items/index.js» всей ошибкой? Не возражаете ли вы размещать компоненты 'Item' и' Items'? –

ответ

0

Так получилось, что проблема была не react-router, а проблема webpack. Я посмотрел на исходный код, который был скомпилированного, и это выглядело как этот

<!doctype html> 
<html> 
    <head> 
     <meta charset="utf-8"> 
     <meta name="description" content=""> 
     <meta name="viewport" content="width=device-width"> 

     <link href="https://fonts.googleapis.com/css?family=Lato:300,400,7s00" rel="stylesheet"> 
     <link rel="icon" type="image/png" href="http://fountainjs.io/assets/imgs/fountain.png" /> 
     <title>My Web App</title> 

     <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.2.2/semantic.min.css></link> 
    </head> 
    <body> 
     <!-- Entry point for the application --> 
     <div id="root"></div> 

     <script type="text/javascript" src="index.js"></script> 
    </body> 
</html> 

Файл index.js должен быть связан, как /index.js, в противном случае она выглядит в текущей директории, что маршрут находится. Так что в моем webpack.conf.js файл, я нашел раздел, в котором упоминается index.js

output: { 
    path: path.join(process.cwd(), conf.paths.tmp), 
    filename: 'index.js' 
} 

Я просто изменил его

output: { 
    path: path.join(process.cwd(), conf.paths.tmp), 
    filename: '/index.js' 
} 

И это сработало. Файл index.js теперь правильно связан в источнике

0

Попробуйте, если это работает, если вы не хотите, чтобы сделать Item внутри Items

<Route path="/items"> 
    <IndexRoute component={ Items } /> 
    <Route path=":itemId" component={ Item } /> 
</Route> 

в react-router, если вы поставите / перед пути, он всегда становится абсолютным маршрут (example.org/:itemId), и без маршрута относительно (example.org/items/:itemId).

Надеюсь, это поможет!

+0

Пробовал это, и это не сработало. Я все равно получаю ту же ошибку – TFischer

+0

1) У вас есть сервер backend, работающий локально, а также @TFischer, 2) Выполняют ли эти ошибки только при попытке перейти к URL-адресу из адресной строки браузера, а также при нажатии на «Ссылка» на путь? – jakee

+0

Попробуй это для меня. Добавьте ссылку '<Ссылка на ="/items/1 "> Ссылка' от 'реагирования-маршрутизатора' на ваш код и увидите, что щелчок работает. – jakee