[React/TypeScript] Hooks에서 특정 요소가 보이는 위치로 스크롤
15473 단어 ReactTypeScript후크
환경
하고 싶었던 일
다음과 같은 메시지 화면으로 천이했을 때, 최신의 메시지의 위치까지 스크롤한 상태로 표시하고 싶었다.
사전 준비
ChatList
에는 하위 구성 요소 ChatMessage
의 배열이 있습니다.ChatList.tsx
import React from 'react';
import { ChatRoom } from '../../interfaces/chats';
import ChatMessage from './ChatMessage';
interface Props {
room: ChatRoom;
}
const ChatList: React.FC<Props> = ({ room }) => {
return (
<div>
<div>
{room.chats.map(chat => (
<ChatMessage key={chat.id} chat={chat} />
))}
</div>
</div>
);
};
export default ChatList;
ChatMessage.tsx
import React from 'react';
import { Chat } from '../../interfaces/chats';
interface Props {
chat: Chat;
}
const ChatMessage: React.FC<Props> = ({ chat }) => {
return (
<div>
{!chat.fromMe && (
<div>
<img src={chat.photo} alt="User" />
</div>
)}
<div>{chat.body}</div>
</div>
);
};
export default ChatMessage;
하위 구성 요소에서 상위 구성 요소로 ref 전달
setRef
추가 useRef
를 사용하여 요소에 대한 참조 얻기useEffect
를 사용하여 ref
가 업데이트 된 시점에서 setRef
를 통해 상위 구성 요소에 ref
전달 ChatMessage.tsx
import React, { useEffect, useRef } from 'react';
import { Chat } from '../../interfaces/chats';
interface Props {
chat: Chat;
setRef: (chat: Chat, ref: React.RefObject<HTMLDivElement>) => void;
}
const ChatMessage: React.FC<Props> = ({ chat, setRef }) => {
const ref = useRef<HTMLDivElement>(null);
useEffect(() => {
setRef(chat, ref);
}, [setRef, chat, ref]);
return (
<div ref={ref}>
{!chat.fromMe && (
<div>
<img src={chat.photo} alt="User" />
</div>
)}
<div>{chat.body}</div>
</div>
);
};
export default ChatMessage;
상위 구성 요소에서 마지막 요소의 위치로 스크롤
setLastMessageElement
정의scrollIntoView
를 사용하여 요소가 보이는 위치로 스크롤합니다 setLastMessageElement
를 하위 구성 요소에 props로 전달 ChatList.tsx
import React from 'react';
import { ChatRoom } from '../../interfaces/chats';
import ChatMessage from './ChatMessage';
interface Props {
room: ChatRoom;
}
const ChatList: React.FC<Props> = ({ room }) => {
const setLastMessageElement = (chat: Chat, ref: React.RefObject<HTMLDivElement>) => {
const lastChat = room.chats[room.chats.length - 1];
if (chat.id === lastChat.id) {
ref && ref.current && ref.current.scrollIntoView();
}
};
return (
<div>
<div>
{room.chats.map(chat => (
<ChatMessage key={chat.id} chat={chat} setRef={setLastMessageElement} />
))}
</div>
</div>
);
};
export default ChatList;
요약
Reference
이 문제에 관하여([React/TypeScript] Hooks에서 특정 요소가 보이는 위치로 스크롤), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/takano-h/items/7f2af3ea2542233ca5cd텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)