Возможно, есть лучшие способы сделать это, но вот простой подход, который работает:
const boxes = [
{ label: "1", key: 0 },
{ label: "2", key: 1 },
{ label: "3", key: 2 }
];
//start with item 0 in the display boxes array
const displayBoxes = [];
displayBoxes.push(boxes[0]);
const transition = useTransition(displayBoxes, item => item.key, {
from: { maxHeight: "0px", overflow: "hidden", margin: "0px 0px" },
enter: { maxHeight: "100px", overflow: "hidden", margin: "5px 0px" },
leave: { maxHeight: "0px", overflow: "hidden", margin: "0px 0px" }
});
const handleBoxClick = n => () => {
//empty the array
displayBoxes = [];
//then push in the new item
displayBoxes.push(boxes[n]);
};
Одна особенность useTransition, которая не сразу очевидна для новичка, состоит в том, что ловушка useTransition действует как наблюдатель текущее состояние массива, который вы передаете ему.
Чтобы добиться нужного эффекта, я анимировал высоту от 0 до авто, но для этого требуется способ получить высоту в пикселях и добавить еще один слой осложнений. Мне нравится идея установить высоту элемента, а затем использовать maxHeight для управления его внешним видом.
Надеюсь, это поможет.