No you don't have to create internal state. That's an anti pattern to create a local state just to keep a copy of props of the component.
You can keep your state on parent component in your case. Your child component can execute callbacks like you used,
for example,
const [items, _] = useState(initialItemArray); const updateItem = useCallback((updatedItem) => { // do update }, [items]) const deleteItem = useCallback((item) => { // do delete }, [items]) <Child data={item} onUpdate={updateItem} onDelete={deleteItem} /> Also note you shouldn't over use useCallback & useMemo. For example, if your list is too large and you use useMemo for Child items & React re renders multiple 100 - 1000 of list items that can cause performance issue as React now have to do some extra work in memo hoc to decide if your <Child /> should re render or not. But if the Child component contain some complex UI ( images, videos & other complex UI trees ) then using memo might be a better option.
To fix the issue in your 3rd point, you can add some unique key ids for each of your child components.
<Child key={item.id} // assuming item.id is unique for each item data={item} onUpdate={(updatedItem) => {}} onDelete={(item) => {}} /> Now react is clever enough not to re render whole list just because you update one or delete one. This is one reason why you should not use array index as the key prop