#reactjs #redux #react-redux #react-router #react-router-redux
#reactjs #redux #реагировать-redux #react-маршрутизатор #react-router-redux
Вопрос:
Я скопировал решение для хранилища / маршрутизатора из моего предыдущего проекта, где оно работало нормально. Затем обновил зависимости redux / router / dom, внес некоторые изменения, например. удалил IndexRoute и использовал createBrowserHistory. В dev. tools отображается, что Provider
компонент отображается, но он не отображает какой-либо другой компонент.
index.js
import React from 'react';
import { render } from 'react-dom';
import Foo from './components/Foo ';
import Bar from './components/Bar ';
import Components from './components/App'
import { BrowserRouter as Router, Route, IndexRoute } from 'react-router-dom';
import { Provider } from 'react-redux';
import store, { history } from './store';
const router = (
<Provider store={store}>
<Router history={history}>
<Route exact path="/" exact component={Components.MainConnectedWithProps} />
<Route exact path="/foo" component={Components.FooConnectedWithProps} />
<Route exact path="/bar" component={Components.BarjkaConnectedWithProps} />
</Router>
</Provider>
)
render(router, document.getElementById('root'));
//render(<Foo />, document.getElementById('root')); works just fine
App.js
import * as actionCreators from '../actions/actionCreators'
import {bindActionCreators} from 'redux'
import Main from './Main'
import Foo from './Foo '
import Bar from './Bar '
import { connect } from 'react-redux'
function mapStateToProps(state) {
return {
sampleData: state.sampleData
}
}
function mapDispachToProps(dispatch){
return bindActionCreators(actionCreators, dispatch)
}
export default {
MainConnectedWithProps : connect(mapStateToProps, mapDispachToProps)(Main),
FooConnectedWithProps: connect(mapStateToProps, mapDispachToProps)(Foo),
BarConnectedWithProps: connect(mapStateToProps, mapDispachToProps)(Bar)
}
store.js
import { createStore } from 'redux'
import {syncHistoryWithStore} from 'react-router-redux'
import { createBrowserHistory } from 'history'
import rootReducer from './reducers/index';
const defaultState = {
sampleData: sampleData
}
const store = createStore(rootReducer, defaultState)
export const history = syncHistoryWithStore(createBrowserHistory(), store);
export default store;
package.json
"react-dom": "^17.0.1",
"react-redux": "^4.4.10",
"react-router": "^6.0.0-beta.0",
"react-router-dom": "^6.0.0-beta.0",
"react-router-redux": "^4.0.8"
Я довольно новичок в React, поэтому это может быть какой-то глупой ошибкой. Заранее всем спасибо.
РЕДАКТИРОВАТЬ: я создал изолированную среду с основными функциями — визуализировать множество компонентов по одному пути «/» и конкретному компоненту с путями «/ foo» или «/ bar» с использованием redux. Он отлично работает после изменения BrowserRouter
на Router
with history
object . https://codesandbox.io/s/old-dawn-spggs?file=/src/components/App.js
Но когда я пробую то же самое в VS Code, он выдает местоположение prop, помеченное как требуемое Router
, но его значение равно undefined error для Router history={history}
и без ошибок, но ничего не отображает для <BrowserRouter />
РЕДАКТИРОВАТЬ 2: я использовал точно такую же версию истории, реакции, зависимостей, как и в codesandbox, и она тоже работала в VS Code. Но Link
, похоже, сейчас не работает. Когда я набираю «/ bar» вручную, он отображается Bar
, но когда я нажимаю на Link path="/bar"
него, он ничего не отображает.
РЕДАКТИРОВАТЬ 3: я более внимательно рассмотрел ссылки, предложенные в комментариях, и решение состоит в том, чтобы понизить history
зависимость до 4.7.1.
Кроме того, является ли использование этого MainConnectedWithProps
, FooConnectedWithProps
… для каждого отдельного компонента хорошей идеей для передачи реквизитов? Раньше я использовал React.CloneElement
, но я думаю, что это не так, поскольку IndexRoute
прошло?
Комментарии:
1. Возможно, вы захотите включить это codesandbox.io чтобы облегчить диагностику от
2. Вы не хотите использовать
BrowserRouter
, если вы проверяете объект истории — это реализация HTML5 по умолчанию.3. Эй, я создал песочницу, и она работает нормально. Не могли бы вы взглянуть на РЕДАКТИРОВАНИЕ?
4. Я никогда раньше не использовал
redux
привязкиreact-router
, поэтому не могу сказать этого наверняка, но похоже, что пакет устарел , и, кроме того, версии, которые вы установили в изолированной среде, не кажутся совместимыми. Этот репозиторий предназначен для react-router-redux 4.x, который совместим только с react-router 2.x и 3.x . Связанный github предлагает вместо этого использовать connected-react-router .5. Еще одно замечание,
react-router
v6 сильно отличается отv5
. Похоже, вы использовали предыдущий проектv5
. Если вы хотите использовать бетаv6
-версию, ознакомьтесь с их руководством по миграции здесь, github.com/ReactTraining/react-router/blob/dev/docs /…