有什么方法可以防止 react-select (Select.Async) 删除 unfocus 时的搜索输入值吗?
Is there any way to prevent react-select (Select.Async) from deleting the search input value on unfocus?
情况:
我有一个普通的 select(categories),它确定从 react-select.
为 Select.Async 加载哪些选项
问题:
假设有人在 Select.Async 中搜索一个选项,而 category A
是 selected。然后他意识到,他正在搜索的选项仅在 category B
中可用。所以他在第一个 select 中切换类别。但是当他点击 Select.Async 的搜索框时,他输入的内容消失了,他不得不重新输入。
即使我在搜索输入未聚焦时更新选项集,我是否可以做些什么来保留他的输入?
<select id="categories">
<option value="1" selected>A</option>
<option value="2">B</option>
<option value="3">C</option>
</select>
<Select.Async loadOptions={load} />
我想这就是你要找的道具:
<Select.Async loadOptions={load} onBlurResetsInput={false}/>
更多选项here
完整工作example:
export default class Layout extends React.Component {
constructor()
{
super();
this.state = {value: ""};
}
render(){
var load = (input, callback) => this.load(input, callback);
return (
<div class="container">
<select id="select">
<option value="1" selected>A</option>
<option value="2">B</option>
<option value="3">C</option>
</select>
<Select.Async
value={this.state.value}
onBlurResetsInput={false}
onChange={(newValue) => {
this.setState({value: newValue});
}}
loadOptions={load} />
</div>
);
}
load(input, callback){
var select = document.getElementById("select");
var selected = select.options[select.selectedIndex].value;
console.log(selected);
var options = [];
switch(selected){
case "1":
options = [{label: "A", value: 1}, {label: "B", value: 2}, {label: "C", value: 3}];
break;
case "2":
options = [{label: "D", value: 4}, {label: "E", value: 5}, {label: "F", value: 6}];
break;
case "3":
options = [{label: "G", value: 7}, {label: "H", value: 8}, {label: "I", value: 9}];
break;
}
callback(null, {
options: options
});
}
}
我发现了:
Select.Async 的 属性 value
不是输入字段的实际值。如果你想设置输入的 value
,有一个叫做 inputRenderer 的道具。您可以在 div 中定义一个输入,其中包含所有预定义的 inputProps
(只需编写 <input {...inputProps}
)并自行处理该值。
render(){
var inputChange = (input) => this.setState({value: input});
var renderInput = (inputProps) => {
if(this.state.value == ''){
this.state.placeholder = 'Select ...';
} else {
this.state.placeholder = '';
}
var setCurserPosAtEnd = (event) => {
if(event.target)
event.target.setSelectionRange(event.target.value.length, event.target.value.length);
}
return (
<div className='Select-input'>
<input {...inputProps} value={this.state.value} onFocus={setCurserPosAtEnd} />
</div>
);
}
return(
...
<Select.Async
loadOptions={loadOptionHandler}
onBlurResetsInput={false}
onCloseResetsInput={false}
inputRenderer={renderInput}
placeholder={this.state.placeholder}
onInputChange={inputChange} />
...
);
}
情况:
我有一个普通的 select(categories),它确定从 react-select.
为 Select.Async 加载哪些选项
问题:
假设有人在 Select.Async 中搜索一个选项,而 category A
是 selected。然后他意识到,他正在搜索的选项仅在 category B
中可用。所以他在第一个 select 中切换类别。但是当他点击 Select.Async 的搜索框时,他输入的内容消失了,他不得不重新输入。
即使我在搜索输入未聚焦时更新选项集,我是否可以做些什么来保留他的输入?
<select id="categories">
<option value="1" selected>A</option>
<option value="2">B</option>
<option value="3">C</option>
</select>
<Select.Async loadOptions={load} />
我想这就是你要找的道具:
<Select.Async loadOptions={load} onBlurResetsInput={false}/>
更多选项here
完整工作example:
export default class Layout extends React.Component {
constructor()
{
super();
this.state = {value: ""};
}
render(){
var load = (input, callback) => this.load(input, callback);
return (
<div class="container">
<select id="select">
<option value="1" selected>A</option>
<option value="2">B</option>
<option value="3">C</option>
</select>
<Select.Async
value={this.state.value}
onBlurResetsInput={false}
onChange={(newValue) => {
this.setState({value: newValue});
}}
loadOptions={load} />
</div>
);
}
load(input, callback){
var select = document.getElementById("select");
var selected = select.options[select.selectedIndex].value;
console.log(selected);
var options = [];
switch(selected){
case "1":
options = [{label: "A", value: 1}, {label: "B", value: 2}, {label: "C", value: 3}];
break;
case "2":
options = [{label: "D", value: 4}, {label: "E", value: 5}, {label: "F", value: 6}];
break;
case "3":
options = [{label: "G", value: 7}, {label: "H", value: 8}, {label: "I", value: 9}];
break;
}
callback(null, {
options: options
});
}
}
我发现了:
Select.Async 的 属性 value
不是输入字段的实际值。如果你想设置输入的 value
,有一个叫做 inputRenderer 的道具。您可以在 div 中定义一个输入,其中包含所有预定义的 inputProps
(只需编写 <input {...inputProps}
)并自行处理该值。
render(){
var inputChange = (input) => this.setState({value: input});
var renderInput = (inputProps) => {
if(this.state.value == ''){
this.state.placeholder = 'Select ...';
} else {
this.state.placeholder = '';
}
var setCurserPosAtEnd = (event) => {
if(event.target)
event.target.setSelectionRange(event.target.value.length, event.target.value.length);
}
return (
<div className='Select-input'>
<input {...inputProps} value={this.state.value} onFocus={setCurserPosAtEnd} />
</div>
);
}
return(
...
<Select.Async
loadOptions={loadOptionHandler}
onBlurResetsInput={false}
onCloseResetsInput={false}
inputRenderer={renderInput}
placeholder={this.state.placeholder}
onInputChange={inputChange} />
...
);
}