问题描述
当前,我正在开发React Weather应用,并且正在尝试从应用中间到应用顶部为输入字段设置动画。当Axios呼叫将被完全填充时,将触发此动画。在此输入字段中,您应该输入要了解其预报的城市名称。
找到城市后,此输入字段应移至应用程序的顶部,并且来自api响应的所有其他信息应从底部消失。但首先要注意。
我已经尝试了3个小时以上的所有内容,但无法完成。
声明动画
const [moveInput,setMoveInput] = useState(true)
const inputTransitions = useTransition(moveInput,null,{
from: { transform: 'translateY(-50%)' },enter: { transform: 'translateY(100)' },leave: { transform: 'translateY(-100%)' },})
我真的不知道我必须从中插入什么数字,然后输入并留下变量。我已经尝试了一切,甚至都没有动。
这是我的axios电话
axios.get(
`https://api.openweathermap.org/data/2.5/onecall?lat=${lat}&lon=${lon}&exclude=minutely&units=metric&appid=${apiKey}`
).then(response => {
//Push results to state
setForecast(prevstate => ({
...prevstate,week:response.data.daily,humidity: response.data.current.humidity+'%'
}))
setMoveInput(false);
})
我猜想使用setMoveInput函数可以触发该动画。
渲染中
{inputTransitions.map(({ item,key,props }) =>
item && <animated.div
key={key}
style={props}
>
<SearchForm
searchCity={searchCity}
/>
</animated.div>
)}
输入CSS
input{
left: 50%;
top: 50%;
position: absolute;
-webkit-transform: translate3d(-50%,-50%,0);
-moz-transform: translate3d(-50%,0);
transform: translate3d(-50%,0);
}
当我将SearchInput组件放入该动画div中时,这意味着该div应该是动画的。
请问有人可以告诉我这是如何工作的吗?我试图从官方文档中了解它,但是没有像这样的例子。
非常感谢您
解决方法
如果要移动相同的元素,则应使用useSpring而不是useTransition。如果将div转换为50%,那么它将以div高度的50%移动。因此它将稍微移动一点。我建议使用%的vh(视口高度)。
const props = useSpring({
transform: moveInput ? "translateY(50vh)" : "translateY(1vh)"
});
您还应该注意,您的CSS位于div内部。您可能需要将其添加到动画div中。
这是我的例子: https://codesandbox.io/s/animate-search-between-top-and-center-jj4eh