React-Select 输入内容在 select 未聚焦时消失

React-Select input contents disappear when select is not focused

我已经愉快地使用 react-select 一段时间了,但是我遇到了关于组件的 Creatable 版本的问题。

这是我的代码:

const options = [
  {
    label: 'One',
    value: 'One'
  },
  {
    label: 'Two',
    value: 'Two'
  },
  {
    label: 'Three',
    value: 'Three'
  },
  {
    label: 'Four',
    value: 'Four'
  }
];

const selectedItems = [
  {
    label: 'One',
    value: 'One'
  }
];

const App = () => (
  <div style={styles}>
    <Select.Creatable
      backspaceRemoves={true}
      multi
      openOnFocus={false}
      openOnClick={false}
      onSelectResetsInput={false}
      onBlurResetsInput={false}
      onCloseResetsInput={false}
      arrowRenderer={() => null}
      clearRenderer={() => null}
      options={options}
      value={selectedItems} />
  </div>
);

我还在这里创建了一个可运行的版本:https://codesandbox.io/s/q27lnon96

如您所见,如果您访问沙盒页面,当用户点击离开时,输入到 select 中的任何文本都会消失。如果 select 再次获得焦点,它会重新出现。

明确地说,我的问题是关于输入到输入中的文本 "two" - 这不是 selected 值的问题(如果状态和回调正确,这些值就可以正常工作已配置)。

如何让 react-select 保留输入的内容?看起来它在内部记住了这个值,但是当它不再有焦点时隐藏了文本输入。我认为将各种 onFooResetsInput 全部设置为 false 可以实现此目的,但效果并不理想。

我的应用程序正在使用输入此输入的文本值来影响 UI 的其他元素,因此当文本被隐藏时它看起来不同步。

您需要处理 onChange 事件并使 selectedItems 成为组件状态的一部分。在你的情况下 selectedItems 永远不会改变。

看看https://codesandbox.io/s/pyo17y6qv7

编辑

是的,它适用于 inputRenderer。函数的默认参数将值传递给输入(这就是输入值消失的原因,因为当它处于 onBlur 状态时,它会将值 '' 传递给输入。可能是 react-select 上的错误,因为我们有 onBlurResetsInput flag false) 所以我们需要在将它传递给我们自己的输入之前将其删除。 https://codesandbox.io/s/54on0mr984

上的更新代码

对于仍然对 react-select version2.

的解决方案感兴趣的任何人

以下解决方案适用于 react-select v2.

Docs - https://react-select.com/upgrade-guide#concepts

import React, { useState } from 'react'
import { default as ReactSelect } from "react-select";



function Select(props) {

    const [inputValue, setinputValue] = useState('')

    const onInputChange = (inputValue, event) => {
        if (event.action==='input-change'){
            setinputValue(inputValue)
        }  
    }
    
    return (
            <ReactSelect
                onInputChange={onInputChange}
                inputValue={inputValue}
            />
    )
}

export default Select