react-select 如何编辑创建的条目

Posted

技术标签:

【中文标题】react-select 如何编辑创建的条目【英文标题】:react-select how to edit created entries 【发布时间】:2017-11-09 21:40:50 【问题描述】:

我正在使用 Select.AsyncCreatable:

<Select.AsyncCreatable
      clearableValue=true
      multi=true
      scrollMenuIntoView=true
      name="field-name"
      value=values
      loadOptions=this.getOptions
      onChange=value => 
        this.handleOnChange(value...)
      
      placeholder=this.defaultPlaceholder
      />

如何编辑我创建的选项。我可以删除创建的选项并重新输入它们,但是否有编辑选定值的选项?会更舒服。

【问题讨论】:

您找到解决方案了吗?我也在苦苦挣扎,不确定唯一的解决方案是否是转储整个 react-select 组件? 也许github.com/JedWatson/react-select/issues/… 有帮助。 @marcel 我设法编辑了一个自定义标签,请查看***.com/q/49598138 您是否成功地完成了这项工作?我也需要这个。 【参考方案1】:

不知道如何使用 react-select,但我认为您正在寻找的是 editable-creatable-multiselect

这是一个演示:

【讨论】:

【参考方案2】:

我真的找不到任何解决方案,所以我只是修改了我在网上找到的内容并使其可编辑:

https://codesandbox.io/s/n4nqrjw564

希望对您有所帮助。

编辑添加代码:

import React from "react";

const initialValues = [
   label: "Test1", value: "Test1" ,
   label: "Test2", value: "Test2" ,
   label: "Test3", value: "Test3" 
];

const createOption = label => (
  label,
  value: label
);

export default class TagsInput extends React.Component 
  constructor(props) 
    super(props);

    this.state = 
      //value: [],
      value: initialValues,
      focused: false,
      inputValue: ""
    ;

    this.handleInputChange = this.handleInputChange.bind(this);
    this.handleInputKeyDown = this.handleInputKeyDown.bind(this);
    this.handleEditItem = this.handleEditItem.bind(this);
    this.handleBlur = this.handleBlur.bind(this);
  

  render() 
    const styles = 
      container: 
        border: "1px solid #ddd",
        padding: "5px",
        borderRadius: "5px"
      ,

      items: 
        display: "inline-block",
        padding: "2px",
        border: "1px solid black",
        fontFamily: "Helvetica, sans-serif",
        borderRadius: "5px",
        marginRight: "5px",
        cursor: "pointer"
      ,

      input: 
        outline: "none",
        border: "none",
        fontSize: "14px",
        fontFamily: "Helvetica, sans-serif"
      
    ;
    return (
      <label>
        <ul style=styles.container>
          this.state.value.map((item, i) => (
            <li key=i style=styles.items onClick=this.handleEditItem(i)>
              item.label
            </li>
          ))
          <input
            style=styles.input
            value=this.state.inputValue
            onChange=this.handleInputChange
            onKeyDown=this.handleInputKeyDown
            onBlur=this.handleBlur
          />
        </ul>
      </label>
    );
  

  handleBlur(evt) 
    const  value  = evt.target;

    if (value !== "") 
      this.setState(state => (
        value: [...state.value, createOption(value)],
        inputValue: ""
      ));
    

    console.log(this.state.value);
  

  handleInputChange(evt) 
    this.setState( inputValue: evt.target.value );
  

  handleInputKeyDown(evt) 
    if (evt.keyCode === 13) 
      const  value  = evt.target;

      if (value !== "") 
        this.setState(state => (
          value: [...state.value, createOption(value)],
          inputValue: ""
        ));
      
    

    if (evt.keyCode === 9) 
      const  value  = evt.target;

      if (value !== "") 
        this.setState(state => (
          value: [...state.value, createOption(value)],
          inputValue: ""
        ));
      
    

    if (
      this.state.value.length &&
      evt.keyCode === 8 &&
      !this.state.inputValue.length
    ) 
      this.setState(state => (
        value: state.value.slice(0, state.value.length - 1)
      ));
    

    console.log(this.state.value);
  

  handleEditItem(index) 
    return () => 
      let it = this.state.value.filter((item, i) => i === index);
      console.log(it);
      this.setState(state => (
        value: state.value.filter((item, i) => i !== index),
        inputValue: it[0].label
      ));
      //need to change to text box or open a new textbox
    ;
  

【讨论】:

以上是关于react-select 如何编辑创建的条目的主要内容,如果未能解决你的问题,请参考以下文章

如何在vue.js中创建用于创建和编辑功能的简单模式?

编辑 Android 日记条目

PHP 模式添加、编辑、查看和删除数据库条目

GraphQL 编辑条目添加新条目

react-select:如何解决“警告:道具`id`不匹配”

如何在 react-select 中设置默认值