Реакция и уменьшение: получение не определено ошибка no-undef

#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 , пожалуйста, соответствующим образом отрегулируйте путь к магазину