UNPKG

6.5 kBJavaScriptView Raw
1import _extends from 'babel-runtime/helpers/extends';
2import _objectWithoutProperties from 'babel-runtime/helpers/objectWithoutProperties';
3import _typeof from 'babel-runtime/helpers/typeof';
4import _classCallCheck from 'babel-runtime/helpers/classCallCheck';
5import _possibleConstructorReturn from 'babel-runtime/helpers/possibleConstructorReturn';
6import _inherits from 'babel-runtime/helpers/inherits';
7
8var _class, _temp;
9
10import React, { Component, Children } from 'react';
11import PropTypes from 'prop-types';
12import { TransitionGroup } from 'react-transition-group';
13import AnimateChild from './child';
14
15var noop = function noop() {};
16var FirstChild = function FirstChild(props) {
17 var childrenArray = React.Children.toArray(props.children);
18 return childrenArray[0] || null;
19};
20
21/**
22 * Animate
23 */
24var Animate = (_temp = _class = function (_Component) {
25 _inherits(Animate, _Component);
26
27 function Animate() {
28 _classCallCheck(this, Animate);
29
30 return _possibleConstructorReturn(this, _Component.apply(this, arguments));
31 }
32
33 Animate.prototype.normalizeNames = function normalizeNames(names) {
34 if (typeof names === 'string') {
35 return {
36 appear: names + '-appear',
37 appearActive: names + '-appear-active',
38 enter: names + '-enter',
39 enterActive: names + '-enter-active',
40 leave: names + '-leave',
41 leaveActive: names + '-leave-active'
42 };
43 }
44 if ((typeof names === 'undefined' ? 'undefined' : _typeof(names)) === 'object') {
45 return {
46 appear: names.appear,
47 appearActive: names.appear + '-active',
48 enter: '' + names.enter,
49 enterActive: names.enter + '-active',
50 leave: '' + names.leave,
51 leaveActive: names.leave + '-active'
52 };
53 }
54 };
55
56 Animate.prototype.render = function render() {
57 var _this2 = this;
58
59 /* eslint-disable no-unused-vars */
60 var _props = this.props,
61 animation = _props.animation,
62 children = _props.children,
63 animationAppear = _props.animationAppear,
64 singleMode = _props.singleMode,
65 component = _props.component,
66 beforeAppear = _props.beforeAppear,
67 onAppear = _props.onAppear,
68 afterAppear = _props.afterAppear,
69 beforeEnter = _props.beforeEnter,
70 onEnter = _props.onEnter,
71 afterEnter = _props.afterEnter,
72 beforeLeave = _props.beforeLeave,
73 onLeave = _props.onLeave,
74 afterLeave = _props.afterLeave,
75 others = _objectWithoutProperties(_props, ['animation', 'children', 'animationAppear', 'singleMode', 'component', 'beforeAppear', 'onAppear', 'afterAppear', 'beforeEnter', 'onEnter', 'afterEnter', 'beforeLeave', 'onLeave', 'afterLeave']);
76 /* eslint-enable no-unused-vars */
77
78 var animateChildren = Children.map(children, function (child) {
79 return React.createElement(
80 AnimateChild,
81 {
82 key: child.key,
83 names: _this2.normalizeNames(animation),
84 onAppear: beforeAppear,
85 onAppearing: onAppear,
86 onAppeared: afterAppear,
87 onEnter: beforeEnter,
88 onEntering: onEnter,
89 onEntered: afterEnter,
90 onExit: beforeLeave,
91 onExiting: onLeave,
92 onExited: afterLeave
93 },
94 child
95 );
96 });
97
98 return React.createElement(
99 TransitionGroup,
100 _extends({
101 appear: animationAppear,
102 component: singleMode ? FirstChild : component
103 }, others),
104 animateChildren
105 );
106 };
107
108 return Animate;
109}(Component), _class.propTypes = {
110 /**
111 * 动画 className
112 */
113 animation: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),
114 /**
115 * 子元素第一次挂载时是否执行动画
116 */
117 animationAppear: PropTypes.bool,
118 /**
119 * 包裹子元素的标签
120 */
121 component: PropTypes.any,
122 /**
123 * 是否只有单个子元素,如果有多个子元素,请设置为 false
124 */
125 singleMode: PropTypes.bool,
126 /**
127 * 子元素
128 */
129 children: PropTypes.oneOfType([PropTypes.element, PropTypes.arrayOf(PropTypes.element)]),
130 /**
131 * 执行第一次挂载动画前触发的回调函数
132 * @param {HTMLElement} node 执行动画的 dom 元素
133 */
134 beforeAppear: PropTypes.func,
135 /**
136 * 执行第一次挂载动画,添加 xxx-appear-active 类名后触发的回调函数
137 * @param {HTMLElement} node 执行动画的 dom 元素
138 */
139 onAppear: PropTypes.func,
140 /**
141 * 执行完第一次挂载动画后触发的函数
142 * @param {HTMLElement} node 执行动画的 dom 元素
143 */
144 afterAppear: PropTypes.func,
145 /**
146 * 执行进场动画前触发的回调函数
147 * @param {HTMLElement} node 执行动画的 dom 元素
148 */
149 beforeEnter: PropTypes.func,
150 /**
151 * 执行进场动画,添加 xxx-enter-active 类名后触发的回调函数
152 * @param {HTMLElement} node 执行动画的 dom 元素
153 */
154 onEnter: PropTypes.func,
155 /**
156 * 执行完进场动画后触发的回调函数
157 * @param {HTMLElement} node 执行动画的 dom 元素
158 */
159 afterEnter: PropTypes.func,
160 /**
161 * 执行离场动画前触发的回调函数
162 * @param {HTMLElement} node 执行动画的 dom 元素
163 */
164 beforeLeave: PropTypes.func,
165 /**
166 * 执行离场动画,添加 xxx-leave-active 类名后触发的回调函数
167 * @param {HTMLElement} node 执行动画的 dom 元素
168 */
169 onLeave: PropTypes.func,
170 /**
171 * 执行完离场动画后触发的回调函数
172 * @param {HTMLElement} node 执行动画的 dom 元素
173 */
174 afterLeave: PropTypes.func
175}, _class.defaultProps = {
176 animationAppear: true,
177 component: 'div',
178 singleMode: true,
179 beforeAppear: noop,
180 onAppear: noop,
181 afterAppear: noop,
182 beforeEnter: noop,
183 onEnter: noop,
184 afterEnter: noop,
185 beforeLeave: noop,
186 onLeave: noop,
187 afterLeave: noop
188}, _temp);
189Animate.displayName = 'Animate';
190
191
192export default Animate;
\No newline at end of file