Skip to content

Commit 3a7ddc3

Browse files
authored
fix: better sheet and dynamic rules management, leverage useInsertionEffect and support React 18 (#1604)
* split effects 5d38d68 * size snapshot * bump version * less deps * revert version bump * more unnecessary deps * have dynamic rules ready on mount (prevents flashing unstyled components) * incosistent return is ok here * useInsertionEffect, optimizations and smaller improvements
1 parent 359b559 commit 3a7ddc3

2 files changed

Lines changed: 53 additions & 54 deletions

File tree

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

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,30 @@
11
{
22
"react-jss.js": {
3-
"bundled": 136030,
4-
"minified": 50117,
5-
"gzipped": 16723
3+
"bundled": 77728,
4+
"minified": 28993,
5+
"gzipped": 10122
66
},
77
"react-jss.min.js": {
8-
"bundled": 102980,
9-
"minified": 39976,
10-
"gzipped": 13837
8+
"bundled": 45475,
9+
"minified": 19337,
10+
"gzipped": 7396
1111
},
1212
"react-jss.cjs.js": {
13-
"bundled": 21554,
14-
"minified": 9502,
15-
"gzipped": 3177
13+
"bundled": 21488,
14+
"minified": 9523,
15+
"gzipped": 3163
1616
},
1717
"react-jss.esm.js": {
18-
"bundled": 19636,
19-
"minified": 8002,
20-
"gzipped": 2959,
18+
"bundled": 19604,
19+
"minified": 8056,
20+
"gzipped": 2958,
2121
"treeshaked": {
2222
"rollup": {
2323
"code": 426,
2424
"import_statements": 368
2525
},
2626
"webpack": {
27-
"code": 1945
27+
"code": 1967
2828
}
2929
}
3030
}

packages/react-jss/src/createUseStyles.js

Lines changed: 40 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@ import getSheetIndex from './utils/getSheetIndex'
1313
import {manageSheet, unmanageSheet} from './utils/managers'
1414
import getSheetClasses from './utils/getSheetClasses'
1515

16-
const useEffectOrLayoutEffect = isInBrowser ? React.useLayoutEffect : React.useEffect
16+
const useInsertionEffect = isInBrowser
17+
? React.useInsertionEffect || // React 18+ (https://github.com/reactwg/react-18/discussions/110)
18+
React.useLayoutEffect
19+
: React.useEffect
1720

1821
const noTheme = {}
1922

@@ -36,57 +39,53 @@ const createUseStyles = (styles, options = {}) => {
3639
const context = React.useContext(JssContext)
3740
const theme = useTheme(data && data.theme)
3841

39-
const [sheet, dynamicRules] = React.useMemo(() => {
40-
const newSheet = createStyleSheet({
41-
context,
42-
styles,
43-
name,
44-
theme,
42+
const sheet = React.useMemo(
43+
() =>
44+
createStyleSheet({
45+
context,
46+
styles,
47+
name,
48+
theme,
49+
index,
50+
sheetOptions
51+
}),
52+
[context, theme]
53+
)
54+
55+
const dynamicRules = React.useMemo(() => (sheet ? addDynamicRules(sheet, data) : null), [sheet])
56+
57+
useInsertionEffect(() => {
58+
manageSheet({
4559
index,
46-
sheetOptions
60+
context,
61+
sheet,
62+
theme
4763
})
4864

49-
const newDynamicRules = newSheet ? addDynamicRules(newSheet, data) : null
50-
51-
if (newSheet) {
52-
manageSheet({
53-
index,
54-
context,
55-
sheet: newSheet,
56-
theme
57-
})
65+
return () => {
66+
if (sheet) {
67+
unmanageSheet({
68+
index,
69+
context,
70+
sheet,
71+
theme
72+
})
73+
74+
// when sheet changes, remove related dynamic rules
75+
if (dynamicRules) {
76+
removeDynamicRules(sheet, dynamicRules)
77+
}
78+
}
5879
}
80+
}, [sheet])
5981

60-
return [newSheet, newDynamicRules]
61-
}, [context, theme])
62-
63-
useEffectOrLayoutEffect(() => {
82+
useInsertionEffect(() => {
6483
// We only need to update the rules on a subsequent update and not in the first mount
6584
if (sheet && dynamicRules && !isFirstMount.current) {
6685
updateDynamicRules(data, sheet, dynamicRules)
6786
}
6887
}, [data])
6988

70-
useEffectOrLayoutEffect(
71-
() =>
72-
// cleanup only
73-
() => {
74-
if (sheet) {
75-
unmanageSheet({
76-
index,
77-
context,
78-
sheet,
79-
theme
80-
})
81-
}
82-
83-
if (sheet && dynamicRules) {
84-
removeDynamicRules(sheet, dynamicRules)
85-
}
86-
},
87-
[sheet]
88-
)
89-
9089
const classes = React.useMemo(
9190
() => (sheet && dynamicRules ? getSheetClasses(sheet, dynamicRules) : emptyObject),
9291
[sheet, dynamicRules]

0 commit comments

Comments
 (0)