Как новичок в программировании, я застрял с простым приложением, в котором перечислены элементы. Добавление элементов — это нормально. А вот что касается удаления одного элемента, то никак не могу понять, как реализовать эту функцию. Теперь при нажатии на элемент весь массив элементов удаляется. Я пытался поместить функцию deleteItem в другие файлы, но, кажется, перепутал ссылки.
ItemContext.js:
import React, { useState, createContext } from 'react';
import { v1 as uuidv1 } from 'uuid';
export const ItemContext = createContext();
export const ItemProvider = (props) => {
const [items, setItems] = useState([
{
name: "Red Beans",
amount: 23,
id: uuidv1()
},
{
name: "Nuts for Bunnies",
amount: 33,
id: uuidv1()
},
{
name: "Chopped Tomatoes",
amount: 2,
id: uuidv1()
}
]);
return (
<ItemContext.Provider value={[items, setItems]} >
{props.children}
</ItemContext.Provider>
);
}
AddItem.js:
import React, { useState, useContext } from 'react';
import { ItemContext } from './ItemContext';
const AddItem = () => {
const [name, setName] = useState('');
const [amount, setAmount] = useState('');
const [items, setItems] = useContext(ItemContext);
const updateName = (e) => {
setName(e.target.value)
}
const updateAmount = (e) => {
setAmount(e.target.value)
}
const addItem = (e) => {
e.preventDefault();
setItems(prevItems => [...prevItems, {name: name, amount: amount, key: items.id}])
}
return (
<form className="new-item" onSubmit={addItem}>
<input type="text" name="name" value={name} onChange={updateName} placeholder="Add a new item"/>
<input type="text" name="amount" value={amount} onChange={updateAmount} placeholder="Amount"/>
<button>Submit</button>
</form>
);
}
export default AddItem;
Item.js:
import React, { useState, useContext } from 'react';
import { ItemContext } from './ItemContext';
const Item = ({name, amount, /*deleteItem*/ }) => {
const [id, setId] = useState('');
const [items, setItems] = useContext(ItemContext);
const deleteItem = (id) => {
// const newItems = items.filter(item => items.id !== id);
// setItems(newItems);
const newItems = Object.assign([], ...items)
items.splice(id, 1);
setItems(newItems);
}
return (
<div>
<h3>{name}</h3>
<p>{amount}</p>
<button onClick={() => deleteItem(items.id)} className="delete-btn">Delete</button>
</div>
);
}
export default Item;
ItemsList.js:
import React, { useState, useContext } from 'react';
import Item from './Item';
import { ItemContext } from './ItemContext';
import { v1 as uuidv1 } from 'uuid';
const ItemsList = () => {
const [items, setItems] = useContext(ItemContext);
const [id, setId] = useState('');
const deleteItem = (id) => {
// const newItems = items.filter(item => items.id !== id);
// setItems(newItems);
const newItems = Object.assign([], ...items)
items.splice(id, 1);
setItems(newItems);
}
return (
<div className="items-list">
{items.map(item => (
<Item name={item.name} amount={item.amount} key={uuidv1()} deleteItem={deleteItem}/>
))}
</div>
);
}
export default ItemsList;
items.filter(item => items.id !== id)
должно быть достаточно для удаления элемента из массива. Кажется, у вас много дублированных состояний и несколько обработчиков удаления, это может быть частью вашей проблемы. Какое состояние является настоящимitems
состоянием? О, подождите, я вижу, вы вытаскиваете состояниеitems
из контекста. - person Drew Reese   schedule 11.03.2021