@@ -4,6 +4,7 @@ title: useLockBodyScroll
44date : " 2019-01-15"
55gist : https://gist.github.com/gragland/f50690d2724aec1bd513de8596dcd9b9
66sandbox : https://codesandbox.io/s/yvkol51m81
7+ isMultilingual : true
78links :
89 - url : https://jeremenichelli.io/2019/01/how-hooks-might-shape-design-systems-built-in-react/
910 name : How hooks might shape design systems built in React
@@ -61,3 +62,62 @@ function useLockBodyScroll() {
6162 }, []); // Empty array ensures effect is only run on mount and unmount
6263}
6364```
65+
66+ ``` typescript
67+ import { useState , useLayoutEffect } from " react" ;
68+
69+ // Usage
70+ function App() {
71+ // State for our modal
72+ const [modalOpen, setModalOpen] = useState <boolean >(false );
73+
74+ return (
75+ <div >
76+ < button onClick = {() => setModalOpen(true )}> Show Modal < / button >
77+ < Content / >
78+ {modalOpen && (
79+ <Modal
80+ title = " Try scrolling"
81+ content = " I bet you you can't! Muahahaha 😈"
82+ onClose = {() => setModalOpen(false )}
83+ />
84+ )}
85+ < / div >
86+ );
87+ }
88+
89+
90+ // Define modal props type
91+ type ModalProps = {
92+ title: string ;
93+ content: string ;
94+ onClose: () => void ;
95+ }
96+
97+ function Modal({ title , content , onClose } : ModalProps ) {
98+ // Call hook to lock body scroll
99+ useLockBodyScroll ();
100+
101+ return (
102+ < div className = " modal-overlay" onClick = {onClose }>
103+ < div className = " modal" >
104+ <h2 >{title }< / h2 >
105+ <p >{content }< / p >
106+ < / div >
107+ < / div >
108+ );
109+ }
110+
111+ // Hook
112+ function useLockBodyScroll(): void {
113+ // useLaoutEffect callback return type is "() => void" type
114+ useLayoutEffect (() : () => void => {
115+ // Get original body overflow
116+ const originalStyle: string = window .getComputedStyle (document .body ).overflow ;
117+ // Prevent scrolling on mount
118+ document .body .style .overflow = " hidden" ;
119+ // Re-enable scrolling when component unmounts
120+ return () => (document .body .style .overflow = originalStyle );
121+ }, []); // Empty array ensures effect is only run on mount and unmount
122+ }
123+ ```
0 commit comments