【问题标题】:Pass a prop to redux将 prop 传递给 redux
【发布时间】:2019-03-19 20:35:11
【问题描述】:

我有以下代码:

main.js

submit(v) {
    console.log(v);
    const price = v.get("price");
  }

render() {  
<form onSubmit={handleSubmit(this.submit)}>
    <Field
    name="products"
    categoryId={categoryId}
    component={MyComponent}
    />

    <MySubmitComponent
    confirm={handleSubmit(this.submit)}
    />
  </form>
}

MyComponent.js

{this.props.products.map((product, index) => (
<ProductDetails
productId={product.productId}
price={product.price}
/>
))}

ProductsDetails.js

    <Field
    name="price"
    price={price}
    component={PriceText}
    initialValues
    />

    const selector = formValueSelector("products");
    const mapStateToProps = (state, ownProps) => {
      return {
        initialValues: { productId: ownProps.productId },
        productId: selector(state, "productId")
      };
    };
    ProductsDetails= connect(mapStateToProps)(ProductsDetails);

当我更改产品的价格并按下提交时,提交函数中的变量值仅包含产品的新价格而没有其 productId。我还需要 productId 来通知相应的产品。我错过了什么?

【问题讨论】:

  • 您在哪里维护products 以及如何更新价格?
  • @huMptyduMpty 我在数据库中维护产品,并通过单击文本字段来更新价格。这是无关紧要的,因为我主要担心的是,在我只能有一个名称和一个值的字段中,我想要另一个稳定且不会改变的道具。这是产品 ID。现在,当我更改产品的价格并按下按钮提交时,我只接受没有其 productId 的新价格。但是如果没有 productId,我将无法进一步处理新价格。是否可以将 productId 作为字段中的不可更改道具传递?

标签: reactjs react-native redux react-redux redux-form


【解决方案1】:
class MyComponent extends Component {
  constructor(props) {
    super(props);
    this.state = {
        activeIndex: 0
    };
    this.submit = this.submit.bind(this);
    this.goForward= this.goForward.bind(this);
  }

  submit(values) {
    console.log(values);
  }

  goForward() {
    let index = this.state.activeIndex;
    let productsSize = products.length - 1;

    if (index === productsSize) {
      index = -1;
    }

    ++index;

    this.setState({
      activeIndex: index
    });
  }

  render() {
      <form onSubmit={handleSubmit(this.submit)} name="edit">
          {this.props.products.map((product, index) => (
          <ProductDetails
          productId={product.productId}
          price={product.price}
          />
          ))}
    </form>
  }


let MyProductComponent = reduxForm({ form: "edit" })(
  MyComponent
);

const mapStateToProps = (state, ownProps) => {
  console.log(formValueSelector("edit")(
        state,
        "activeIndex");
  return {
    initialValues: {
      productId: formValueSelector("edit")(
        state,
        "activeIndex"
      )
    }
  };
};

MyProductComponent = withRouter(
  connect(mapStateToProps)(toJS(MyProductComponent))
);

【讨论】:

  • 请添加您在做什么的详细信息/文档。
  • 我正在显示一些产品的详细信息,例如价格、尺寸、颜色等。当您单击调用 goForward() 的按钮 Next 时,会显示每个产品。您还可以更改产品的价格,并且存在“提交”按钮。我的问题是当我按下一步查看另一个产品时,productId 没有获得当前值。它保存初始值,即第一个产品的 productId (this.state = { activeIndex: 0 };)。 goForward() 中的函数 setState 正在工作。但是为什么我还是得到了初始值呢?
  • enableReinitialize 道具对未定义有很大帮助,但状态没有改变。
  • 我不确定我是否正确理解了问题,但可以选择在 goForward 方法中使用 redux-form change action creator` 更新当前产品。这是一个示例:stackoverflow.com/questions/45230531/… 但是我建议您打开一个新的详细问题,仅与此问题相关,因为它与当前问题的详细信息无关。请提供完整的详细信息。
  • 另外,如果您按照我在回答中提到的方式进行操作,产品和价格对将以单一形式组织,您就不会有这样的问题。请尝试理解我的回答并试一试。
【解决方案2】:

据我所知并使用过redux-form,一个 Field 组件将只有一个在 Store 中注册的值。

因此,您可以将其视为具有不同的多个表单,其中每个表单将具有单独的 productIdprice 字段。提交表单后 - 您将拥有这两个字段的值。

Here's en example of creating multiple Forms.

根据您的用例,它会是这样的:

用法:

{ this.props.products.map(({ productId, price }, index) => (
  <Form form={`product-${productId}`} initialValues={{ productId, price }} />
/>
))}

&lt;Form /&gt;:

const Form = reduxForm({
  // no need to put form again here as we are sending form props.
})(FormComponent);

&lt;FormComponent /&gt; - 只是演示组件:

export const FormComponent = ({ handleSubmit }) => <form onSubmit={handleSubmit}>
  <Field
    name="price"
    component={PriceText}
  />
</form>

【讨论】:

  • 但我不想更新 procuctId。我只想将它与 priceId 一起传递。 PriceId 可以更改,但 procuctId 不能。
  • 是的。这将是一个隐藏的领域。刚刚在表格中注册。以这种方式进行 - productId 无法更新,但两个字段都将在表单提交时可用。
  • 这不起作用。当我按下提交时,我需要更改内容以查看值。 :-(
  • 只需添加type='hidden'
  • 这只是隐藏了组件。它不会改变任何东西。
猜你喜欢
  • 2020-05-22
  • 2019-07-25
  • 1970-01-01
  • 1970-01-01
  • 2019-06-26
  • 2018-08-18
  • 2021-05-12
  • 1970-01-01
  • 2019-02-17
相关资源
最近更新 更多