我应该如何将“redux-thunk”用于异步初始状态? (反应/减少)

Posted

技术标签:

【中文标题】我应该如何将“redux-thunk”用于异步初始状态? (反应/减少)【英文标题】:How should I use "redux-thunk" for Async Initial state ? (react/redux) 【发布时间】:2016-12-18 20:20:44 【问题描述】:

这个问题已经被问过好几次了,但是我并没有真正理解我找到的答案。使用 React/Redux,我正在尝试使用 express 将异步数据置于我的初始状态。由于我习惯了 d3,我的一个选择是使用“d3.json”......但如果它更好,我会很乐意使用其他东西。从之前关于同一主题的答案中,我添加了以下代码:

// redux action using a dispatcher (think middleware)
export function cool(url) 
    return function(dispatch) 
        return d3.json(url, response => 
            dispatch(setData(response))
        
    


// redux action
export function setData(data) 
 return 
        type: 'DATA_CHART_ALL',
        data
    


const authorDataReducer = (state = , action) => 
    switch (action.type) 
      case 'DATA_CHART_ALL':
        return action.data
      case 'DATA_CHART_FILTER':
        return action.data
      default:
        return state;
    
;

export authorDataReducer;

一开始我没有注意到,但根据我最近的理解,上面的代码或多或少遵循redux-thunk 模式......所以从那里我尝试应用redux-thunk 但我可以'什么都做不了……

【问题讨论】:

【参考方案1】:

你的问题不是很清楚,但我会尽量回答。 Redux-thunk 是一个用于调度异步操作的中间件。您在创建 redux 存储时对其进行初始化:

import  createStore, applyMiddleware  from 'redux';
import thunk from 'redux-thunk';
import rootReducer from './reducers/index';

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

为了加载异步数据,您需要调度一个动作,即使它是针对初始状态的。如果您正在使用 react,则可以在安装最高阶组件时使用它。

import React,  Component, PropTypes  from 'react';
import  connect  from 'react-redux';

import  fetchTodos  from '../action';
import TodoList from './TodoList';

class App extends Component 

    constructor(props) 
        super(props);
    

    componentWillMount() 
        this.props.fetchTodos();
    

    render() 
        return (
            <TodoList
                todos=this.props.todos
            />
        );
    


App.propTypes = 
    todos: PropTypes.array.isRequired
;

const mapStateToProps = (state, ownProps) => (
    todos: state.todos
);

export default connect(
    mapStateToProps,
    
        fetchTodos: fetchTodos
    
)(App);

这将触发一个看起来像这样的动作

export const fetchTodos = () => 
    return (dispatch) => 
        return fetch(url).then((response) => 
            disptach(
                 type: 'received_todos',
                 payload: 
                     response.json()
                 
            );
        );
    

如您所见,我没有使用 d3,而是使用了fetch。我想只要你返回一个 Promise,任何库都是好的。

【讨论】:

当我在connect 中添加 fetchTodos: fetchTodos 时出现以下错误finalMergeProps is not a function fetchTodos 应该是您导入的操作。连接中的 fetchTodos: fetchTodos 只是将动作映射到道具的一种方式,这样您就可以在组件中像this.props.fetchTodos 一样调用它 是的,我已经导入了它。我需要对减速器做任何事情吗?当你说承诺时,你是什么意思?再次感谢! Promise 用于从异步操作返回数据。我认为你应该阅读redux doc,因为那里有很多信息和一些很好的例子。

以上是关于我应该如何将“redux-thunk”用于异步初始状态? (反应/减少)的主要内容,如果未能解决你的问题,请参考以下文章

Redux-thunk 异步调用和状态

如何测试 redux-thunk 中间件异步功能?

使用 redux-thunk 进行异步验证

Redux-thunk 异步请求处理 onSuccess 和 onError 的最佳方法是啥?

在 redux-thunk 中调用另一个异步函数

redux-thunk:错误:动作必须是普通对象。使用自定义中间件进行异步操作