当前位置: 首页 > 知识库问答 >
问题:

减少redux-thunk样板

谢旭
2023-03-14

当编写< code>redux-thunk函数(称为thunks)时,有许多样板文件可以很容易地提取出来。例如,在我们的大多数异步API调用中,我们执行以下操作,没有任何副作用:

export const LOGIN_REQUEST = 'my-app/auth/LOGIN_REQUEST';
export const LOGIN_RECIEVE = 'my-app/auth/LOGIN_RECIEVE';
export const LOGIN_FAILURE = 'my-app/auth/LOGIN_FAILURE';

// ... reducer code here

export function login(loginHandle, password) {
  return (dispatch, getState, api) => {
    dispatch({ type: LOGIN_REQUEST });

    api.post('/auth/login', { loginHandle, password }).then(
      response => dispatch({ type: LOGIN_RECIEVE, response }),
      error => dispatch({ type: LOGIN_FAILURE, error })
    );
  };
}

轻松点。虽然这至少涵盖了我们70%的请求,但我确信有一种优雅的方式可以将上述代码抽象为类似这样的代码(伪代码):

export function login(loginHandle, password) {
  return (dispatch, getState, api) => api('POST', LOGIN_REQUEST, '/auth/login', { loginHandle, password });
}

当我们需要检查状态和其他副作用时,我们可以返回到适当的thunk。尽管在大多数情况下...我们可以把它砍掉?

有什么高雅的想法吗?

共有2个答案

申屠俊发
2023-03-14

不幸的是,在redux社区中没有通用的方法来解决这个确切的问题。我个人认为,人们不应该害怕围绕redux编写自己的自定义包装器来处理这种情况。

我创建了一个名为redux-tiles的库,它实际上具有几乎完全符合您需要的API:)例如,您的代码将如下所示:

import { createTile } from 'redux-tiles';
const login = createTile({
  type: ['user', 'login'],
  // params is an argument with which you call an action
  fn: ({ api, params }) => api('POST', '/auth/login', params),
});

如你所见,这里没有常数,还有一个缩减量。这些东西都是自动创建的,所以你不用做,也不用测试。还有其他特性,比如嵌套(例如,相同的函数将应用于通过id获取项目,但是它们将在reducer中正确更新)和缓存。你可以在这里查看例子。

重做传奇也是一件好事,但如果你需要某种反应性,如果你需要更传统的方法,只需要一种更方便的方式来描述你的行为并将它们组合起来,而不重复自己,那么我发现我的库是一个完美的匹配。

焦博实
2023-03-14

Redux Thunk允许您从2.1.0开始注入自定义参数。

const api = createApi() // you would write this function
const store = createStore(
  reducer,
  applyMiddleware(thunk.withExtraArgument(api))
)

// your action creator:
function fetchUser(id) {
  return (dispatch, getState, api) => {
    // you can use api here
  }
}

将来,如果你的砰砰声变得太复杂,你可能需要考虑重制传奇或可重做可观察。

 类似资料:
  • 本文向大家介绍redux Redux-thunk:基础知识,包括了redux Redux-thunk:基础知识的使用技巧和注意事项,需要的朋友参考一下 示例 虽然redux本身是完全同步的,但是您可以使用中间件redux-thunk来处理异步操作。 “ thunk”是回调的另一个名称。该函数通常作为参数传递,以便以后调用。 要使用,请将中间件应用于您的redux存储: 这使您可以将thunk传递给

  • Redux 很大部分 受到 Flux 的启发,而最常见的关于 Flux 的抱怨是必须写一大堆的样板代码。在这章中,我们将考虑 Redux 如何根据个人风格,团队偏好,长期可维护性等自由决定代码的繁复程度。 Actions Actions 是用来描述在 app 中发生了什么的普通对象,并且是描述突变数据意图的唯一途径。很重要的一点是 不得不 dispatch 的 action 对象并非是一个样板代码

  • 问题内容: 我正在使用React + Flux。我们的团队计划从助焊剂转变为还原剂。Redux对于来自助焊剂世界的我非常困惑。在 磁通控制中, 从 **组件- 操作->存储和存储更新返回组件 很** 简单。它很简单,也很清楚。 但在redux中令人困惑。这里没有商店,是的,有些例子没有使用商店。我经历了一些教程,看来每个人都有自己的实现风格。有些正在使用容器,有些则没有。(我不知道这个Contai

  • 问题内容: 据我所知并纠正我是否有错,redux-thunk是一个中间件,可以帮助我们在操作本身中调度异步函数并调试值,而当我使用redux- promise时 ,如果不实现自己的实现就无法创建异步函数作为Action的机制抛出仅分配纯对象的异常。 这两个软件包之间的主要区别是什么?在单个页面react应用程序中使用这两个软件包或坚持redux-thunk就足够了吗? 问题答案: 允许您的动作创建

  • Redux Thunk和Redux Saga都是Redux的中间件。两者之间的区别是什么?如何确定何时使用Redux Thunk或Redux Saga?

  • 本文向大家介绍redux的thunk作用是什么?相关面试题,主要包含被问及redux的thunk作用是什么?时的应答技巧和注意事项,需要的朋友参考一下 redux-thunk的作用:不使用中间件的情况,action只能是个对象,thunk帮助我们异步请求数据给store