getState 和 dispatch 如何在 redux-thunk action creator 中导入?

Posted

技术标签:

【中文标题】getState 和 dispatch 如何在 redux-thunk action creator 中导入?【英文标题】:How are getState and dispatch imported in redux-thunk action creator? 【发布时间】:2020-02-03 21:54:06 【问题描述】:
import _ from 'lodash';
import jsonPlaceholder from '../apis/jsonPlaceholder';

export const fetchPostsAndUsers = () => async (dispatch, getState) => 
  await dispatch(fetchPosts());

  _.chain(getState().posts)
    .map('userId')
    .uniq()
    .forEach(id => dispatch(fetchUser(id)))
    .value();
;

export const fetchPosts = () => async dispatch => 
  const response = await jsonPlaceholder.get('/posts');

  dispatch( type: 'FETCH_POSTS', payload: response.data );
;

在上面的代码中,getState 和 dispatch 函数作为参数传递给 action creator 函数,我很困惑的是为什么这些函数没有从任何地方导入,或者 react/redux 以某种方式为我们导入了它们?

【问题讨论】:

这些是函数的参数。该函数将通过传递它们来调用。在这种情况下不需要导入任何东西 好吧,我觉得我现在问了一个愚蠢的问题,这可能是另一个问题,如果这些函数作为参数传递它们来自哪里,它们仍然需要存在于当前模块中才能成为正确地作为参数传递,还是 react 从其他地方传递它们? 为什么它们需要存在于当前模块中才能作为参数传递?这通常会大大降低函数的效用。您导出这些函数,以便它们可以在其他地方使用(大概连接到某个地方的 redux 存储)。 【参考方案1】:

好的,我会尽力消除您的困惑, 如您所知,动作创建者返回纯 javascript 对象,但 thunk 是一个中间件,它允许您从动作创建者返回函数而不是纯 javascript 对象,所以当您使用 thunk 时,如果您返回 plain javascript 对象动作创建者以正常方式处理,但是当您从动作创建者返回 function 时,比 thunk 处理它并使用 dispatchgetState 调用此函数,所以你可以异步调度一个动作,你没有传递这些参数,这样看你是从动作创建者返回一个回调,然后用这些参数重调用这个回调。

希望对您有所帮助。

【讨论】:

【参考方案2】:

当你使用 redux 提供的连接函数将 react 组件与 redux 连接时,你将传递给函数:mapStateToProps 和 mapDispatchToProps。这些将是您寻找的参数(调度和 getState)。

【讨论】:

【参考方案3】:

Thunk 是一个函数,它可以选择接受一些参数并返回另一个函数,它接受 dispatch 和 getState 函数,这两个函数都由 Redux Thunk 中间件提供

【讨论】:

以上是关于getState 和 dispatch 如何在 redux-thunk action creator 中导入?的主要内容,如果未能解决你的问题,请参考以下文章

React-Redux:getState() 不可用

如何使用 thunk 操作对 mapDispatchToProps 进行单元测试

Redux学习笔记

Redux学习笔记

redux中间件

Redux 中的 store.dispatch 是同步的还是异步的