Визуальная ошибка при попытке сделать карусель с Framer Motion - PullRequest
0 голосов
/ 02 августа 2020

Я пытаюсь создать карусель с помощью Framer Motion in React, но получаю визуальную ошибку. Предыдущий компонент не размонтируется раньше, чем новый, и я получаю странный эффект. this Gyazo

Это компонент, обрабатывающий все:

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/office.jpg")}
    />,
    <Project 
      name="Example2"
      desc="Another example. This one does nothing too. What a suprise!"
      image={require("../img/office.jpg")}
    />
  ]

  const paginate = (newPage) => {
    if(newPage < 0) {
      setPage(projects.length - 1)  
    } else if (newPage > projects.length - 1) {
      setPage(0);
    } else {
      setPage(newPage);
    }
  }

  return (
    
    <div className="project-list">
      <AnimatePresence>
        <motion.button 
          key="previous"
          onClick={() => paginate(page-1)}
          className="carousel-btn"
          whileHover={{scale: 1.5, transition: {duration: 0.5}}}
        >
          <ArrowBackIosIcon/>
        </motion.button>
        <motion.div
          key={page}
          initial={{opacity: 0}}
          animate={{opacity: 1}}
          exit={{opacity: 0}}
        >
          {projects[page]}
        </motion.div>

        <motion.button 
          key="next" 
          onClick={() => paginate(page+1)}
          className="carousel-btn" 
          whileHover={{scale: 1.5, transition: {duration: 0.5}}}>
          <ArrowForwardIosIcon/>
        </motion.button>
      </AnimatePresence>
    </div>
  );

};

Я не уверен, как использовать библиотеки, такие как framer-motion, в инструменте сниппета, поэтому вот урезанная версия на CodeSandbox

Редактировать бесценный-sammet-9w1t3

1 Ответ

1 голос
/ 04 августа 2020

Если вы хотите, чтобы один компонент завершил sh свою анимацию (exit) перед запуском анимации mount следующего компонента, вам нужно будет включить AnimatePresence's exitBeforeEnter.

https://www.framer.com/api/motion/animate-presence/#animatepresenceprops .exitbeforeenter

Не знаю об этой визуальной ошибке, потому что она не видна в примере CodeSandbox. Но это может быть связано с тем, что компонент (на мгновение) удаляется из DOM, что приводит к изменению порядка вещей. Решением может быть только размещение motion.div с изображением внутри AnimatePresence, как я сделал здесь:

https://codesandbox.io/s/carousel-with-framer-motion-stackoverflow-lmrik?file= / src / components / ProjectList. js

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...