Skip to content

Commit 1771bb9

Browse files
committed
fix start new animate in onComplete bug, group leave delete saveTweenTag to end
1 parent a5dab5b commit 1771bb9

File tree

3 files changed

+24
-14
lines changed

3 files changed

+24
-14
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "rc-tween-one",
3-
"version": "2.2.0",
3+
"version": "2.2.1",
44
"description": "tween-one anim component for react",
55
"keywords": [
66
"react",

src/TweenOne.jsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -260,13 +260,18 @@ class TweenOne extends Component {
260260
}
261261
this.props.onChange(cb);
262262
};
263-
this.tween.frame(tweenMoment);
264263
this.moment = moment;
265264
this.timelineRepeatNum = repeatNum;
265+
this.tween.frame(tweenMoment);
266266
}
267267

268268
raf = () => {
269+
const tween = this.tween;
269270
this.frame();
271+
if (tween !== this.tween) {
272+
// 在 onComplete 时更换动画时,raf 没结束,所以需要强制退出,避逸两个时间的冲突。
273+
return null;
274+
}
270275
const { repeat } = this.props;
271276
const totalTime = repeat === -1 ? Number.MAX_VALUE : this.tween.totalTime * (repeat + 1);
272277
if ((this.moment >= totalTime && !this.reverse)

src/TweenOneGroup.jsx

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class TweenOneGroup extends Component {
2525
// 第一进入,appear 为 true 时默认用 enter 或 tween-one 上的效果
2626
const children = toArrayChildren(getChildrenFromProps(this.props));
2727
this.originalChildren = toArrayChildren(getChildrenFromProps(this.props));
28+
this.currentChildren = toArrayChildren(getChildrenFromProps(this.props));
2829
this.state = {
2930
children,
3031
};
@@ -40,7 +41,9 @@ class TweenOneGroup extends Component {
4041
this.animQueue.push(nextChildren);
4142
return;
4243
}
43-
this.changeChildren(nextChildren);
44+
const currentChildren = toArrayChildren(nextProps.exclusive ?
45+
this.originalChildren : this.state.children);
46+
this.changeChildren(nextChildren, currentChildren);
4447
}
4548
componentDidUpdate() {
4649
this.originalChildren = toArrayChildren(getChildrenFromProps(this.props));
@@ -73,14 +76,17 @@ class TweenOneGroup extends Component {
7376
}
7477
} else if (type === 'leave') {
7578
this.keysToLeave.splice(this.keysToLeave.indexOf(key), 1);
76-
delete this.saveTweenTag[key];
77-
// 不需要刷新,需要控制 originalChildren.
78-
this.state.children = this.state.children.filter(child => key !== child.key);
79+
this.currentChildren = this.currentChildren.filter(child => key !== child.key);
7980
if (!this.keysToLeave.length) {
80-
this.forceUpdate(this.reAnimQueue);
81-
/* this.setState({
82-
children: toArrayChildren(getChildrenFromProps(this.props))
83-
}, this.reAnimQueue) */
81+
const currentChildrenKeys = this.currentChildren.map(item => item.key);
82+
Object.keys(this.saveTweenTag).forEach($key => {
83+
if (currentChildrenKeys.indexOf($key) === -1) {
84+
delete this.saveTweenTag[$key];
85+
}
86+
});
87+
this.setState({
88+
children: this.currentChildren,
89+
}, this.reAnimQueue);
8490
}
8591
}
8692
const _obj = { key, type };
@@ -158,14 +164,12 @@ class TweenOneGroup extends Component {
158164

159165
reAnimQueue = () => {
160166
if (!Object.keys(this.isTween).length && this.animQueue.length) {
161-
this.originalChildren = this.state.children;
162-
this.changeChildren(this.animQueue[this.animQueue.length - 1]);
167+
this.changeChildren(this.animQueue[this.animQueue.length - 1], this.state.children);
163168
this.animQueue = [];
164169
}
165170
}
166171

167-
changeChildren(nextChildren) {
168-
const currentChildren = toArrayChildren(this.originalChildren);
172+
changeChildren(nextChildren, currentChildren) {
169173
const newChildren = mergeChildren(currentChildren, nextChildren);
170174
this.keysToEnter = [];
171175
this.keysToLeave = [];
@@ -195,6 +199,7 @@ class TweenOneGroup extends Component {
195199
delete this.saveTweenTag[key];
196200
}
197201
});
202+
this.currentChildren = newChildren;
198203
this.setState({
199204
children: newChildren,
200205
});

0 commit comments

Comments
 (0)