【问题标题】:Redux-thunk dispatch not workingRedux-thunk 调度不起作用
【发布时间】:2017-05-25 05:26:27
【问题描述】:

我正在查看 thunk 并试图弄清楚如何实现 api 调用。它不起作用,所以我回到了最基本的东西。当我单击按钮时,它在控制台中显示'Getting here!,但当我console.log(dispatch) 时没有显示任何内容。我在这里遗漏了什么吗?

import React from 'react';
import ReactDOM from 'react-dom';
import { createStore, applyMiddleware } from 'redux';
import { connect, Provider } from 'react-redux';
import thunk from 'redux-thunk' 
import axios from 'axis';

const store = createStore(
    reducer,
    applyMiddleware(thunk)
);

function fetchUser() {
    return axios.get('https://randomuser.me/api/');
}

function addUser() {
    console.log('Getting here');
    return (dispatch) => {
        console.log(dispatch) //not showing anything
        return fetchUser().then(function(data){
          console.log(data);
        });
    };
}

class App extends React.Component {
    addUser() {
        addUser();
    }

    render() {
        return (
           <button onClick={this.addUser.bind(this)}>+</button>
        )       
    }
}

const mapPropsToState = function(store){
    return {
        newState: store
    }
}

var ConnectApp = connect(mapPropsToState)(App);

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

【问题讨论】:

  • @lux 添加了这个
  • 检查redux中的mapDispatchToProps

标签: reactjs redux react-redux redux-thunk


【解决方案1】:

您不能将组件中的addUser() 作为常规函数调用。您必须使用 mapDispatchToProps 函数并将其传递给您的 connect 调用,以便能够调度 addUser()

const mapDispatchToProps = dispatch => ({addUser: () => dispatch(addUser())})

然后

ConnectApp = connect(mapPropsToState, mapDispatchToProps)(App);

现在您可以将其称为道具。

addUser() {
        this.props.addUser();
    }

【讨论】:

    【解决方案2】:

    您实际上并没有发送 thunk。你直接调用它。您需要将内部() =&gt; {} thunk 函数传递给dispatch

    有几种方法可以处理这个问题。由于您没有为connect 提供mapDispatchToProps 参数,因此App 组件将自动被赋予this.props.dispatch()。所以,在App.addUser(),你可以做this.props.dispatch(addUser())

    另一种方法是预先绑定 addUser 动作创建者。您可以使用语法var ConnectApp = connect(mapPropsToState, {addUser})(App) 来执行此操作。然后,当你调用this.props.addUser()时,它会自动调度结果。

    我在 http://blog.isquaredsoftware.com/2016/10/idiomatic-redux-why-use-action-creators/ 有一些关于使用动作创建者和绑定的讨论,在 https://gist.github.com/markerikson/6c7608eee5d2421966d3df5edbb8f05chttps://gist.github.com/markerikson/f46688603e3842af0f9720dea05b1a9e 有一些关于绑定和调度示例代码的要点。

    【讨论】:

      【解决方案3】:

      如果你不想使用连接函数,那么你可以使用 useDispatch() 钩子。

      const dispatch = useDispatch();
      
       useEffect(() => {
          dispatch(addUser())
       }, [])
      

      您可以使用 componentDidMount 或 UseEffect 来获取数据。

      【讨论】:

        猜你喜欢
        • 2019-11-12
        • 2018-05-30
        • 2019-10-12
        • 2020-07-11
        • 2016-11-23
        • 2018-05-21
        • 2019-11-12
        • 2020-08-18
        • 2021-04-05
        相关资源
        最近更新 更多