Skip to content

Commit f8568ef

Browse files
react-14
1 parent 0c217ed commit f8568ef

File tree

5 files changed

+43
-17
lines changed

5 files changed

+43
-17
lines changed

src/App.js

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useCallback, useReducer, useState } from 'react';
1+
import { useCallback, useReducer, useState,useRef } from 'react';
22
import './App.css';
33
import AddVideo from './components/AddVideo';
44
import videoDB from './data/data';
@@ -12,7 +12,7 @@ function App() {
1212
console.log('render App');
1313
const [editableVideo, setEditableVideo] = useState(null);
1414
const [mode, setMode] = useState('darkMode');
15-
15+
const inputRef = useRef(null);
1616

1717

1818
function videoReducer(videos, action) {
@@ -33,7 +33,7 @@ function App() {
3333
return videos;
3434
}
3535
}
36-
const [videos, dispatch] = useReducer(videoReducer, []);
36+
const [videos, dispatch] = useReducer(videoReducer, videoDB);
3737

3838
const editVideo = useCallback(function editVideo(id) {
3939
setEditableVideo(videos.find((video) => video.id === id));
@@ -45,14 +45,16 @@ function App() {
4545
<VideosContext.Provider value={videos}>
4646
<VideoDispatchContext.Provider value={dispatch}>
4747
<div className={`App ${mode}`} onClick={() => console.log('App')}>
48+
<button onClick={()=>{inputRef.current.jumpTo()}}>Focus</button>
4849
<button
4950
onClick={() =>
5051
setMode(mode === 'darkMode' ? 'lightMode' : 'darkMode')
5152
}
5253
>
5354
Mode
5455
</button>
55-
<AddVideo
56+
<AddVideo
57+
ref={inputRef}
5658
editableVideo={editableVideo}
5759
></AddVideo>
5860
<VideoList

src/components/AddVideo.js

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import './AddVideo.css';
2-
import { useEffect, useRef, useState } from 'react';
2+
import { useEffect, forwardRef, useRef, useState, useImperativeHandle } from 'react';
33
import useVideoDispatch from '../hooks/VideoDispatch';
44

55
const initialState = {
@@ -10,10 +10,20 @@ const initialState = {
1010
views: '',
1111
};
1212

13-
function AddVideo({ editableVideo }) {
13+
const AddVideo = forwardRef(function AddVideo({ editableVideo },ref) {
1414
const [video, setVideo] = useState(initialState);
1515
const dispatch = useVideoDispatch();
16-
const inputRef = useRef(null);
16+
// const inputRef = useRef(null);
17+
const iRef = useRef(null);
18+
19+
useImperativeHandle(ref,()=>{
20+
return {
21+
jumpTo(){
22+
iRef.current.focus()
23+
}
24+
}
25+
26+
},[])
1727

1828
function handleSubmit(e) {
1929
e.preventDefault();
@@ -33,13 +43,13 @@ function AddVideo({ editableVideo }) {
3343
if (editableVideo) {
3444
setVideo(editableVideo);
3545
}
36-
inputRef.current.focus();
46+
// inputRef.current.focus();
3747
}, [editableVideo]);
3848

3949
return (
4050
<form>
4151
<input
42-
ref={inputRef}
52+
ref={iRef}
4353
type="text"
4454
name="title"
4555
onChange={handleChange}
@@ -58,6 +68,6 @@ function AddVideo({ editableVideo }) {
5868
</button>
5969
</form>
6070
);
61-
}
71+
})
6272

6373
export default AddVideo;

src/components/Video.js

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useContext, useEffect, memo } from 'react';
1+
import { useContext, useRef, memo,useLayoutEffect } from 'react';
22
import ThemeContext from '../context/ThemeContext';
33
import useVideoDispatch from '../hooks/VideoDispatch';
44
import './Video.css';
@@ -16,10 +16,16 @@ const Video = memo(function Video({
1616
console.log('render Video', id);
1717
const theme = useContext(ThemeContext);
1818
const dispatch = useVideoDispatch();
19+
const ref = useRef(null);
20+
21+
// useLayoutEffect(() => {
22+
// const { height } = ref.current.getBoundingClientRect();
23+
// console.log(height)
24+
// }, []);
1925

2026
return (
2127
<>
22-
<div className={`container ${theme}`}>
28+
<div ref={ref} className={`container ${theme}`}>
2329
<button
2430
className="close"
2531
onClick={() => dispatch({ type: 'DELETE', payload: id })}

src/components/VideoList.js

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,24 @@
11
import Video from './Video';
22
import PlayButton from './PlayButton';
33
import useVideos from '../hooks/Videos';
4-
import { useEffect, useCallback, useMemo } from 'react';
4+
import { useEffect, useCallback, useMemo, useDeferredValue, useState, useTransition } from 'react';
55
import useVideoDispatch from '../hooks/VideoDispatch';
6+
import moreVideos from '../data/moredata';
67

78
function VideoList({ editVideo }) {
89

9-
const videos = useVideos();
10+
// const videos = useVideos();
1011
const dispatch = useVideoDispatch();
12+
const [isPending, startTransition] = useTransition();
13+
// const defVideos = useDeferredValue(videos)
14+
const [videos, setVideos] = useState([]);
1115

1216
function getVideos() {
13-
dispatch({ type: 'LOAD', payload: [] });
17+
// dispatch({ type: 'LOAD', payload: moreVideos });
18+
startTransition(()=>{
19+
setVideos(moreVideos)
20+
})
21+
1422
}
1523

1624
useEffect(() => {
@@ -40,7 +48,8 @@ function VideoList({ editVideo }) {
4048
{memoButton}
4149
</Video>
4250
))}
43-
<button onClick={getVideos}>Get Videos</button>
51+
52+
<button onClick={getVideos}>{isPending ?'Getting...': 'Get Videos'}</button>
4453
</>
4554
);
4655
}

src/index.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import React from 'react';
22
import ReactDOM from 'react-dom/client';
33
import './index.css';
44
import App from './App';
5-
import ThemeContext from './context/ThemeContext';
65
const root = ReactDOM.createRoot(document.getElementById('root'));
76
root.render(
87
<React.StrictMode>

0 commit comments

Comments
 (0)