Skip to content

Commit 53a872a

Browse files
committed
l-92 learning useLayoutEffect and useImperativeHandle
1 parent c4a2d23 commit 53a872a

2 files changed

Lines changed: 18 additions & 12 deletions

File tree

  • epic-react-kent-c-dodds/03-Advanced-React-Hooks/src/exercise

epic-react-kent-c-dodds/03-Advanced-React-Hooks/src/exercise/04.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import * as React from 'react'
66
function MessagesDisplay({messages}) {
77
const containerRef = React.useRef()
88
// 🐨 replace useEffect with useLayoutEffect
9-
React.useEffect(() => {
9+
React.useLayoutEffect(() => {
1010
containerRef.current.scrollTop = containerRef.current.scrollHeight
1111
})
1212

epic-react-kent-c-dodds/03-Advanced-React-Hooks/src/exercise/05.js

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,24 @@
44
import * as React from 'react'
55

66
// 🐨 wrap this in a React.forwardRef and accept `ref` as the second argument
7-
function MessagesDisplay({messages}) {
7+
const MessagesDisplay = React.forwardRef(({messages}, ref) => {
88
const containerRef = React.useRef()
99
React.useLayoutEffect(() => {
1010
scrollToBottom()
1111
})
1212

13+
React.useImperativeHandle(ref, () => ({
14+
scrollToBottom,
15+
scrollToTop,
16+
}))
17+
1318
// 💰 you're gonna want this as part of your imperative methods
14-
// function scrollToTop() {
15-
// containerRef.current.scrollTop = 0
16-
// }
19+
function scrollToTop() {
20+
containerRef.current.scrollTop = 0
21+
}
1722
function scrollToBottom() {
1823
containerRef.current.scrollTop = containerRef.current.scrollHeight
1924
}
20-
2125
// 🐨 call useImperativeHandle here with your ref and a callback function
2226
// that returns an object with scrollToTop and scrollToBottom
2327

@@ -31,20 +35,22 @@ function MessagesDisplay({messages}) {
3135
))}
3236
</div>
3337
)
34-
}
38+
})
3539

3640
function App() {
3741
const messageDisplayRef = React.useRef()
3842
const [messages, setMessages] = React.useState(allMessages.slice(0, 8))
39-
const addMessage = () =>
40-
messages.length < allMessages.length
43+
44+
const addMessage = () => {
45+
return messages.length < allMessages.length
4146
? setMessages(allMessages.slice(0, messages.length + 1))
4247
: null
43-
const removeMessage = () =>
44-
messages.length > 0
48+
}
49+
const removeMessage = () => {
50+
return messages.length > 0
4551
? setMessages(allMessages.slice(0, messages.length - 1))
4652
: null
47-
53+
}
4854
const scrollToTop = () => messageDisplayRef.current.scrollToTop()
4955
const scrollToBottom = () => messageDisplayRef.current.scrollToBottom()
5056

0 commit comments

Comments
 (0)