Как я могу добавить и удалить список полей выбора в reactjs

1. Я могу только добавлять и удалять «значение». Это не удаляет из UI, но я вижу значение «Добавить и удалить». Мне нужно удалить значение из UI, которое является меткой.

  1. Если пользователь щелкнет один список элементов в выбранном поле, он добавит данные внутри метода handleadd(). Мне не нужны повторяющиеся данные.

3. Если пользователь нажмет кнопку со стрелкой вправо, данные будут удалены из поля выбора (1) и добавлены в поле выбора (2).

4. Если пользователь нажмет кнопку со стрелкой влево, данные будут удалены из поля выбора (2) и добавлены в поле выбора (1).

class FieldForm extends React.Component {

  state = {
    itemlist:[],
    itemlist2:[]
  }
  onChange = e => {
    const newitems = [...this.state.itemlist]
    newitems.push(e.target.value);
    this.setState({
      itemlist:newitems
    });
  };


  handleadd = (data) => {
    this.setState({
      itemlist2:data
    })

  }
  handleremove= (data) => {
     console.info("remove",data)
    const newitems = [...this.state.itemlist2]

    newitems.pop(data);
    this.setState({
      itemlist2:data
    })
    console.info("data",data)
  }


  render() {

    const options = [

  {label:'Two', id:"2"
  },
 { label:'Three', id:"3"
}
,
{label:'Four', id:"4"
}]
    return (

    <select className = "custom-select" onChange = {this.onChange} multiple>
      {options&& options.map(item=>(  <option value = {item.label}>{item.label}</option>))}

    </select>
    <div className = "col-md-2 ">      
    <button onClick = {()=>this.handleadd(this.state.itemlist)} class = "btn btn-primary btn-block w-25 margin-bottom">
      <i class = "fa fa-arrow-right"></i>
    </button>
    <button onClick = {()=>this.handleremove(this.state.itemlist) }class = "btn btn-primary btn-block w-25">
      <i class = "fa fa-arrow-left"></i>
    </button>
    </div>

    <select className = "custom-select" multiple>
      {
        this.state.itemlist2.map(item=>( <option value = {item}>{item}</option>))
      }
    </select>
    )
  }
}

Как это решить?

Мне трудно понять ваше требование. Я процитирую то, что понял. Пожалуйста, поправьте, если я ошибаюсь. Вы должны выбрать список. В элементе списка выберите и нажмите кнопку. Вы хотите, чтобы элемент был перемещен в другой список. Это правильно ?

Ajay Varghese 14.07.2019 12:37

да, вы абсолютно правы

code Life 14.07.2019 12:51

Для чего две кнопки?

Ajay Varghese 14.07.2019 13:25

при щелчке правой кнопкой мыши данные первого поля выбора переместятся во второе, а первое пустое. при щелчке со стрелкой влево данные второго поля выбора переместятся к первому выбору. второй пустой

code Life 14.07.2019 13:31

Одним щелчком мыши вы хотите, чтобы все предметы в коробке были перемещены в другую?

Ajay Varghese 14.07.2019 13:32

да, одно удалить, а другое добавить, это как перетаскивание

code Life 14.07.2019 13:33

Вы хотите, чтобы все 3 варианта перемещались одним щелчком мыши? Похоже, вы хотели бы по одному за раз.

Chris Ngo 14.07.2019 13:38

можете ли вы увидеть свое решение, когда я нажимаю на элемент «три» после добавления «первого» значения, он не работает должным образом

code Life 14.07.2019 13:47

мне нужны оба

code Life 14.07.2019 13:52
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
9
1 102
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не очень СУХОЕ, но вот очень тщательное решение: https://codesandbox.io/s/gifted-mestorf-gpzx5

import React from "react";
import ReactDOM from "react-dom";

import "./styles.css";

class FieldForm extends React.Component {
  state = {
    itemlist: [
      { label: "Two", id: "2", enabled: true },
      { label: "Three", id: "3", enabled: true },
      { label: "Four", id: "4", enabled: true }
    ],
    itemlist2: [],
    itemsToBeRemovedFromList1: [],
    itemsToBeRemovedFromList2: []
  };

