【问题标题】:React Redux prop is undefinedReact Redux 属性未定义
【发布时间】:2020-06-21 18:45:52
【问题描述】:

初学者问题。 我想将用户对象作为道具从商店传递给组件,但组件没有得到它(未定义)。我从第三方服务身份验证服务(google firebase)获取用户对象

中间件实际上在控制台中注销了 SET_CURRENT_USER 类型的操作,下一个状态确实会将 user.currentUser 设置为从登录服务返回的对象(未定义) .

但是,组件不会重新渲染并且似乎没有将对象作为道具接收

prop 未定义的组件

import React from 'react';
import { connect } from 'react-redux';
import { auth } from "../../firebase/firebase.utils";

export const Navbar = ({ currentUser }) => {
    return (
        /* A LOT OF JSX CODE. currentUser IS UNDEFINED */
    );
};

const mapStateToProps = state => ({
    currentUser: state.user.currentUser
});

export default connect(mapStateToProps)(Navbar);

App 组件,将上述组件作为子组件。另外,我正在尝试将商店设置为在 componentDidMount() 中包含用户对象

import React from 'react';
import Homepage from "./pages/homepage";
import { Route, Switch } from 'react-router-dom';
import { connect } from 'react-redux';

import Login from "./pages/login";
import Register from "./pages/register";
import { Navbar } from "./components/navbar/navbar";

import { auth } from "./firebase/firebase.utils";
import { setCurrentUser } from "./redux/user/user.actions";

class App extends React.Component {
    unsubscribeFromAuth = null;

    componentDidMount() {
        this.unsubscribeFromAuth = auth.onAuthStateChanged(async userAuth => {
            if(userAuth) {
                (async () => {
                    const rawResponse = await fetch(/* JUST AN ASYNC FUNCTION TO POST TO BACKEND*/);
                })();
            }
            this.props.setCurrentUser(userAuth); /*HERE IM TRYING TO SET THE STORE*/
        })
    }

    componentWillUnmount() {
        this.unsubscribeFromAuth();
    }

    render() {
        return (
            <div>
                <Navbar /> /* THE COMPONENT WHICH SHOULD GET THE USER OBJECT AS PROP */
                <Switch>
                    <Route exact={true} path={'/register'} component={Register} />
                    <Route exact={true} path={'/login'} component={Login} />
                    <Route path={'/'} component={Homepage} />
                </Switch>
            </div>
        );
    }
}

const mapDispatchToProps = (dispatch) => ({
    setCurrentUser: user => dispatch(setCurrentUser(user))
});

export default connect(null, mapDispatchToProps)(App);

索引组件

import React from 'react';
import ReactDOM from 'react-dom';
import App from "./App";
import { BrowserRouter } from "react-router-dom";
import { Provider } from 'react-redux';

import store from "./redux/store";

ReactDOM.render(
    <Provider store={store} > /* HERE IS STORE PROVIDED FROM IMPORT*/
        <BrowserRouter>
            <App/>
        </BrowserRouter>
    </Provider>,
    document.getElementById('root')
);

根减速器

import { combineReducers } from "redux";

export default combineReducers({
    user: userReducer
});

用户缩减器

const INITIAL_STATE = {
    currentUser: null
};

const userReducer = (state = INITIAL_STATE, action) => {
    switch (action.type) {
        case 'SET_CURRENT_USER':
            return {
                ...state,
                currentUser: action.payload
            };
        default:
            return state;
    }
};

export default userReducer;

用户操作

export const setCurrentUser = user => ({
    type: 'SET_CURRENT_USER',
    payload: user
});

商店

import { createStore, applyMiddleware } from "redux";
import logger from 'redux-logger';

import rootReducer from './root-reducer';

const middlewares = [logger];

const store = createStore(rootReducer, applyMiddleware(...middlewares));

export default store;

【问题讨论】:

    标签: javascript reactjs redux react-redux


    【解决方案1】:

    您正在为Navbar 进行nameddefault 导出。默认导出由 connect HOC 包装,将 currentUser 添加到其道具中。命名导出没有。

    您导入它的名称如下:import { Navbar } from。而是使用默认导出:import Navbar from

    那么我建议删除命名的导出以避免将来混淆。

    【讨论】:

    • 具有命名导出对于测试很有价值,但是(并且允许断开连接使用,这很有价值)。显然,它不应该被称为同一个东西:)
    • @DaveNewton 是的,这是真的。我认为,如果您想同时支持连接和断开连接,则应该交换导入以清楚起见。将组件本身设为默认导出,然后将连接的导出命名为 ConnectedNavbar
    • @BrianThompson 确实取决于主要用例。这个难题是人们认为连接应该发生在组件文件本身(生产者)而不是实际使用组件的地方(消费者)的一个不幸的副作用。一般来说,我主张只导出未连接的组件,并在其他地方执行connects。
    • 其实我100%同意。我更喜欢让像这样的组件完全不了解 redux,但这最终更像是一种偏好。在我的评论中,我只是建议如果你想保留这两个导出,命名一个做额外事情的可能会更清楚。
    猜你喜欢
    • 2021-08-05
    • 1970-01-01
    • 2020-10-10
    • 2019-02-15
    • 2017-06-22
    • 2021-01-15
    • 2017-09-05
    • 2018-04-12
    • 1970-01-01
    相关资源
    最近更新 更多