【问题标题】:set default value for select menu from mongodb从 mongodb 设置选择菜单的默认值
【发布时间】:2019-11-24 05:37:24
【问题描述】:

我有一个从数据库填充的下拉列表。第一个选项是 'none'(在数据库中使用 objectId 的实际记录),它应该是默认选项,只有在用户愿意时才需要更改,否则在提交表单时应该只使用该初始值。但是,即使它被选中并且具有有效的 objectId,我仍然会收到一个验证错误,指出该字段为空。只有当我从选择菜单中选择其他内容或选择其他内容然后再次选择“无”时,验证错误才会消失。我正在使用Joi-browser 进行验证。

schema = {
    subcategoryId: Joi.string()
      .required()
      .label("Subcategory"),
}

这是选择菜单:

<Form onSubmit={this.handleSubmit}>
        <Form.Group controlId="subcategoryId">
          <Form.Label>Sub-category</Form.Label>
          <Form.Control
            as="select"
            name="subcategoryId"
            value={this.state.data.subcategoryId}
            onChange={this.handleChange}
            error={this.state.errors.subcategory}
          >
            {this.state.subcategories.map(subcategory => (
              <option key={subcategory._id} value={subcategory._id}>
                {subcategory.name}
              </option>
            ))}
          </Form.Control>
          {this.state.errors.subcategoryId && (
            <Alert variant="danger">
              {this.state.errors.subcategoryId}
            </Alert>
          )}
        </Form.Group>

这是我的状态:

  state = {
    data: {
      name: "",
      description: "",
      categoryId: "",
      subcategoryId: "",
      price: ""
    },
    categories: [],
    subcategories: [],
    errors: {}
  };

const { data: subcategories } = await getSubcategories();
this.setState({ subcategories });

这是我希望默认选择的下拉列表第一个字段的 html 输出:

<option value="5d4b42d47b454712f4db7c67">None</option>

我得到的错误是类别 ID 不能为空,但选择菜单中的每个选项都有一个值。我是新手,但也许只有在更改时才实际分配值?

【问题讨论】:

  • 您可以添加您正在使用的表单库吗?
  • 你指的是验证吗?乔伊。
  • 是的,是客户端还是服务器端验证错误?您可以发布您用于此表单的 Joi 验证对象吗?
  • 哦,对不起。客户端。
  • 什么代码使用你的schema?你在哪里指定它?

标签: reactjs joi


【解决方案1】:

您需要编辑componentDidMount。获得子类别后,您需要将this.state.data.subcategoryId 的状态设置为其中一个类别。这是因为您使用的是controlled component。否则,它仍将设置为"",这不是&lt;select&gt; 组件的有效值之一,并且可能是验证失败的原因。

async componentDidMount() {
  // getting a copy of this.state.data so as not to mutate state directly
  const data = { ...this.state.data };
  const { data: subcategories } = await getSubcategories();

  // filter the array to a new array of subcategories that have the name === 'none'
  const arrayOfSubcategoriesWhereNameIsNone = subcategories.filter(i => i.name === 'none');

  const getIdOfFirstElementOfArray = arrayOfSubcategoriesWhereNameIsNone [0]._id;

  //set getIdOfFirstElementOfArray equal to the function's local copy of this.state.data.subcategoryId
  data.subcategoryId = getIdOfFirstElementOfArray;

  // update the state with the mutated object (the function's local copy of this.state.data)
  this.setState({ subcategories, data });
}

【讨论】:

  • 谢谢。我试图保持我的代码相同并合并你的代码,但我仍然收到验证错误。 const { data: subcategories } = await getSubcategories(); subcategories.subcategoryId = subcategories.filter( i =&gt; i.name === "None" )[0]._id; this.setState({ subcategories }); 然后在我输入的值的选择菜单中:value={ this.state.data.subcategoryId || this.state.subcategories.subcategoryId }
  • none 选项是否从您的数据库中返回?
  • 是的。我在谷歌开发工具中安装了 react 扩展,并且正确的对象 id 作为值存在。下拉菜单中也提供了所有选项。
  • 实际上,您的代码在我测试时可以 100% 运行。如果可能的话,你能否用一些关于正在发生的事情来编辑你的答案?我可以看到您从扩展运算符开始,然后它看起来像解构,因此可以访问子类别而无需使用 data.subcategories。然后获取“无”值的对象并设置状态。但是当你设置状态时,我并不真正理解“数据”部分。而且我可能对开头也错了:-P
猜你喜欢
  • 2017-04-28
  • 2018-12-05
  • 1970-01-01
  • 1970-01-01
  • 2011-09-11
  • 1970-01-01
  • 1970-01-01
  • 2016-07-07
  • 2013-07-22
相关资源
最近更新 更多