Skip to content

Commit dabd717

Browse files
authored
feat: Add prepare step (#6)
* Revert "revert: Back to sync (#5)" This reverts commit 609271b. * feat: init onXXXPrepare api * add step hook * frame steps * active is last step * adjust step hooks * basic steps * use step map * motion end events * basic repeat * fix ssr issue * rm async * update test case * fix test * inject prepare * more status class * default prevent trantiong * only promise should use async * fix motion test case * test coverage * fix ts
1 parent b34fdde commit dabd717

18 files changed

Lines changed: 858 additions & 380 deletions

.eslintrc.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ module.exports = {
1010
'react/no-find-dom-node': 0,
1111
'jsx-a11y/label-has-for': 0,
1212
'jsx-a11y/label-has-associated-control': 0,
13+
'default-case': 0,
1314
},
1415
};

examples/CSSMotion.less

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
}
1717

1818
.transition {
19-
transition: background .3s, height 1.3s, opacity 1.3s;
19+
transition: background 0.3s, height 1.3s, opacity 1.3s;
20+
// transition: all 5s!important;
2021

2122
&.transition-appear,
2223
&.transition-enter {
@@ -64,7 +65,7 @@
6465
}
6566

6667
.hidden {
67-
display: none;
68+
display: none !important;
6869
}
6970

7071
@keyframes enter {
@@ -87,4 +88,4 @@
8788
transform: scale(0);
8889
opacity: 0;
8990
}
90-
}
91+
}

examples/CSSMotion.tsx

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,13 @@ interface DemoState {
88
motionLeaveImmediately: boolean;
99
removeOnLeave: boolean;
1010
hasMotionClassName: boolean;
11+
prepare: boolean;
12+
}
13+
14+
async function forceDelay(): Promise<void> {
15+
return new Promise((resolve) => {
16+
setTimeout(resolve, 2000);
17+
});
1118
}
1219

1320
class Demo extends React.Component<{}, DemoState> {
@@ -16,12 +23,17 @@ class Demo extends React.Component<{}, DemoState> {
1623
motionLeaveImmediately: false,
1724
removeOnLeave: true,
1825
hasMotionClassName: true,
26+
prepare: false,
1927
};
2028

2129
onTrigger = () => {
2230
this.setState(({ show }) => ({ show: !show }));
2331
};
2432

33+
onTriggerDelay = () => {
34+
this.setState(({ prepare }) => ({ prepare: !prepare }));
35+
};
36+
2537
onRemoveOnLeave = () => {
2638
this.setState(({ removeOnLeave }) => ({ removeOnLeave: !removeOnLeave }));
2739
};
@@ -32,7 +44,9 @@ class Demo extends React.Component<{}, DemoState> {
3244
}));
3345
};
3446

35-
onCollapse = () => ({ height: 0 });
47+
onCollapse = () => {
48+
return { height: 0 };
49+
};
3650

3751
onMotionLeaveImmediately = () => {
3852
this.setState(({ motionLeaveImmediately }) => ({
@@ -59,6 +73,7 @@ class Demo extends React.Component<{}, DemoState> {
5973
motionLeaveImmediately,
6074
removeOnLeave,
6175
hasMotionClassName,
76+
prepare,
6277
} = this.state;
6378

6479
return (
@@ -87,6 +102,15 @@ class Demo extends React.Component<{}, DemoState> {
87102
{removeOnLeave ? '' : ' (use leavedClassName)'}
88103
</label>
89104

105+
<label>
106+
<input
107+
type="checkbox"
108+
onChange={this.onTriggerDelay}
109+
checked={prepare}
110+
/>{' '}
111+
prepare before motion
112+
</label>
113+
90114
<div className="grid">
91115
<div>
92116
<h2>With Transition Class</h2>
@@ -95,6 +119,8 @@ class Demo extends React.Component<{}, DemoState> {
95119
motionName={hasMotionClassName ? 'transition' : null}
96120
removeOnLeave={removeOnLeave}
97121
leavedClassName="hidden"
122+
onAppearPrepare={prepare && forceDelay}
123+
onEnterPrepare={prepare && forceDelay}
98124
onAppearStart={this.onCollapse}
99125
onEnterStart={this.onCollapse}
100126
onLeaveActive={this.onCollapse}

examples/SSR.tsx

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import React from 'react';
2+
import { hydrate } from 'react-dom';
3+
import ReactDOMServer from 'react-dom/server';
4+
import classNames from 'classnames';
5+
import { genCSSMotion } from '../src/CSSMotion';
6+
import CSSMotion from '../src';
7+
import './CSSMotion.less';
8+
9+
const ServerCSSMotion = genCSSMotion(false);
10+
11+
const onCollapse = () => ({ height: 0 });
12+
13+
interface MotionAppearProps {
14+
supportMotion: boolean;
15+
}
16+
17+
const MotionAppear = ({ supportMotion }: MotionAppearProps) => {
18+
const Component = supportMotion ? CSSMotion : ServerCSSMotion;
19+
20+
return (
21+
<Component
22+
motionName="transition"
23+
leavedClassName="hidden"
24+
motionAppear
25+
onAppearStart={onCollapse}
26+
>
27+
{({ style, className }, ref) => (
28+
<div
29+
ref={ref}
30+
className={classNames('demo-block', className)}
31+
style={style}
32+
/>
33+
)}
34+
</Component>
35+
);
36+
};
37+
38+
const Demo = () => {
39+
const ssr = ReactDOMServer.renderToString(
40+
<MotionAppear supportMotion={false} />,
41+
);
42+
43+
React.useEffect(() => {
44+
const div = document.createElement('div');
45+
document.body.appendChild(div);
46+
div.innerHTML = ssr;
47+
48+
hydrate(<MotionAppear supportMotion />, div);
49+
50+
return () => {
51+
document.body.removeChild(div);
52+
};
53+
}, []);
54+
55+
return (
56+
<div>
57+
<textarea value={ssr} style={{ width: '100%' }} rows={5} readOnly />
58+
</div>
59+
);
60+
};
61+
62+
export default Demo;

package.json

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,12 @@
4343
"dependencies": {
4444
"@babel/runtime": "^7.11.1",
4545
"classnames": "^2.2.1",
46-
"raf": "^3.4.1",
47-
"rc-util": "^5.0.6"
46+
"rc-util": "^5.2.1"
4847
},
4948
"devDependencies": {
5049
"@types/classnames": "^2.2.9",
5150
"@types/enzyme": "^3.10.5",
5251
"@types/jest": "^26.0.8",
53-
"@types/raf": "^3.4.0",
5452
"@types/react": "^16.9.2",
5553
"@types/react-dom": "^16.9.0",
5654
"@umijs/fabric": "^2.0.8",
@@ -60,10 +58,13 @@
6058
"enzyme-to-json": "^3.4.0",
6159
"eslint": "^7.0.0",
6260
"father": "^2.13.4",
61+
"jest": "^26.4.2",
6362
"less": "^3.10.3",
6463
"np": "^6.2.4",
64+
"prettier": "^2.1.1",
6565
"react": "^16.0.0",
66-
"react-dom": "^16.0.0"
66+
"react-dom": "^16.0.0",
67+
"regenerator-runtime": "^0.13.7"
6768
},
6869
"peerDependencies": {
6970
"react": "^16.0.0",

0 commit comments

Comments
 (0)