Я пытаюсь создать карусель компонентов в React, используя Framer Motion. Потомкам AnimatePresence
нужен ключ, поэтому я решил передать состояние страницы в качестве ключа. Однако при этом компонент, который я пытаюсь визуализировать, дублируется. Я думал, что это потому, что ключ в конечном итоге будет повторно использован, поэтому я создал функцию, которая генерирует случайную строку для использования в качестве ключа, но также дублирует компонент.
Компонент с использованием карусели
const ProjectList = props => {
const [page, setPage] = useState(0);
const projects = [
<Project
name="Example"
desc="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Libero nunc consequat interdum varius sit amet."
image={require("../img/exampleproject.png")}
/>,
<Project
name="Example2"
desc="Another example. This one does nothing too. What a suprise!"
image={require("../img/exampleproject.png")}
/>
]
const genKey = () => {
return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);
}
const paginate = (newPage) => {
setPage(newPage)
}
return (
<div className="project-list">
<AnimatePresence>
<motion.button key={genKey()} onClick={() => paginate(page-1)}>
<ArrowBackIosIcon/>
</motion.button>
<motion.div key={genKey()} className="project-list"
initial={{opacity: 0}}
animate={{opacity: 1}}
exit={{opacity: 0}}
>
{projects[page]}
</motion.div>
<motion.button key={genKey()} onClick={() => paginate(page+1)}>
<ArrowForwardIosIcon/>
</motion.button>
</AnimatePresence>
</div>
);
Я не уверен, как использовать библиотеки, такие как Framer Motion, в редакторе сниппетов, поэтому я поместил его в CodeSandbox
When I don't use a key, it works as expected, however whenever I click one of the arrow buttons it throws the following warnings
предупреждения
PS Я знаю, что в конечном итоге значение страницы будет go вне диапазона длины projects
, я планирую исправить это, как только смогу решить эту проблему.