javascript - React Spring - 渲染之间的动画元素

标签 javascript css animation react-spring

我正在尝试理解 React Spring。所以我有一些盒子,我需要通过事件索引进行过滤,其想法是为盒子渲染设置动画,但我只有在组件第一次渲染时才会有动画。

这是我到目前为止所拥有的:

import React from "react";
import ReactDOM from "react-dom";
import styled from "@emotion/styled";
import { useTransition, animated } from "react-spring";

import "./styles.css";

const Header = styled.div`
  display: flex;
  justify-content: center;
  margin-bottom: 16px;
`;

const Content = styled.div`
  display: flex;
  justify-content: center;
`;

const Box = styled.div`
  width: 64px;
  height: 64px;
  background-color: yellow;
  border: 3px solid yellowgreen;
  color: yellowgreen;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 2rem;
`;

const EnhancedBox = animated(Box);

const App = () => {
  const [activeBoxIndex, setActiveBoxIndex] = React.useState(0);
  const boxes = [
    { label: "1", key: 0 },
    { label: "2", key: 1 },
    { label: "3", key: 2 }
  ];

  const transition = useTransition(boxes, 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 => () => {
    setActiveBoxIndex(n);
  };

  return (
    <div className="App">
      <Header>
        <button onClick={handleBoxClick(0)}>Show box 1</button>
        <button onClick={handleBoxClick(1)}>Show box 2</button>
        <button onClick={handleBoxClick(2)}>Show box 3</button>
      </Header>
      <Content>
        {transition.map(({ item, props, key }) => {          
          return item.key === activeBoxIndex ? (
            <EnhancedBox key={item.key} style={props}>
              {item.label}
            </EnhancedBox>
          ) : (
            <></>
          );
        })}
      </Content>
    </div>
  );
};

const rootElement = document.getElementById("root");
ReactDOM.render(<App />, rootElement);

我建立了一个代码沙盒元素来让事情变得更容易。任何帮助将非常感激。 https://codesandbox.io/s/wizardly-hill-6hkk9

最佳答案

可能有更好的方法来做到这一点,但这里有一个有效的简单方法:

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 钩子(Hook)的作用就像您传递给它的数组的当前状态的观察者。

为了实现您正在寻找的效果,我将高度从 0 动画化为自动,但这需要一种以 px 为单位获取高度的方法,并增加了进一步的复杂性。我喜欢设置元素高度,然后使用 maxHeight 控制其外观的想法。

希望有帮助。

关于javascript - React Spring - 渲染之间的动画元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61066170/

相关文章:

css - 在居中页面上在 IE 上 float 选择区域

java - 尝试将 css 样式表与 JavaFX 一起使用时出现 "loadStylesheetUnPrivileged"错误

jquery - 将 jQuery UI CSS 应用于 MVC .input-validation-error

javascript - 提高 javascript 动画的 FPS

javascript - 动画显示 :none to display:inline

javascript - React : set focus on componentDidMount, 如何用钩子(Hook)做?

javascript - 根据输入值显示一个 div 并隐藏其他 div

带有数组参数的 JavaScript onclick

javascript - 如何从字符串创建对象数组

ios - cabasicanimation 需要重置