Skip to content

Commit 3df12a5

Browse files
committed
refactor: 重构css transition
1 parent afc5645 commit 3df12a5

File tree

5 files changed

+89
-78
lines changed

5 files changed

+89
-78
lines changed

src/packages/overlay/overlay.taro.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React, { FunctionComponent, useEffect, useState } from 'react'
2-
import { CSSTransition } from 'react-transition-group'
32
import classNames from 'classnames'
43
import { ITouchEvent, View } from '@tarojs/components'
4+
import CSSTransition from '@/utils/css-transition/CSSTransition'
55
import { ComponentDefaults } from '@/utils/typings'
66
import { useLockScrollTaro } from '@/hooks/taro/use-lock-scoll'
77
import { TaroOverlayProps } from '@/types'
Lines changed: 87 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
import addOneClass from 'dom-helpers/addClass'
22

33
import removeOneClass from 'dom-helpers/removeClass'
4-
import React from 'react'
4+
import React, { FunctionComponent } from 'react'
55

66
import Transition from './Transition'
77
import { forceReflow } from './utils/reflow'
88

9-
const addClass = (node, classes) =>
9+
const addClassCommon = (node: HTMLElement | null, classes: string) =>
1010
node && classes && classes.split(' ').forEach((c) => addOneClass(node, c))
11-
const removeClass = (node, classes) =>
11+
const removeClassCommon = (node: HTMLElement | null, classes: string) =>
1212
node && classes && classes.split(' ').forEach((c) => removeOneClass(node, c))
1313

14-
type classNamesShape =
14+
type ClassNamesShape =
1515
| string
1616
| {
1717
appear: string
@@ -26,95 +26,110 @@ type classNamesShape =
2626
}
2727

2828
interface CSSTransitionProps {
29-
classNames: classNamesShape
29+
classNames: ClassNamesShape
3030
onEnter: (node: HTMLElement, isAppearing: boolean) => void
3131
onEntering: (node: HTMLElement, isAppearing: boolean) => void
3232
onEntered: (node: HTMLElement, isAppearing: boolean) => void
3333
onExit: (node: HTMLElement) => void
3434
onExiting: (node: HTMLElement) => void
3535
onExited: (node: HTMLElement) => void
36+
nodeRef?: React.RefObject<HTMLElement>
37+
children: React.ReactNode
3638
}
3739

