【问题标题】:How to get selector working in redux-form app?如何让选择器在 redux-form 应用程序中工作?
【发布时间】:2019-04-20 07:59:54
【问题描述】:

我是一个反应新手,并试图在我的 redux-form 应用程序中使用选择器。这是一个简化的示例(原始表单包含数十个计算和字段)。它从表单中获取 2 个金额并返回:

import { createSelector } from "reselect";
import { sum } from "../calculations";

const sumAmounts = state =>{
    debugger
    if (!state) return;

    if (!state.amount1 || !state.amount2)
  return  sum(state.amount1,state.amount2);
};
export default createSelector(
    sumAmounts
);

当我运行我的表单时,它不会调用 sumAmounts:

import React from "react";
import { Field, reduxForm, formValueSelector } from "redux-form";
import { connect } from "react-redux";
import sumAmounts from "../selectors/sumSelector";

export class FormContainer extends React.Component {
  render() {
    return (
      <form>
        <Field
          name="amount1"
          type="number"
          component="input"
          label="Amount 1"
        />
        <Field
          name="amount2"
          type="number"
          component="input"
          label="Amount 1"
        />
        <Field
          name="amount3"
          type="number"
          component="input"
          label="Amount 3"
        />
        <Field
          name="amount4"
          type="number"
          component="input"
          label="Amount 4"
        />
        <Field
          name="amount4"
          type="number"
          component="label"
          label={this.props.sum}
        />
      </form>
    );
  }
}

FormContainer = reduxForm({
  form: "myForm" // a unique identifier for this form
})(FormContainer);

const selector = formValueSelector("myForm");

FormContainer = connect(state => {
  const amount1 = selector(state, "amount1");
  const amount2 = selector(state, "amount2");
  const sum = sumAmounts(amount1, amount2);
  return { amount1, amount2, sum };
})(FormContainer);

export default FormContainer;

我如何确保它被调用?

【问题讨论】:

    标签: reactjs redux selector redux-form


    【解决方案1】:

    您的 sumAmounts 不是选择器,您使用 2 个参数 (sumAmounts(amount1, amount2)) 调用它,但它只有一个参数 state

    在您的mapstatetoprops 中,您已经提取了计算总和所需的状态道具,即amount1amount2,那么为什么不在那里计算总和而不是通过其他选择器呢?

      const amount1 = selector(state, "amount1");
      const amount2 = selector(state, "amount2");
      const sum = +amount1 + +amount2;
      console.log("map state to props " , amount1, amount2, sum);
      return { amount1, amount2, sum }; 
    

    【讨论】:

    • 就像我说的那样,我得到了想要重用的计算,因此选择器设计。是否可以在选择器中进行计算?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 2018-08-13
    • 2020-10-13
    相关资源
    最近更新 更多