Skip to content

Commit a0c374a

Browse files
Finish Video
1 parent f5dda2e commit a0c374a

File tree

15 files changed

+272
-4
lines changed

15 files changed

+272
-4
lines changed

package-lock.json

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
"@testing-library/jest-dom": "^5.14.1",
77
"@testing-library/react": "^11.2.7",
88
"@testing-library/user-event": "^12.8.3",
9+
"lodash": "^4.17.21",
910
"react": "^17.0.2",
1011
"react-dom": "^17.0.2",
1112
"react-scripts": "4.0.3",

src/11-useScript/ScriptComponent.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import useScript from "./useScript"
2+
3+
export default function ScriptComponent() {
4+
const { loading, error } = useScript(
5+
"https://code.jquery.com/jquery-3.6.0.min.js"
6+
)
7+
8+
if (loading) return <div>Loading</div>
9+
if (error) return <div>Error</div>
10+
return <div>{window.$(window).width()}</div>
11+
}

src/11-useScript/useScript.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import useAsync from "../9-useAsync/useAsync"
2+
3+
export default function useScript(url) {
4+
return useAsync(() => {
5+
const script = document.createElement("script")
6+
script.src = url
7+
script.async = true
8+
9+
return new Promise((resolve, reject) => {
10+
script.addEventListener("load", resolve)
11+
script.addEventListener("error", reject)
12+
document.body.appendChild(script)
13+
})
14+
}, [url])
15+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { useEffect, useState, useRef } from "react"
2+
import useDeepCompareEffect from "./useDeepCompareEffect"
3+
4+
export default function DeepCompareEffectComponent() {
5+
const [age, setAge] = useState(0)
6+
const [otherCount, setOtherCount] = useState(0)
7+
const useEffectCountRef = useRef()
8+
const useDeepCompareEffectCountRef = useRef()
9+
10+
const person = { age: age, name: "Kyle" }
11+
12+
useEffect(() => {
13+
useEffectCountRef.current.textContent =
14+
parseInt(useEffectCountRef.current.textContent) + 1
15+
}, [person])
16+
17+
useDeepCompareEffect(() => {
18+
useDeepCompareEffectCountRef.current.textContent =
19+
parseInt(useDeepCompareEffectCountRef.current.textContent) + 1
20+
}, [person])
21+
22+
return (
23+
<div>
24+
<div>
25+
useEffect: <span ref={useEffectCountRef}>0</span>
26+
</div>
27+
<div>
28+
useDeepCompareEffect: <span ref={useDeepCompareEffectCountRef}>0</span>
29+
</div>
30+
<div>Other Count: {otherCount}</div>
31+
<div>{JSON.stringify(person)}</div>
32+
<button onClick={() => setAge(currentAge => currentAge + 1)}>
33+
Increment Age
34+
</button>
35+
<button onClick={() => setOtherCount(count => count + 1)}>
36+
Increment Other Count
37+
</button>
38+
</div>
39+
)
40+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { useEffect, useRef } from "react"
2+
import isEqual from "lodash/fp/isEqual"
3+
4+
export default function useDeepCompareEffect(callback, dependencies) {
5+
const currentDependenciesRef = useRef()
6+
7+
if (!isEqual(currentDependenciesRef.current, dependencies)) {
8+
currentDependenciesRef.current = dependencies
9+
}
10+
11+
useEffect(callback, [currentDependenciesRef.current])
12+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { useState } from "react"
2+
import useEventListener from "./useEventListener"
3+
4+
export default function EventListenerComponent() {
5+
const [key, setKey] = useState("")
6+
useEventListener("keydown", e => {
7+
setKey(e.key)
8+
})
9+
10+
return <div>Last Key: {key}</div>
11+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { useEffect, useRef } from "react"
2+
3+
export default function useEventListener(
4+
eventType,
5+
callback,
6+
element = window
7+
) {
8+
const callbackRef = useRef(callback)
9+
10+
useEffect(() => {
11+
callbackRef.current = callback
12+
}, [callback])
13+
14+
useEffect(() => {
15+
const handler = e => callbackRef.current(e)
16+
element.addEventListener(eventType, handler)
17+
18+
return () => element.removeEventListener(eventType, handler)
19+
}, [eventType, element])
20+
}
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
import { useRef } from "react"
2+
import useOnScreen from "./useOnScreen"
3+
4+
export default function OnScreenComponentComponent() {
5+
const headerTwoRef = useRef()
6+
const visible = useOnScreen(headerTwoRef, "-100px")
7+
8+
return (
9+
<div>
10+
<h1>Header</h1>
11+
<div>
12+
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Unde incidunt,
13+
nam id itaque error dicta? Numquam earum iusto optio officia, molestias
14+
debitis illum facilis nemo asperiores eaque voluptates modi? Dicta
15+
mollitia fugit doloremque vitae, dolores sequi fuga quas vel incidunt
16+
animi architecto dignissimos amet in quam praesentium corrupti voluptate
17+
dolorem impedit numquam aut cupiditate nulla! Nisi dolore dicta, cumque
18+
illum tempora enim dolores eum quis itaque nostrum architecto vel cum
19+
officiis aperiam qui exercitationem voluptatibus. Veritatis unde
20+
doloribus dolorem architecto, eum reprehenderit possimus similique eius
21+
cum obcaecati totam placeat. Delectus nulla, quae temporibus omnis
22+
assumenda autem ad quibusdam facilis aspernatur inventore nobis. Vitae
23+
architecto, unde consequuntur velit consequatur dicta mollitia, fuga
24+
iure hic accusamus blanditiis. Dignissimos, tenetur amet adipisci
25+
nostrum perferendis ad rerum accusamus distinctio repellendus eius,
26+
quisquam repellat nesciunt, consequatur culpa neque? Inventore vitae
27+
laborum aperiam ullam dolorem officiis ipsum aliquid doloribus pariatur,
28+
commodi iure illum soluta delectus, architecto ratione maiores
29+
accusamus. Provident quia sequi dolorum asperiores necessitatibus
30+
consequatur perspiciatis at a, inventore, deserunt corporis recusandae
31+
earum vero voluptas saepe pariatur, libero illo. Numquam facilis magnam
32+
exercitationem ipsam libero quidem minima dolores perferendis eveniet
33+
impedit eos, nesciunt unde velit facere itaque eum quasi laboriosam
34+
veritatis aliquid tenetur. Blanditiis exercitationem laborum, optio
35+
nulla minima libero sed doloremque soluta, dignissimos tempora rerum id
36+
nostrum iusto eveniet illo corrupti dicta. Non fuga exercitationem sit
37+
dignissimos voluptatibus cumque nobis iste asperiores illum fugit
38+
</div>
39+
<h1 ref={headerTwoRef}>Header 2 {visible && "(Visible)"}</h1>
40+
<div>
41+
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Unde incidunt,
42+
nam id itaque error dicta? Numquam earum iusto optio officia, molestias
43+
debitis illum facilis nemo asperiores eaque voluptates modi? Dicta
44+
mollitia fugit doloremque vitae, dolores sequi fuga quas vel incidunt
45+
animi architecto dignissimos amet in quam praesentium corrupti voluptate
46+
dolorem impedit numquam aut cupiditate nulla! Nisi dolore dicta, cumque
47+
illum tempora enim dolores eum quis itaque nostrum architecto vel cum
48+
officiis aperiam qui exercitationem voluptatibus. Veritatis unde
49+
doloribus dolorem architecto, eum reprehenderit possimus similique eius
50+
cum obcaecati totam placeat. Delectus nulla, quae temporibus omnis
51+
assumenda autem ad quibusdam facilis aspernatur inventore nobis. Vitae
52+
architecto, unde consequuntur velit consequatur dicta mollitia, fuga
53+
iure hic accusamus blanditiis. Dignissimos, tenetur amet adipisci
54+
nostrum perferendis ad rerum accusamus distinctio repellendus eius,
55+
quisquam repellat nesciunt, consequatur culpa neque? Inventore vitae
56+
laborum aperiam ullam dolorem officiis ipsum aliquid doloribus pariatur,
57+
commodi iure illum soluta delectus, architecto ratione maiores
58+
accusamus. Provident quia sequi dolorum asperiores necessitatibus
59+
consequatur perspiciatis at a, inventore, deserunt corporis recusandae
60+
earum vero voluptas saepe pariatur, libero illo. Numquam facilis magnam
61+
exercitationem ipsam libero quidem minima dolores perferendis eveniet
62+
impedit eos, nesciunt unde velit facere itaque eum quasi laboriosam
63+
veritatis aliquid tenetur. Blanditiis exercitationem laborum, optio
64+
nulla minima libero sed doloremque soluta, dignissimos tempora rerum id
65+
nostrum iusto eveniet illo corrupti dicta. Non fuga exercitationem sit
66+
dignissimos voluptatibus cumque nobis iste asperiores illum fugit
67+
veritatis fugiat quia voluptates cupiditate vel rerum eligendi facere
68+
sint nostrum quam, maiores dolorem repellat voluptas! Magnam ullam quis
69+
quas aut consequuntur quo doloremque, earum sint soluta vero iste quasi
70+
voluptates labore rerum aspernatur illum esse maxime laudantium? Tempore
71+
perspiciatis perferendis ea dolorem et quasi eos illo beatae consectetur
72+
maxime, enim ducimus corrupti, accusantium quisquam rem dolorum itaque
73+
iste velit. Amet similique accusamus doloribus expedita modi a
74+
architecto accusantium labore unde non, dolore totam quaerat sit
75+
laboriosam quae ullam impedit, pariatur repudiandae quisquam debitis
76+
repellendus nihil. Cumque blanditiis ut recusandae illum! Maiores
77+
eveniet nulla exercitationem natus delectus est minus a architecto
78+
pariatur molestias quo nihil maxime quasi facere magnam neque dolorem
79+
ad, doloribus hic! Qui corporis perspiciatis dolores rem minima tenetur.
80+
Fugit ipsa consectetur ad reiciendis, quia iste, sapiente rerum
81+
exercitationem reprehenderit laborum eligendi cumque? Quia porro modi
82+
repudiandae nostrum accusamus! Corporis eum fugit nihil facilis placeat
83+
ab est obcaecati consequuntur qui atque tempore soluta aliquid saepe
84+
ducimus, at sed modi illo ipsa numquam ratione vero eos reprehenderit!
85+
Sapiente nesciunt consequatur labore iste quas possimus rem cumque,
86+
fugit laborum repellendus nisi adipisci officia temporibus quaerat!
87+
Beatae doloribus veritatis at, maiores suscipit debitis reiciendis cum
88+
impedit non aut modi iste? Placeat illo quisquam assumenda esse cum
89+
ipsum quasi perspiciatis voluptatem rerum itaque, similique quidem
90+
molestias exercitationem ullam eum amet tempore dolor aliquid unde
91+
deserunt dolore excepturi. Aut dolore rerum sequi nihil soluta eum
92+
expedita consequatur aliquid consequuntur saepe esse necessitatibus
93+
repudiandae, natus, officia enim odit rem nobis adipisci, voluptates
94+
autem dolor blanditiis ipsam animi a. Illo accusantium iure qui aperiam
95+
commodi, quidem, dolorem error eum animi, id nam? Corporis, non
96+
adipisci!
97+
</div>
98+
</div>
99+
)
100+
}

src/14-useOnScreen/useOnScreen.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { useEffect, useState } from "react"
2+
3+
export default function useOnScreen(ref, rootMargin = "0px") {
4+
const [isVisible, setIsVisible] = useState(false)
5+
6+
useEffect(() => {
7+
console.log(ref.current)
8+
if (ref.current == null) return
9+
const observer = new IntersectionObserver(
10+
([entry]) => setIsVisible(entry.isIntersecting),
11+
{ rootMargin }
12+
)
13+
observer.observe(ref.current)
14+
return () => {
15+
if (ref.current == null) return
16+
observer.unobserve(ref.current)
17+
}
18+
}, [ref.current, rootMargin])
19+
20+
return isVisible
21+
}

0 commit comments

Comments
 (0)