  onChangeItemList1 = e => {
    const { itemlist, itemsToBeRemovedFromList1 } = this.state;
    const foundItem = itemlist.find(item => item.label == e.target.value);

    let allItems = [...itemsToBeRemovedFromList1, foundItem];

    //add item to the to be removed list
    this.setState({
      itemsToBeRemovedFromList1: [...allItems]
    });
  };

  onChangeItemList2 = e => {
    const { itemlist2, itemsToBeRemovedFromList2 } = this.state;
    const foundItem = itemlist2.find(item => item.label == e.target.value);

    //check for duplicates
    let allItems = [...itemsToBeRemovedFromList2, foundItem];

    //add item to the to be removed list
    this.setState({
      itemsToBeRemovedFromList2: [...allItems]
    });
  };

  handleadd = () => {
    const { itemlist, itemsToBeRemovedFromList1, itemlist2 } = this.state;
    const idsOfToBeRemovedItems = itemsToBeRemovedFromList1.map(
      item => item.id
    );
    const newItemList1 = itemlist.filter(
      item => !idsOfToBeRemovedItems.includes(item.id)
    );

    const newItemList2 = itemlist.filter(item =>
      idsOfToBeRemovedItems.includes(item.id)
    );

    this.setState({
      ...this.state,
      itemlist: newItemList1,
      itemlist2: [...itemlist2, ...newItemList2],
      itemsToBeRemovedFromList1: []
    });
  };

  handleremove = () => {
    const { itemlist, itemsToBeRemovedFromList2, itemlist2 } = this.state;
    const idsOfToBeRemovedItems = itemsToBeRemovedFromList2.map(
      item => item.id
    );
    const newItemList2 = itemlist2.filter(
      item => !idsOfToBeRemovedItems.includes(item.id)
    );

    const newItemList1 = itemlist2.filter(item =>
      idsOfToBeRemovedItems.includes(item.id)
    );

    this.setState({
      ...this.state,
      itemlist: [...itemlist, ...newItemList1],
      itemlist2: newItemList2,
      itemsToBeRemovedFromList2: []
    });
  };

  render() {
    const { itemlist, itemlist2 } = this.state;
    return (
      <div>
        <select
          className = "custom-select"
          onChange = {this.onChangeItemList1}
          multiple
        >
          {itemlist &&
            itemlist.map(item => (
              <option id = {item.id} value = {item.label}>
                {item.label}
              </option>
            ))}
        </select>

        <select
          className = "custom-select"
          onChange = {this.onChangeItemList2}
          multiple
        >
          {itemlist2 &&
            itemlist2.map(item => (
              <option id = {item.id} value = {item.label}>
                {item.label}
              </option>
            ))}
        </select>
        <div className = "col-md-2 ">
          <button
            onClick = {this.handleadd}
            class = "btn btn-primary btn-block w-25 margin-bottom"
          >
            <i class = "fa fa-arrow-right" />
            Add
          </button>
          <button
            onClick = {this.handleremove}
            class = "btn btn-primary btn-block w-25"
          >
            <i class = "fa fa-arrow-left" />
            Remove
          </button>
        </div>
      </div>
    );
  }
}

const rootElement = document.getElementById("root");
ReactDOM.render(<FieldForm />, rootElement);

можете ли вы проверить, когда я выбираю 2 раза, выберите не двигаться вправо, а также получил метку неопределенной ошибки

code Life 14.07.2019 13:44

Хм, неясно, как вы хотите, чтобы предметы двигались. Вы хотите, чтобы все 3 элемента перемещались одним щелчком мыши? Или вы хотите удалить по одному?

Chris Ngo 14.07.2019 13:47

Я хочу, чтобы 3 элемента перемещались одним щелчком мыши, а также получали один элемент одним щелчком мыши. Добавить и удалить

code Life 14.07.2019 13:50

можешь починить его

code Life 14.07.2019 17:57

Другие вопросы по теме