fetch + progress
요약
- ArrayBuffer 다운로드 방식을 커스텀
예) react + fetch + progress
gzip encoding 시 content length 값 문제
- gzip encoding 시 content-length 는 압축된 데이터 크기이기 때문에 실제 데이터 보다 크기가 작다
- 요청 헤더에 Accept-Encoding 을 명시하여 gzip 방지
- 주의: 서버 구현에 따름
Web 개발 관련 기록
fetch + progress
예) react + fetch + progress
참고: https://react.dev/reference/react/useImperativeHandle
state, callback prop 대신 직접적으로 component 에 명령을 내릴 때 사용
import { forwardRef, useRef, useImperativeHandle, useState } from 'react';
function App() {
const mycomponent = useRef<MyComponentElement>();
return (
<div className="App">
<MyComponent ref={ref => mycomponent.current = ref as MyComponentElement} />
<div style={{ display: 'flex', gap: 3 }}>
<button onClick={() => mycomponent.current?.play()}>Play</button>
<button onClick={() => mycomponent.current?.pause()}>Pause</button>
<button onClick={() => mycomponent.current?.stop()}>Stop</button>
<button onClick={() => alert(mycomponent.current?.getState())}>Get State</button>
</div>
</div>
);
}
type MyComponentElement = {
play: () => void;
pause: () => void;
stop: () => void;
getState: () => string;
};
type MyComponentProps = {
};
const MyComponent = forwardRef<MyComponentElement, MyComponentProps>((props, ref) => {
const [state, setState] = useState<string>('idle');
useImperativeHandle(ref, () => ({
play: () => {
setState('play');
},
pause: () => {
setState('pause');
},
stop: () => {
setState('stop');
},
getState: () => {
return state;
}
}));
return (
<div>
<p>state: {state}</p>
</div>
);
});
export default App;
설명