3

我正在处理评论部分并使用 redux-form 来获取输入。我只有一个 Field 组件用于输入。但是当我在输入框中输入时,所有输入框都填充了相同的值。我知道这是因为所有这些输入框都具有相同的名称。但我只想将值填充到选定的输入框中。我该怎么做呢?

这是我的组件:

import { compose } from "redux";
import { connect } from "react-redux";
import React, { Component } from "react";
import { Field, reduxForm } from "redux-form";

import { addComment, fetchPosts } from "../../../actions/FeedPost";
import "./FeedCommentsInput.css";
import TextareaAutosize from "react-textarea-autosize";

class FeedCommentsInput extends Component {
  renderField = field => {
    const { touched, error } = field.meta;
    const className = `comment-input-box ${
      touched && error ? "red-border__error-comment" : ""
    }`;
    return (
      <TextareaAutosize
        {...field.input}
        placeholder={field.placeholder}
        type={field.type}
        className={className}
      />
    );
  };

  onSubmit = formProps => {
    const { postid } = this.props;
    this.props.addComment(formProps, postid);
  };

  render() {
    const { handleSubmit } = this.props;

    return (
      <div>
        <form onSubmit={handleSubmit(this.onSubmit)}>
          <Field
            name="text"
            component={this.renderField}
            type="text"
            placeholder="Enter your Comment"
          />
          <button type="submit">Submit</button>
        </form>
      </div>
    );
  }
}

const validate = values => {
  const errors = {};

  if (!values.comment) errors.comment = "Please Enter Something";

  return errors;
};

export default compose(
  connect(
    null,
    { addComment, fetchPosts }
  ),
  reduxForm({ validate, form: "commentbox" })
)(FeedCommentsInput);
4

3 回答 3

3

只需将唯一的form道具传递给您的表单组件。

您的redux-form集成将更改为

// No need to configure `form`, because it would be set dynamically via props
reduxForm({ validate })

用法:

<Form form={`commentbox_${uuid}`} />

学分

于 2018-10-23T10:18:27.460 回答
1

这就是为什么我认为在使用复杂的库时,比如reduxForm建立一个基本案例并让它工作很重要。我的意思是我会先实现一个简单的表单,在继续编写你编写的大量代码之前确保它可以工作,以便稍后发现某些东西不能正常工作。

例如,我会从这个开始:

class FeedCommentsInput extends Component {
  render() {
    return ( 
    <div>
       <form onSubmit={this.props.handleSubmit(values => console.log(values))}>
           <Field type=“text” name=“feedTitle” component=“input” />
        <button type=“submit”&gt;Submit</button>
       </form>
    </div>
    );
  }
}

export default reduxForm({ form: 'FeedCommentsInput' })(FeedCommentsInput);

没有验证,没有别的,只是这个简单的设置,当然包括导入和导出语句。现在通过这个设置,当用户提交表单时,redux form 传递给我们的函数将被调用,它会在内部调用我在里面传递的函数onSubmit

然后我会去浏览器并通过添加一些文本并单击提交来测试它,当我这样做时,我应该看到一个控制台日志,其中包含feedTitle我输入的文本的键和值。

简而言之,这几乎是整个流程,reduxForm这是我首先要建立的,以确保一切正常。

当我将onSubmit处理程序添加到表单然后handleSubmit()在其中调用并提供我的箭头功能时。只要用户提交表单,就会自动调用箭头函数。

控制台日志中的 values 对象是输入到输入中的文本,对象的键是name添加到 Field 组件中的。这就是为什么组件name所需的属性Field也可以用来帮助您的原因。如果您没有看到feedTitle,那么在您继续编写验证代码等之前,您会知道某些东西无法正常工作。

于 2018-10-24T17:56:19.920 回答
1

您有许多评论表单,但所有评论框都使用相同的表单 ( commentbox),这会产生问题。

您需要动态创建一个带有索引子前缀的表单:

const commentForm1 = reduxForm({ validate, form: "commentbox_1" })
const commentForm2 = reduxForm({ validate, form: "commentbox_2" })
于 2018-10-23T10:23:50.407 回答