当前位置: 首页 > 面试题库 >

Redux形式的handleSubmit:如何访问存储状态?

强保臣
2023-03-14
问题内容

在进行handleSubmitAjax调用的redux-form 函数中,Ajax中需要Redux状态的某些属性(例如,用户ID)。

这将是很容易的,如果我想定义handleSubmit形式的成分,只要调用:mapStateToProps在任何我需要传递,并从阅读this.props中我的handleSubmit

但是,像一个出色的React-Redux开发人员一样,我编写了 单独的视图组件和容器 ,因此视图组件可以很简单,几乎没有行为。因此,我想
在我的container中定义handleSubmit

同样,设置简单-redux-form来做到这一点。定义一个onSubmitmapDispatchToProps和形式会自动调用它。

除非等等,mapDispatchToProps否则无法访问redux状态。

好的,没问题,我将需要的道具handleSubmit和表单值一起传递给我。

嗯,等等,handleSubmit使用这种机制不可能传递任何数据!您将获得一个参数,values而无法添加另一个参数。

这留下了以下没有吸引力的选择(我可以验证其中的1和2是否有效):

1 在表单组件中定义一个提交处理程序,
然后调用从mapDispatchToProps传入的我自己的自定义提交处理程序函数。没关系,但是需要我的组件从redux状态知道一些不需要显示表单的道具。(此问题并非redux-
form所独有。)

dumbSubmit(values)
{
  const { mySubmitHandler, user} = this.props;
  mySubmitHandler(values, user);
}

<form onSubmit={ handleSubmit(this.dumbSubmit.bind(this)) }>

或者,更简洁地说,这些都可以组合成箭头函数:

<form onSubmit={ handleSubmit((values)=>{mySubmitHandler(values, this.props.user);}

然后,要使该处理程序完全不可知,可以将整个this.props传递回自定义处理程序:

<form onSubmit={ handleSubmit((values)=>{mySubmitHandler(values, this.props);}

2 在mergeProps中 而不是mapDispatchToProps中 定义onSubmit
,因此它可以访问stateProps。Dan
Abramov建议不要使用mergeProps(出于性能原因),因此这似乎不是最佳选择。

  function mergeProps(stateProps, dispatchProps, ownProps) {
  const { user } = stateProps.authReducer;
  const { dispatch } = dispatchProps;
  return {
    ...ownProps,
    ...dispatchProps,
    ...stateProps,
     onSubmit: (values) => {
       const { name, description } = values;
       const thing = new Thing(name, description, []);
       dispatch(createNewThing(thing, user.id));
     }
  }

3 将状态属性复制到redux-form字段中 ,该 字段
未映射到表单组件中的任何输入控件。这将确保可以在values传递回的参数中访问它们handleSubmit。这似乎是一种hack。

一定有更好的方法!

有没有更好的办法?


问题答案:

在花时间完善了这个问题之后,选项#1 在最终迭代实际上是相当不错的
(将所有prop传递回自定义处理程序的箭头函数)。它允许组件为无状态的,并且完全不了解其不使用的任何状态。因此,我将其称为一个合理的答案。我想听听您更好的解决方案!

在表单组件中使用箭头函数定义一个提交处理程序,然后调用从mapDispatchToProps传入的我自己的自定义提交处理程序功能。

<form onSubmit={ handleSubmit((values)=>{mySubmitHandler(values, this.props.user);}

然后,要使此处理程序完全不可知,请将整个this.props传递回自定义处理程序:

<form onSubmit={ handleSubmit((values)=>{mySubmitHandler(values, this.props);}

如果Submit函数只需要不属于表单的值和prop,则我们可以只传回表单不使用的prop。在无状态组件中,可能看起来像:

const Thing_Create = ({ fields: {name, description}, 
    error, 
    handleSubmit, 
    mySubmitHandler, 
    submitting, 
    onCancel, 
    ...otherprops}) => {
return (
<div>
  <form onSubmit={ handleSubmit((values)=>{
    mySubmitHandler(values, otherprops);}) }>
[rest of form definition would go here]


 类似资料:
  • 问题内容: 我只是做一个简单的应用程序来学习与redux异步。我已经使所有工作正常进行,现在我只想在网页上显示实际状态。现在,我实际上如何在render方法中访问商店的状态? 这是我的代码(所有内容都在一页中,因为我只是在学习): 因此,在状态的render方法中,我想列出商店中的所有内容。 谢谢 问题答案: 您应该创建单独的组件,该组件将侦听状态更改并在每次状态更改时进行更新:

  • 我只是做了一个简单的应用程序学习异步与Redux。我已经使所有的工作,现在我只想显示的实际状态到网页上。现在,我如何在render方法中实际访问存储的状态? 这里是我的代码(所有内容都在一个页面中,因为我只是在学习): 谢谢

  • 问题内容: 我正在使用Redux进行状态管理。 如何将商店重置为初始状态? 例如,假设我有两个用户帐户(和)。 想象以下事件序列: 用户登录到该应用程序并执行某些操作,因此我们在存储中缓存了一些数据。 用户注销。 用户无需刷新浏览器即可登录应用程序。 此时,缓存的数据将与关联,我想对其进行清理。 当第一个用户注销时,如何将Redux存储重置为其初始状态? 问题答案: 一种方法是在应用程序中编写根减

  • 问题内容: 我有一个化简器,为了计算新状态,我需要操作中的数据以及该化简器未管理的部分状态数据。具体来说,在下面将显示的减速器中,我需要访问该字段。 initialState.js: FormsReducer.js: index.js(根减速器): 如何访问此字段? 问题答案: 我将为此使用thunk,这是一个示例: 基本上,您会获得操作所需的所有数据,然后可以将该数据发送到减速器。

  • 问题内容: 我只有一个组件,试图使用来保存状态。在index.js中,我只为组件设置存储。 index.js 我有这种方法可以将状态映射到props中,该props在内部。 App.js 到目前为止一切都很好,现在我不确定如何在另一个组件中访问? 如果要访问另一个组件,我需要在第二个组件中进行哪些更改? 问题答案: 使用提供程序时,作为提供程序高阶组件的子级的任何组件都可以通过使用功能来访问商店属

  • 问题内容: 该赛普拉斯文档说可以 公开数据存储区(例如Redux中的数据存储区),以便您可以通过编程方式直接从测试代码中更改应用程序的状态。 我还观看了Kent C. Dodds先生的测试课程,他提到可以使用Cypress中的现有数据来初始化redux存储(在测试之前或之中,不确定) 我浏览了几乎所有的文档并进行了谷歌搜索,除了在介绍页面上将其作为关键区别之一外,我只是找不到任何实际执行此操作的参