gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:15:45 25 4
gpt4 key购买 nike

我试图让我的头脑超过 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com