我正在尝试使用自定义组件作为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')
);
任何人都可以让我知道我做错了什么吗
答案 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} />
),
}}
/>