index.jsx 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import React from 'react';
  2. import { Transition } from '@douyinfe/semi-animation-react';
  3. function QueueTransition({ children, state, position = 'right', ...rest }) {
  4. const propMap = {
  5. left: {
  6. type: 'translateX',
  7. ratio: -1,
  8. },
  9. right: {
  10. type: 'translateX',
  11. ratio: 1,
  12. },
  13. top: {
  14. type: 'translateY',
  15. ratio: -1,
  16. },
  17. bottom: {
  18. type: 'translateY',
  19. ratio: 1,
  20. },
  21. };
  22. let translateObj = propMap[position];
  23. if (!translateObj) {
  24. translateObj = propMap.right;
  25. }
  26. const translateType = translateObj.type;
  27. const translateRatio = translateObj.ratio;
  28. return React.Children.map(children, (child, idx) => (
  29. <Transition
  30. from={{ opacity: 0, [translateType]: translateRatio * 200 }}
  31. enter={{
  32. opacity: { val: 1, duration: 300, easing: 'linear' },
  33. [translateType]: { val: 0, easing: 'cubic-bezier(0, .68, .3, 1)', duration: 300 },
  34. }}
  35. leave={{
  36. opacity: { val: 0, duration: 200, easing: 'linear' },
  37. [translateType]: {
  38. val: translateRatio * 200,
  39. easing: 'cubic-bezier(0.5, 0, 1, 0.4)',
  40. duration: 200,
  41. },
  42. }}
  43. config={{ delay: idx * 100 }}
  44. state={state}
  45. >
  46. {(props = {}) => React.cloneElement(child, {
  47. ...child.props,
  48. style: {
  49. ...child.props.style,
  50. opacity: props.opacity,
  51. transform: `${[translateType]}(${props[translateType]}%)`,
  52. },
  53. })}
  54. </Transition>
  55. ));
  56. }
  57. export default QueueTransition;