38-
class CSSTransition extends React.Component {
39-
static defaultProps = {
40-
classNames: '',
41-
}
40+
const defaultProps = {
41+
classNames: '',
42+
}
4243

43-
appliedClasses = {
44+
const CSSTransition: FunctionComponent<Partial<CSSTransitionProps>> = (
45+
props
46+
) => {
47+
const {
48+
classNames,
49+
onEnter: _onEnter,
50+
onEntering: _onEntering,
51+
onEntered: _onEntered,
52+
onExit: _onExit,
53+
onExiting: _onExiting,
54+
onExited: _onExited,
55+
nodeRef: _nodeRef,
56+
...childProps
57+
} = { ...defaultProps, ...props }
58+
59+
const appliedClasses = {
4460
appear: {},
4561
enter: {},
4662
exit: {},
4763
}
4864

49-
onEnter = (maybeNode, maybeAppearing) => {
50-
const [node, appearing] = this.resolveArguments(maybeNode, maybeAppearing)
51-
this.removeClasses(node, 'exit')
52-
this.addClass(node, appearing ? 'appear' : 'enter', 'base')
65+
const onEnter = (maybeNode: any, maybeAppearing: boolean) => {
66+
const [node, appearing] = resolveArguments(maybeNode, maybeAppearing)
67+
removeClasses(node, 'exit')
68+
addClass(node, appearing ? 'appear' : 'enter', 'base')
5369

54-
if (this.props.onEnter) {
55-
this.props.onEnter(maybeNode, maybeAppearing)
70+
if (_onEnter) {
71+
_onEnter(maybeNode, maybeAppearing)
5672
}
5773
}
5874

59-
onEntering = (maybeNode, maybeAppearing) => {
60-
const [node, appearing] = this.resolveArguments(maybeNode, maybeAppearing)
75+
const onEntering = (maybeNode: any, maybeAppearing: boolean) => {
76+
const [node, appearing] = resolveArguments(maybeNode, maybeAppearing)
6177
const type = appearing ? 'appear' : 'enter'
62-
this.addClass(node, type, 'active')
78+
addClass(node, type, 'active')
6379

64-
if (this.props.onEntering) {
65-
this.props.onEntering(maybeNode, maybeAppearing)
80+
if (_onEntering) {
81+
_onEntering(maybeNode, maybeAppearing)
6682
}
6783
}
6884

69-
onEntered = (maybeNode, maybeAppearing) => {
70-
const [node, appearing] = this.resolveArguments(maybeNode, maybeAppearing)
85+
const onEntered = (maybeNode: any, maybeAppearing: boolean) => {
86+
const [node, appearing] = resolveArguments(maybeNode, maybeAppearing)
7187
const type = appearing ? 'appear' : 'enter'
72-
this.removeClasses(node, type)
73-
this.addClass(node, type, 'done')
88+
removeClasses(node, type)
89+
addClass(node, type, 'done')
7490

75-
if (this.props.onEntered) {
76-
this.props.onEntered(maybeNode, maybeAppearing)
91+
if (_onEntered) {
92+
_onEntered(maybeNode, maybeAppearing)
7793
}
7894
}
7995

80-
onExit = (maybeNode) => {
81-
const [node] = this.resolveArguments(maybeNode)
82-
this.removeClasses(node, 'appear')
83-
this.removeClasses(node, 'enter')
84-
this.addClass(node, 'exit', 'base')
96+
const onExit = (maybeNode: any) => {
97+
const [node] = resolveArguments(maybeNode)
98+
removeClasses(node, 'appear')
99+
removeClasses(node, 'enter')
100+
addClass(node, 'exit', 'base')
85101

86-
if (this.props.onExit) {
87-
this.props.onExit(maybeNode)
102+
if (_onExit) {
103+
_onExit(maybeNode)
88104
}
89105
}
90106

91-
onExiting = (maybeNode) => {
92-
const [node] = this.resolveArguments(maybeNode)
93-
this.addClass(node, 'exit', 'active')
107+
const onExiting = (maybeNode: any) => {
108+
const [node] = resolveArguments(maybeNode)
109+
addClass(node, 'exit', 'active')
94110

95-
if (this.props.onExiting) {
96-
this.props.onExiting(maybeNode)
111+
if (_onExiting) {
112+
_onExiting(maybeNode)
97113
}
98114
}
99115

100-
onExited = (maybeNode) => {
101-
const [node] = this.resolveArguments(maybeNode)
102-
this.removeClasses(node, 'exit')
103-
this.addClass(node, 'exit', 'done')
116+
const onExited = (maybeNode: any) => {
117+
const [node] = resolveArguments(maybeNode)
118+
removeClasses(node, 'exit')
119+
addClass(node, 'exit', 'done')
104120

105-
if (this.props.onExited) {
106-
this.props.onExited(maybeNode)
121+
if (_onExited) {
122+
_onExited(maybeNode)
107123
}
108124
}
109125

110126
// when prop `nodeRef` is provided `node` is excluded
111-
resolveArguments = (maybeNode, maybeAppearing) =>
112-
this.props.nodeRef
113-
? [this.props.nodeRef.current, maybeNode] // here `maybeNode` is actually `appearing`
127+
const resolveArguments = (maybeNode: any, maybeAppearing: boolean) =>
128+
_nodeRef
129+
? [_nodeRef.current, maybeNode] // here `maybeNode` is actually `appearing`
114130
: [maybeNode, maybeAppearing] // `findDOMNode` was used
115131

116-
getClassNames = (type) => {
117-
const { classNames } = this.props
132+
const getClassNames = (type: string) => {
118133
const isStringClassNames = typeof classNames === 'string'
119134
const prefix = isStringClassNames && classNames ? `${classNames}-` : ''
120135

@@ -137,9 +152,9 @@ class CSSTransition extends React.Component {
137152
}
138153
}
139154

140-
addClass(node, type, phase) {
141-
let className = this.getClassNames(type)[`${phase}ClassName`]
142-
const { doneClassName } = this.getClassNames('enter')
155+
const addClass = (node: HTMLElement | null, type: string, phase: string) => {
156+
let className = getClassNames(type)[`${phase}ClassName`]
157+
const { doneClassName } = getClassNames('enter')
143158

144159
if (type === 'appear' && phase === 'done' && doneClassName) {
145160
className += ` ${doneClassName}`
@@ -152,46 +167,42 @@ class CSSTransition extends React.Component {
152167
}
153168

154169
if (className) {
155-
this.appliedClasses[type][phase] = className
156-
addClass(node, className)
170+
appliedClasses[type][phase] = className
171+
addClassCommon(node, className)
157172
}
158173
}
159174

160-
removeClasses(node, type) {
175+
const removeClasses = (node: HTMLElement | null, type: string) => {
161176
const {
162177
base: baseClassName,
163178
active: activeClassName,
164179
done: doneClassName,
165-
} = this.appliedClasses[type]
180+
} = appliedClasses[type]
166181

167-
this.appliedClasses[type] = {}
182+
appliedClasses[type] = {}
168183

169184
if (baseClassName) {
170-
removeClass(node, baseClassName)
185+
removeClassCommon(node, baseClassName)
171186
}
172187
if (activeClassName) {
173-
removeClass(node, activeClassName)
188+
removeClassCommon(node, activeClassName)
174189
}
175190
if (doneClassName) {
176-
removeClass(node, doneClassName)
191+
removeClassCommon(node, doneClassName)
177192
}
178193
}
179194

180-
render() {
181-
const { classNames: _, ...props } = this.props
182-
183-
return (
184-
<Transition
185-
{...props}
186-
onEnter={this.onEnter}
187-
onEntered={this.onEntered}
188-
onEntering={this.onEntering}
189-
onExit={this.onExit}
190-
onExiting={this.onExiting}
191-
onExited={this.onExited}
192-
/>
193-
)
194-
}
195+
return (
196+
<Transition
197+
{...childProps}
198+
onEnter={onEnter}
199+
onEntered={onEntered}
200+
onEntering={onEntering}
201+
onExit={onExit}
202+
onExiting={onExiting}
203+
onExited={onExited}
204+
/>
205+
)
195206
}
196207

197208
export default CSSTransition
File renamed without changes.

src/utils/css-transition/utils/reflow.js

Lines changed: 0 additions & 1 deletion
This file was deleted.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const forceReflow = (node: HTMLElement) => node.scrollTop

0 commit comments

Comments
 (0)