Создание простой анимации в React-Pose - PullRequest
0 голосов
/ 24 февраля 2019

У меня проблемы с созданием простой анимации в React-Pose.Две проблемы:

1) Я не могу заставить анимацию вернуться к исходному состоянию.Переменная зависания меняется на false, когда мышь уходит, но анимация не меняется обратно.

2) Я не могу манипулировать анимацией, я хотел иметь более длительную продолжительность и, возможно, облегчить выходили что-то в этом роде, но это всего лишь мгновенный переход в состояние зависания.

import React, { useState } from 'react';
import styled from 'styled-components';
import posed from 'react-pose';
import { render } from 'react-dom';

const UpFor = () => {

const [hovering, setHovering] = useState(false);

const HoverContainer = posed.div({
    hoverable: true
})

const Container = styled(HoverContainer)`
font-family: 'Baumans';
font-size: 220px;
display: flex;
cursor: pointer;
`

const Up = styled.div`
color: #81D6E3;`

const Four = styled.div`
color: #FF101F
`
const Fours = styled.div`
display: flex;
`
const MirroredFour = posed.div({
unhovered: {transform: 'rotatey(0deg)'},
hovered: {transform: 'rotateY(180deg)',
        transition: {
            type: 'tween',
            duration: '2s'
        }}
})

const SecondFour = styled(MirroredFour)`
color: #FF101F
position: absolute;
transform-origin: 67%;
`


return (
    <Container onMouseEnter={() => {setHovering({ hovering: true }), console.log(hovering)}}
               onMouseLeave={() => {setHovering({ hovering: false }), console.log(hovering)}}>
         <Up>Up</Up><Fours><Four>4</Four>
                <SecondFour pose={hovering ? "hovered" : "unhovered"}
                >4</SecondFour></Fours>
    </Container>)
}

export default UpFor

1 Ответ

0 голосов
/ 24 февраля 2019

Были две основные проблемы с вашим кодом:

  1. duration не поддерживает строковые значения, такие как '2s'.Я изменил это на 2000.
  2. Вы определяли свои компоненты (например, используя styled.div, posed.div) внутри вашей функции рендеринга.Это привело к тому, что React рассматривал эти компоненты как уникальные типы компонентов при каждом повторном рендеринге.Это приводит к тому, что эти компоненты отключаются и повторно монтируются при каждом рендеринге, что препятствует работе переходов, поскольку элемент не изменяется - вместо этого он заменяется новым компонентом другого типа.

Ниже приведена рабочая версия вашего кода, которая перемещает определения компонентов за пределы функции рендеринга (UpFor).Вы можете поиграть с ним в предоставленной песочнице.

import React, { useState } from "react";
import styled from "styled-components";
import posed from "react-pose";

const Container = styled.div`
  font-family: "Baumans";
  font-size: 220px;
  display: flex;
  cursor: pointer;
`;

const Up = styled.div`
  color: #81d6e3;
`;

const Four = styled.div`
  color: #ff101f;
`;
const Fours = styled.div`
  display: flex;
`;
const MirroredFour = posed.div({
  unhovered: { transform: "rotateY(0deg)" },
  hovered: {
    transform: "rotateY(180deg)",
    transition: {
      type: "tween",
      duration: 2000
    }
  }
});

const SecondFour = styled(MirroredFour)`
color: #FF101F
position: absolute;
transform-origin: 67%;
`;

const UpFor = () => {
  const [hovering, setHovering] = useState(false);

  console.log("hovering", hovering);
  return (
    <Container
      onMouseEnter={() => {
        setHovering(true);
      }}
      onMouseLeave={() => {
        setHovering(false);
      }}
    >
      <Up>Up</Up>
      <Fours>
        <Four>4</Four>
        <SecondFour pose={hovering ? "hovered" : "unhovered"}>4</SecondFour>
      </Fours>
    </Container>
  );
};

export default UpFor;

Edit Pose

...