#react-spring
#react-spring
Вопрос:
Я исходил из фона React-pose и хотел бы попробовать React-spring. У меня есть действительно простой случай, который я хотел бы перенести для использования с React-spring.
У меня есть пример, написанный в Codesanbox с использованием React-pose,https://codesandbox.io/s/4wxzm60nk9
Я пытался преобразовать это сам, но в итоге я просто запутался. Особенно сейчас, когда пытаешься сделать это с помощью их API hooks. Вся помощь, которую я могу получить, очень ценится.
Спасибо.
Ответ №1:
Я только вчера создал анимированную кнопку, поэтому переработал ее, чтобы изменить ее размер.
import React, {useState} from "react";
import { Spring, animated as a } from 'react-spring/renderprops';
const SpringButton = () => {
const [pressed, setPressed] = useState(false);
return (
<Spring native from={{scale: 1}} to={{scale: pressed? 0.8 : 1}}>
{({scale}) => (
<a.button
style={{
backgroundColor: 'red',
height: '100px',
width: '100px',
color: 'rgb(255, 255, 255)',
transform: scale.interpolate(scale => `scale(${scale})`)
}}
onMouseDown={() => setPressed(true)}
onClick={() => setPressed(false)}
onMouseLeave={() => setPressed(false)}
>
Click me
</a.button>
)}
</Spring>
);
}
Это еще не интерфейс hook, но я думаю, это поможет вам понять, как это работает. В ней также используется более быстрый собственный рендеринг. Обработка события немного отличается от react-pose. И вы также можете настроить конфигурацию, если хотите, чтобы анимация была действительно упругой.
import {config} from 'react-spring/renderprops';
<Spring config={config.wobbly} ...>
Комментарии:
1. Вау! Большое спасибо, Питер! Позже попытаюсь сделать из нее хук. Я также заметил одну вещь: когда вы нажимаете и удерживаете анимированную кнопку в нужном положении и отводите мышь от кнопки, она остается «нажатой», между тем, если вы проделаете то же самое с кнопкой react-spring, она вернется к своей первоначальной форме. Как вы думаете, это связано с тем, как построены две библиотеки? Еще раз спасибо за ответ. Теперь я могу удалить react-pose из своего проекта, ха-ха
2. Именно так я решил обработку событий. Pose обрабатывает событие наведения курсора мыши за пределами кнопки. Я не хочу возиться с ней, поэтому я использовал событие mouseLeave для сброса в исходное состояние. С react-spring вся обработка событий зависит от вашей реализации.
3. Я понимаю. Ну, для моего варианта использования это не имеет значения, но было бы интересно посмотреть, как они с этим справляются. Еще раз спасибо
Ответ №2:
Вероятно, что-то вроде этого:https://codesandbox.io/s/pyvo8mn5x0
function App() {
const [clicked, set] = useState(false)
const { scale } = useSpring({ scale: clicked ? 0.8 : 1 })
return (
<div className="App">
<animated.button
onMouseDown={() => set(true)}
onMouseUp={() => set(false)}
style={{
backgroundColor: 'red',
height: '100px',
width: '100px',
color: '#FFF',
transform: scale.interpolate(s => `scale(${s})`)
}}
children="Click me"
/>
</div>
)
}
Вы также можете выполнить интерполяцию заранее, если хотите:
const props = useSpring({ transform: `scale(${clicked ? 0.8 : 1})` })
return <animated.button style={props} />
В отличие от pose, react-spring не включает в себя элементы жестов, для этого он использует интерфейс со сторонними библиотеками. Например: https://github.com/react-spring/react-with-gesture