Skip to content

Commit 9f7924e

Browse files
bs85kof
authored andcommitted
refactor createUseStyles (#1237)
1 parent 636bc90 commit 9f7924e

2 files changed

Lines changed: 51 additions & 94 deletions

File tree

packages/react-jss/.size-snapshot.json

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
11
{
22
"dist/react-jss.js": {
3-
"bundled": 169853,
4-
"minified": 58651,
5-
"gzipped": 19195
3+
"bundled": 168727,
4+
"minified": 58230,
5+
"gzipped": 19069
66
},
77
"dist/react-jss.min.js": {
8-
"bundled": 113177,
9-
"minified": 42042,
10-
"gzipped": 14261
8+
"bundled": 112051,
9+
"minified": 41621,
10+
"gzipped": 14141
1111
},
1212
"dist/react-jss.cjs.js": {
13-
"bundled": 27048,
14-
"minified": 11656,
15-
"gzipped": 3863
13+
"bundled": 25998,
14+
"minified": 11164,
15+
"gzipped": 3739
1616
},
1717
"dist/react-jss.esm.js": {
18-
"bundled": 26086,
19-
"minified": 10821,
20-
"gzipped": 3741,
18+
"bundled": 25036,
19+
"minified": 10329,
20+
"gzipped": 3619,
2121
"treeshaked": {
2222
"rollup": {
2323
"code": 1841,

packages/react-jss/src/createUseStyles.js

Lines changed: 39 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,6 @@ const useEffectOrLayoutEffect = isInBrowser ? React.useLayoutEffect : React.useE
2020

2121
const noTheme = {}
2222

23-
const reducer = (prevState, action) => {
24-
if (action.type === 'updateSheet') {
25-
return action.payload
26-
}
27-
return prevState
28-
}
29-
3023
const createUseStyles = <Theme: {}>(styles: Styles<Theme>, options?: HookOptions<Theme> = {}) => {
3124
const {index = getSheetIndex(), theming, name, ...sheetOptions} = options
3225
const ThemeContext = (theming && theming.context) || DefaultThemeContext
@@ -42,111 +35,75 @@ const createUseStyles = <Theme: {}>(styles: Styles<Theme>, options?: HookOptions
4235
const context = React.useContext(JssContext)
4336
const theme = useTheme()
4437

45-
const [state, dispatch] = React.useReducer(reducer, null, () => {
46-
const sheet = createStyleSheet({
47-
context,
48-
styles,
49-
name,
50-
theme,
51-
index,
52-
sheetOptions
53-
})
54-
55-
let dynamicRules
56-
let classes
57-
if (sheet) {
58-
if (context.registry) {
59-
context.registry.add(sheet)
60-
}
61-
dynamicRules = addDynamicRules(sheet, data)
62-
classes = getSheetClasses(sheet, dynamicRules)
63-
}
64-
65-
return {
66-
sheet,
67-
dynamicRules,
68-
classes: classes || {}
69-
}
70-
})
71-
72-
useEffectOrLayoutEffect(
38+
const [sheet, dynamicRules] = React.useMemo(
7339
() => {
74-
if (state.sheet) {
40+
const newSheet = createStyleSheet({
41+
context,
42+
styles,
43+
name,
44+
theme,
45+
index,
46+
sheetOptions
47+
})
48+
49+
const newDynamicRules = newSheet ? addDynamicRules(newSheet, data) : null
50+
51+
if (newSheet) {
7552
manageSheet({
7653
index,
7754
context,
78-
sheet: state.sheet,
55+
sheet: newSheet,
7956
theme
8057
})
8158
}
8259

83-
return () => {
84-
const {sheet, dynamicRules} = state
85-
86-
if (!sheet) return
87-
88-
unmanageSheet({
89-
index,
90-
context,
91-
sheet,
92-
theme
93-
})
94-
95-
if (dynamicRules) {
96-
removeDynamicRules(sheet, dynamicRules)
97-
}
98-
}
60+
return [newSheet, newDynamicRules]
9961
},
100-
[state.sheet]
62+
[context, theme]
10163
)
10264

10365
useEffectOrLayoutEffect(
10466
() => {
10567
// We only need to update the rules on a subsequent update and not in the first mount
106-
if (state.sheet && state.dynamicRules && !isFirstMount.current) {
107-
updateDynamicRules(data, state.sheet, state.dynamicRules)
68+
if (sheet && dynamicRules && !isFirstMount.current) {
69+
updateDynamicRules(data, sheet, dynamicRules)
10870
}
10971
},
11072
[data]
11173
)
11274

11375
useEffectOrLayoutEffect(
114-
() => {
115-
if (!isFirstMount.current) {
116-
const newSheet = createStyleSheet({
117-
context,
118-
styles,
119-
name,
120-
theme,
121-
index,
122-
sheetOptions
123-
})
124-
const newDynamicRules = newSheet && addDynamicRules(newSheet, data)
125-
const newClasses = newSheet ? getSheetClasses(newSheet, newDynamicRules) : {}
126-
127-
dispatch({
128-
type: 'updateSheet',
129-
payload: {
130-
sheet: newSheet,
131-
dynamicRules: newDynamicRules,
132-
classes: newClasses
133-
}
134-
})
135-
}
136-
},
137-
[theme, context]
76+
() =>
77+
// cleanup only
78+
() => {
79+
if (sheet) {
80+
unmanageSheet({
81+
index,
82+
context,
83+
sheet,
84+
theme
85+
})
86+
}
87+
88+
if (sheet && dynamicRules) {
89+
removeDynamicRules(sheet, dynamicRules)
90+
}
91+
},
92+
[sheet]
13893
)
13994

95+
const classes = sheet && dynamicRules ? getSheetClasses(sheet, dynamicRules) : {}
96+
14097
// $FlowFixMe
141-
React.useDebugValue(state.classes)
98+
React.useDebugValue(classes)
14299
// $FlowFixMe
143100
React.useDebugValue(theme === noTheme ? 'No theme' : theme)
144101

145102
React.useEffect(() => {
146103
isFirstMount.current = false
147104
})
148105

149-
return state.classes
106+
return classes
150107
}
151108
}
152109

0 commit comments

Comments
 (0)