我已经开始使用 react-pose 并且有一个关于 React 中大多数动画设置的问题。
- 似乎您无法在第一次渲染时触发组件上的动画?
这就是我问上述问题的原因。下面是一个尝试使用无状态组件的 react-pose 示例。我希望当我像这样将它添加到我的 main.js 渲染中时。它会
- 首先挂载 FadeDiv 组件,并将 initialPose 设置为不透明度为 0
然后在设置为不透明度的渲染上设置pose="enter":1。但事实并非如此。现在,如果是这样的话,那就太好了。
import React from 'react'; import posed from 'react-pose'; const FadeDiv = posed.div({ enter: { opacity: 1 }, before: { opacity: 0 }, initialPose: 'before' }); export const Wrapper = () => ( <FadeDiv pose="enter"> <div>This is a fading div</div> </FadeDiv> );
如果我错了,请纠正我,但这是我相信正在发生的事情。当 React 安装无状态或任何组件时,它不知道 initialPose 直到它在这个阶段完全安装它为时已晚,它只是将组件的不透明度设置为pose="enter" 这就是为什么我没有看到从 0 开始的动画- 1 因为它安装了不透明度设置为“进入”,即不透明度 1。所以它只是出现而没有任何动画。
好的,如果上面的内容是正确的,那么我在下面添加了这个设置,这是添加状态的额外样板,但我想对于 React 是必要的。
import React, { Component } from 'react';
import posed from 'react-pose';
const FadeDiv = posed.div({
enter: { opacity: 1 },
before: { opacity: 0 },
initialPose: 'before'
});
class Wrapper extends Component {
constructor(props) {
super(props);
this.state = {
isEnter: false
};
}
componentDidMount() {
this.setState({
isEnter: true
});
}
render() {
return (
<FadeDiv pose={this.state.isEnter ? 'enter' : 'before'}>
<div>This is a fading div</div>
</FadeDiv>
);
}
}
export default Wrapper;
现在一切正常,但我必须强制第二次渲染在 isEnter 之间切换,这在第一次渲染(挂载组件)时为假,然后在组件挂载钩子时设置为真。
对不起,冗长的解释,但对我来说完全理解很重要。这种额外的样板是拥有简单 div 动画的唯一解决方案吗?首先使用 componentDidMount 的生命周期钩子包装组件,以使用状态触发第二次渲染。我认为她发生的事情让我和其他人可能理解的崩溃是:
- 初始渲染姿势={this.state.isEnter ? 'enter' : 'before'} 设置为 "before" 这意味着 FadeDiv 组件的不透明度为 0
- 然后第二个渲染被状态更改触发以设置pose="enter",它将不透明度设置为1并将组件从0 - 1设置为动画。
这是一个正确的假设吗?
考虑到这一点,每当您需要一个简单的动画时,人们就可以通过额外的样板来真正绕过 React 中的动画。是的,我知道您可以使用 css,但您仍然需要等待组件安装以将第一个样式设置为 opacity=0,然后重新渲染以设置 opacity=1。但这里的问题是关于 Popmotion 的 React-pose,我猜使用 DOM 元素动画时 React 本身及其缺陷。