#javascript #reactjs #redux #react-redux #react-router
#javascript #reactjs #сокращение #реагирование-уменьшение #реагировать-маршрутизатор
Вопрос:
Я не знаю, почему я продолжаю получать следующую ошибку: ‘IsAuthenticated’ не определен no-undef. Я взял его из mapStateToProps, а затем вызвал его в своем теге switch. Любая помощь будет оценена. Спасибо.
//App.js файл
const App = () => {
useEffect(() => {
store.dispatch(loadUser());
}, []);
return (
<Provider store={store}>
<div className="App">
<Router>
<Switch>
<Route exact path="/" component={LandingPage} />
{!isAuthenticated ? <Route exact path="/login" component={LoginPage} /> : <ProtectedRoute exact path="/userfeed" component={UserFeed} />}
</Switch>
</Router>
</div>
</Provider>
);
}
const mapStateToProps = state => ({
isAuthenticated: state.auth.isAuthenticated
});
export default connect(mapStateToProps)(App);
Комментарии:
1. Вы смешиваете синтаксис функциональных компонентов и компонентов класса. Функциональные компоненты не имеют функции рендеринга, они являются функцией рендеринга. Вы просто возвращаете JSX
2. Извините, я все еще учусь. Можете ли вы показать мне пример?
Ответ №1:
Он isAuthenticated
будет передан как реквизит компонента, вам нужно получить его из реквизита компонента, и вы должны определить поставщика в родительском компоненте.
Попробуйте приведенный ниже код.
const App = ({ isAuthenticated }) => {
useEffect(() => {
store.dispatch(loadUser());
}, [])
return (
<div className="App">
<Router>
<Switch>
<Route exact path="/" component={LandingPage} />
{!isAuthenticated ? <Route exact path="/login" component={LoginPage} /> : <ProtectedRoute exact path="/userfeed" component={UserFeed} />}
</Switch>
</Router>
</div>
);
};
const mapStateToProps = state => ({
isAuthenticated: state.auth.isAuthenticated
});
export default connect(mapStateToProps)(App);
index.js
import ReactDOM from 'react-dom'
import { Provider } from 'react-redux'
import App from './App'
import store from './store'
ReactDOM.render(
// Render a `<Provider>` around the entire `<App>`,
// and pass the Redux store to as a prop
<React.StrictMode>
<Provider store={store}>
<App />
</Provider>
</React.StrictMode>,
document.getElementById('root')
)
Для получения подробной информации, пожалуйста, прочитайте руководство в официальном документе здесь.
Комментарии:
1. Я получил следующую ошибку: Ошибка: не удалось найти «магазин» в контексте «Подключиться (приложение)». Либо оберните корневой компонент в <Provider> , либо передайте пользовательский поставщик контекста React <Provider> и соответствующий потребитель контекста React для подключения (App) в параметрах подключения.
2. @tim_woods поставщик находится внутри вашего компонента приложения, поэтому вы не сможете подключить сам компонент приложения. Все, что вы подключаете, должно отображаться как дочернее устройство поставщика
3. @Jayce444 спасибо за ваш ответ. Я обновил свой приведенный выше код, добавив render(), как вы предложили, но я получил следующую ошибку: ошибка синтаксического анализа: неожиданный токен, ожидаемый «;». Ошибка указывает на строку, в которой находится ее render()
4. Рендеринг не используется в функциональном компоненте, он хочет сказать, что компонент приложения должен быть дочерним компонентом компонента поставщика.
5. Я добавил код для index.js , пожалуйста, соответствующим образом отрегулируйте путь к магазину