Одним из решений может быть создание метода removeCard в App, который запускается, если не происходит событие click, которое вы хотите контролировать addNewCard.
// App.js
...
const removeCard = username => {
console.log("Tried to remove card ....", username)
setCards([...cards.filter(card => card.name != username)])
}
Затем вы передаете и removeCard, и addNewCard в CardList.
// App.js
...
<CardsList remove={removeCard} cards={cards} add={addNewCard}/>
Продолжите и передайте эти методы в Card в CardsList.Вам также понадобится некоторая опора на карте, назначенная логическому значению, например «selected».
// CardsList.js
return (
<div>
{props.cards.map(card => (
<Card key={card.html_url} {... card}
remove={handleClick}
add={props.add}
selected={false}
/>
))}
</div>
Настройте событие ловушки и щелчка в дочернем компоненте Card,
// Card.js
...
const [selected, selectCard] = useState(false)
...
и настройте ваши события, чтобы вызвать ловушку и использовать состояние.
// Card.js
...
return (
<div style={{margin: '1em', opacity: selected ? '1' : '0.5'}}
onMouseLeave={() => selected ? null : props.remove(props.name)}
onClick={() => selectCard(true)}
>
...
Это на самом деле не переносит контроль над addNewCard с формы на карту, но в конечном итоге заставляет пользовательский интерфейс следовать состоянию компонента карты.