【问题标题】:Use comma to create a new tag on #react-select使用逗号在 #react-select 上创建一个新标签
【发布时间】:2018-12-06 15:53:28
【问题描述】:

在版本 1.3.0 上,每次用户按“,”键时,react-select 都会创建一个新标签,这很有用,因为在实现这个库之前,我们有一些案例是用户引入标签作为按回车键而不是多个字符串。

不幸的是,在 2.0 的重构之后我找不到任何方法来做到这一点,有什么方法可以配置这种行为吗?

【问题讨论】:

  • 请添加更多详细信息。至少问题应该包括代码的最小示例以及您当前尝试过的内容。
  • 我不确定代码示例是否相关,我要问的是,是否可能,因为我在文档或其他 react-select 实现中找不到任何内容版本。此外,在存储库中创建新问题时,他们鼓励在不是直接代码问题时在 StackOverflow 上提出问题。

标签: javascript reactjs react-select


【解决方案1】:

您需要自定义一点react-select 才能实现您想要的。

基本上这就是我最终得到的结果:

import React, { Component } from "react";

import CreatableSelect from "react-select/lib/Creatable";

type State = {
  options: [{ [string]: string }],
  value: string | void
};

const createOption = (label: string) => ({
  label,
  value: label.toLowerCase().replace(/\W/g, "")
});

const defaultOptions = [
  createOption("One"),
  createOption("Two"),
  createOption("Three")
];

export default class CreatableAdvanced extends Component<*, State> {
  state = {
    inputValue: "",
    options: defaultOptions,
    value: []
  };
  onKeyDown = e => {
    if (e.keyCode === 188) {
      e.preventDefault();
      if (this.state.inputValue !== "") {
        this.handleCreate(this.selectRef.state.inputValue.slice(0, -1));
      }
    } else {
      this.setState({ inputValue: this.state.inputValue + e.key });
    }
  };
  handleChange = (newValue: any, actionMeta: any) => {
    this.setState({ value: newValue });
  };
  handleCreate = (inputValue: any) => {
    const { options, value } = this.state;
    const newOption = createOption(inputValue);
    this.setState({
      inputValue: "",
      options: [...options, newOption],
      value: [...value, newOption]
    });
  };
  render() {
    const { isLoading, options, value } = this.state;
    return (
      <CreatableSelect
        ref={r => (this.selectRef = r)}
        isClearable
        isMulti
        isDisabled={isLoading}
        isLoading={isLoading}
        inputValue={this.state.inputValue}
        onKeyDown={this.onKeyDown}
        onChange={this.handleChange}
        onCreateOption={this.handleCreate}
        options={options}
        value={value}
      />
    );
  }
}

这里是您想要的live example

这个想法是绕过select的原生inputValue并传递你自己的。使用onKeyDown 函数,您可以决定填充inputValue 或创建一个新标签。

【讨论】:

  • 您的解决方案可以使用逗号创建标签,但我需要完全复制输入的行为,例如,使用 backspace 或任何特殊键(如 enter, ctrl, alt, supr... 会打印键名,有什么办法轻松解决这个问题?我正在尝试有条件地处理它们,但这似乎是一个复杂的解决方案。
  • @DanielDoblado 好的,在你的问题中并没有真正解释我会尝试更新我的代码来做你想做的事,但我需要一个你在谈论特殊键的例子
  • 我需要一个例子来说明你所说的特殊键”你可以用你的例子codesandbox.io/s/74801436q6看到我的意思,如果你尝试使用退格键、Alt 或 Ctrl i.imgur.com/p0AlwCn.png 等键,非常感谢
猜你喜欢
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-10
  • 2020-11-16
  • 2020-02-11
  • 2019-02-27
  • 1970-01-01
相关资源
最近更新 更多