действие не является функцией react-redux - PullRequest
0 голосов
/ 29 мая 2020

логин undefined

Я получаю логин как undefined, всякий раз, когда я нажимаю кнопку входа, он работал нормально до того, как я создал AppRoutes. js и переместил в него некоторые маршруты файл.

TypeError: логин не является функцией

вот структура кода.

это главный файл, в котором приложение запускается и авторизуется маршрут помещается сюда внутри компонента AppRoutes.

  1. app. js
import React, { Fragment, useEffect } from 'react'
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom'
import Navbar from './components/layout/Navbar'
import Landing from './components/layout/Landing'
import Alert from './components/layout/Alert'
import { loadUser } from './actions/auth'
import { Provider } from 'react-redux'
import setAuthToken from './utils/setAuthToken'
import store from './store'
import './App.css'
import AppRoutes from './components/routing/AppRoutes'
if (localStorage.token) {
  setAuthToken(localStorage.token)
}
const App = () => {
  useEffect(() => {
    store.dispatch(loadUser())
  }, [])
  return (
    <Provider store={store}>
      <Router >
        <Fragment>
          <Navbar />
          <Alert />
          <Switch>
            <Route exact path='/' component={Landing} />
            <Route component={AppRoutes} />
          </Switch>

        </Fragment>
      </Router>
    </Provider>
  )
}

export default App

2.AppRoutes. js

import React, { Fragment } from 'react'
import { Register } from '../auth/Register'
import { Login } from '../auth/Login'
import Dashboard from '../dashboard/Dashboard'
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom'
import PrivateRoute from './PrivateRoute'
import { NotFound } from '../layout/NotFound'
import store from '../../store'
import { Provider } from 'react-redux'
const AppRoutes = () => {
    return (<Fragment>
        <Switch>
            <Route exact path='/register' component={Register} />
            <Route exact path='/login' component={Login} />
            <PrivateRoute path='/dashboard' component={Dashboard} >
            </PrivateRoute>
            <Route component={NotFound} />
        </Switch>
    </Fragment>
    )
}

export default AppRoutes
автори. js
export const login = (email, password) => async dispatch => {
    const config = {
        headers: {
            'Content-Type': 'application/json'
        }
    }

    const body = JSON.stringify({ email, password })
    try {
        const res = await axios.post('/api/auth', body, config)
        if (res?.data?.token) {
            dispatch({
                type: LOGIN_SUCCESS,
                payload: res.data
            })
            dispatch(loadUser())
        }
        else {
            dispatch(setAlert(res.data.msg, 'success'))
        }
    } catch (error) {
        const errors = error.response.data.errors
        if (errors) {
            errors.forEach(error => dispatch(setAlert(error.msg, 'danger')))
        }
        dispatch({
            type: LOGIN_FAIL
        })
    }
}

4.Вход в систему. js

import React, { Fragment, useState } from 'react'
import { connect } from 'react-redux'
import PropTypes from 'prop-types'
import { login } from '../../actions/auth'
import { Link, Redirect } from 'react-router-dom'
import store from '../../store'

export const Login = ({ isAuthenticated, login }) => {
    const [formData, setFormData] = useState({

        email: '',
        password: ''

    })

    const { email, password } = formData

    const onChange = e => setFormData({ ...formData, [e.target.name]: e.target.value })

    const onSubmit = e => {
        e.preventDefault()
        console.log(typeof login)
        login(email, password)
    }

    //redirect if logged in

    if (isAuthenticated) {
        return <Redirect to='/dashboard' />
    }

    return (
        <Fragment>
            <div className="m-5">
                <div className="row justify-content-center">
                    <div className="col-md-4">
                        <div className="card shadow-lg o-hidden border-0 my-5">
                            <div className="card-body p-0">
                                <div>
                                    <div className="p-5">
                                        <div className="text-center">
                                            <h4 className="text-dark mb-4">Welcome Back!</h4>
                                        </div>
                                        <form className="user" onSubmit={e => onSubmit(e)}>
                                            <div className="form-group">
                                                <input className="form-control form-control-user" type="email" placeholder="Email Address" name="email" value={email} onChange={e => onChange(e)} required />
                                            </div>
                                            <div className="form-group">
                                                <input className="form-control form-control-user" type="password"
                                                    placeholder="Password"
                                                    name="password"
                                                    minLength="6"
                                                    value={password} onChange={e => onChange(e)}
                                                />
                                            </div>
                                            <div className="form-group">
                                                <div className="custom-control custom-checkbox small">
                                                    <div className="form-check">
                                                        <input className="form-check-input custom-control-input" type="checkbox" id="formCheck-1" />
                                                        <label className="form-check-label custom-control-label" htmlFor="formCheck-1">Remember Me</label>
                                                    </div>
                                                </div>
                                            </div><button className="btn btn-dark btn-block text-white btn-user" type="submit">Login</button>
                                            <hr />
                                        </form>
                                        <div className="text-center"><Link to="/register" className="small" href="register.html">Create an Account!</Link></div>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>

        </Fragment >
    )
}
Login.propTypes = {
    login: PropTypes.func.isRequired,
    isAuthenticated: PropTypes.bool
}

const mapStateToProps = state => ({
    isAuthenticated: state.auth.isAuthenticated

})

export default connect(mapStateToProps, { login })(Login)

Я не могу выяснить, связано ли это со структурой маршрута, которую я изменил, или есть более серьезная проблема, которую я упускаю.

1 Ответ

1 голос
/ 29 мая 2020

Вы импортировали Login именованный импорт в AppRoutes, тогда как связанный компонент с Login был экспортом по умолчанию, поэтому вы видите проблему

Замените

import { Login } from '../auth/Login'

на

import Login from '../auth/Login'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...