【问题标题】:Redux - Dispatching Action (onClick Event)Redux - 调度动作(onClick 事件)
【发布时间】:2020-10-07 11:12:58
【问题描述】:

我只是想通过onClick (event)connect() 我的LoginPage (component) 与我的Redux Storedispatch 联系起来。当我console.log(this.props) 我的调度处理程序login() 不在组件的道具中。

GitHub 仓库 -- https://github.com/jdavis-software/demo.git

问题:为什么我的Redux Store 不是connectiondispatching 操作?

登录页面:

import React, { Component} from 'react';
import {  connect } from 'react-redux';

export class LoginPage extends Component<any> {
    render(){
        console.log('props doesnt have contain - login(): ', this.props)
        return (<button onClick={ () => '' }>Login</button>)
    }
}

const mapProps = state => ({ user: state.user })

const dispatchProps = (dispatch) => {
    return {
        login: () => dispatch({ type: 'USER_LOGGED_IN', payload: true})
    } 
}

export default connect(mapProps,dispatchProps)(LoginPage)

Redux 配置:

import { IStore, IUser } from '@interfaces';
import { createStore, combineReducers } from 'redux';
import ReduxPromise from 'redux-promise';
// reducers
import userReducer from './user.reducer';

// define the intial global store state
const initialState:IStore = {
    user: {
        isAuthenticated: false
    }
}

const appReducer = combineReducers({user: userReducer}) 

export default createStore(appReducer,initialState);

用户缩减器:

// initial state
const initalState:IUser = {
    isAuthenticated: false
}

// reducer
const userReducer = (state:IUser = initalState, { type, payload}: IPayload): IUser => {
    console.log('user reducer start', state)
    switch (type) {
        case 'USER_LOGGED_IN':
            state = { ...state, isAuthenticated: payload }
            break;
        default:
            return state;
    }
    return state;
};
export default userReducer;

根页面:

import React from 'react';
import { render } from 'react-dom';
import { Provider } from 'react-redux';
// styles
import './index.scss';
// pages
import { App } from '@pages';
// store
import store from './core/store/store';

render(
    <Provider store={store}>
        <App/>
    </Provider>, document.getElementById('app')
);

【问题讨论】:

  • 你的 redux-store 配置是什么?
  • 我也会看钩子
  • @TasosBu 刚刚添加了它
  • @JamieHutber 是的,我一直在研究这个,只是想在重新连接所有东西之前让它工作。

标签: javascript reactjs redux react-redux


【解决方案1】:

我在 git 存储库上检查了您的代码。我发现您正在导出命名导出

export class LoginPage

和默认导出,

export default connect(mapProps,dispatchProps)(LoginPage)

但是当你访问它时,你是在访问它

import { /*Other components*/ , LoginPage } from '@pages'

所以它实际上是在使用未连接到存储的命名导出组件。

我建议你导入为

import LoginPage , { /*Other components*/ } from '@pages'

这可能会解决您的问题。

【讨论】:

  • 谢谢!觉得我写代码太久了?
【解决方案2】:

connect 的属性中缺少返回语句。

const mapProps = state => { return {user: state.user} }

const dispatchProps = (dispatch) => { 
  return {
    login: () => dispatch({ type: 'USER_LOGGED_IN', payload: true})
   }
}

export default connect(mapProps,dispatchProps)(LoginPage)

更新: 请查看Redux-dispatch

【讨论】:

  • arrow 函数默认返回不会有什么不同,但只是为了记住我试了一下并没有改变任何东西。
  • 是的,但是由于您添加了没有意义的花括号,因此您必须添加 return 或者您需要用函数括号括起来。您创建的商店应该对 LoginPage 组件可用。您也可以粘贴该代码吗?
【解决方案3】:

尝试:

import React, { Component} from 'react';
import {  connect } from 'react-redux';

export class LoginPage extends Component<any> {
    render(){
        console.log('props doesnt contain - login(): ', this.props)
        return (
            <button onClick={ this.props.login }>Login</button>
        )
    }
}

const mapProps = state => ({ user: state.user })

const dispatchProps = (dispatch) => ({ 
    login: () => dispatch({ type: 'USER_LOGGED_IN', payload: true})
})

export default connect(mapProps,dispatchProps)(LoginPage)

要使用 Arrow Functions 返回一个对象,您需要用 () 包装您的 {}

【讨论】:

  • 是的,我尝试了一下,并没有改变任何东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
  • 2021-10-14
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
  • 2018-02-13
相关资源
最近更新 更多