1. Я могу только добавлять и удалять «значение». Это не удаляет из UI, но я вижу значение «Добавить и удалить». Мне нужно удалить значение из UI, которое является меткой.
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>
)
}
}
Как это решить?
да, вы абсолютно правы
Для чего две кнопки?
при щелчке правой кнопкой мыши данные первого поля выбора переместятся во второе, а первое пустое. при щелчке со стрелкой влево данные второго поля выбора переместятся к первому выбору. второй пустой
Одним щелчком мыши вы хотите, чтобы все предметы в коробке были перемещены в другую?
да, одно удалить, а другое добавить, это как перетаскивание
Вы хотите, чтобы все 3 варианта перемещались одним щелчком мыши? Похоже, вы хотели бы по одному за раз.
можете ли вы увидеть свое решение, когда я нажимаю на элемент «три» после добавления «первого» значения, он не работает должным образом
мне нужны оба



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Не очень СУХОЕ, но вот очень тщательное решение: 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 раза, выберите не двигаться вправо, а также получил метку неопределенной ошибки
Хм, неясно, как вы хотите, чтобы предметы двигались. Вы хотите, чтобы все 3 элемента перемещались одним щелчком мыши? Или вы хотите удалить по одному?
Я хочу, чтобы 3 элемента перемещались одним щелчком мыши, а также получали один элемент одним щелчком мыши. Добавить и удалить
можешь починить его
Мне трудно понять ваше требование. Я процитирую то, что понял. Пожалуйста, поправьте, если я ошибаюсь. Вы должны выбрать список. В элементе списка выберите и нажмите кнопку. Вы хотите, чтобы элемент был перемещен в другой список. Это правильно ?