如何在react-select

时间:2018-09-28 08:59:43

标签: javascript reactjs react-select

我正在尝试使用自定义组件作为react-select中的输入字段。由于我需要验证,因此尝试将HTML5 oninvalid(JSX中的onInvalid)用作输入标签,并为oninvalid设置自定义消息。但是,我无法将消息作为道具传递给我在select中设置的组件。下面是我的代码。

Input.js

import React from "react";
import { components } from "react-select";

export default class Input extends React.Component {
  constructor(props) {
    super(props);
  }

  componentDidMount() {
    console.log("component mounted");
  }
  setInvalidMessage = event => {
    event.target.setCustomValidity("Custom Message");
  };

  render() {
    if (this.props.isHidden) {
      return <components.Input {...this.props} />;
    }
    return (
      <components.Input
        {...this.props}
        required
        onInvalid={this.setInvalidMessage}
      />
    );
  }
}

example.js

import React from "react";
import Input from "./Input";
import Select from "react-select";
import { colourOptions } from "./docs/data";

const InputBoxWithText = props => {
  return <Input {...props} />;
};

export default () => (
  <form>
    <Select
      closeMenuOnSelect={true}
      components={{ InputBoxWithText }}
      options={colourOptions}
    />
    <input type="submit" />
  </form>
);

如果我在Components属性中传递Input,我会在Input.js中得到硬编码消息。如果我通过InputBoxWithText我根本看不到输入安装。

index.js

import React from 'react';
import ReactDOM from 'react-dom';
import Example from './example';

ReactDOM.render(
<Example />,
document.getElementById('root')
);

这里是CodeSandBox.io URL

任何人都可以让我知道我做错了什么吗

4 个答案:

答案 0 :(得分:4)

最好通过select传递自定义道具:

props.selectProps

为避免每次选择更新时重新创建自定义组件,可能导致意外错误的原因。

答案 1 :(得分:3)

就我而言,我是以这种方式传递错误:

string input = "Manga vol 1-515";
var result = Regex.Match(input, @"(.{2})\s*$");

txtFirst.Text = input.Replace(result.ToString(), "");
txtSecond.Text = result.ToString();

然后像在colourStyles methods中的 <Select defaultValue={values} selectProps={{ errors }} isMulti options={inventoryList} onChange={changeTreeElement} // @ts-ignore styles={colourStyles} /> 一样访问它。

答案 2 :(得分:1)

我没有解决方案(我也在寻找相同的东西),但是您的示例存在多个错误。

要加载输入,您必须编写components={{ Input: InputBoxWithText }},因为Input的组件名称不是InputBoxWithText

onInvalid似乎也不是Input API的一部分,因此它将永远不会触发。您是否要使用<input oninvalid="" /> ..?

答案 3 :(得分:0)

不确定您是否已经找到解决方案,但我设法使用箭头功能传递了自定义道具

<Select
  closeMenuOnSelect={true}
  options={colourOptions}
  components={{
    Input: (inputProps: InputProps) => (
      <components.Input {...inputProps} />
    ),
  }}    
/>