카드를 드래그 앤 드롭할때, 내가 board 에 도착하는지 떠나는지에 따라서 area(카드 밑 배경색 부분) 의 색상을 변경해주기 위해
'snapshot' argument 를 사용!
isDraggingOver: boolean
draggingOverWith: ?DraggableId
draggingFromThisWith: ?DraggableId
isUsingPlaceholder: boolean
// 기존
{(magic) => (
<div
style={{ backgroundColor: "red" }}
// 변경
{(magic, info) => (
<Area
isDraggingOver={info.isDraggingOver}
isDraggingFromThis={Boolean(info.draggingFromThisWith)}
-- Board.tsx
interface IAreaProps {
isDraggingFromThis: boolean;
isDraggingOver: boolean;
}
const Area = styled.div<IAreaProps>`
background-color: ${props =>
props.isDraggingOver // board 위에 있을때
? "#b8c2c7"
: props.isDraggingFromThis // board 떠날때
? "#dfe6e9"
: "trnspernent"};
flex-grow: 1;
transition: background-color 0.3s ease-in-out;
border-radius: 5px;
padding: 10px;
`;
함수형 컴포넌트에서 DOM을 참조할 때 사용한다.
useRef는 .current 프로퍼티로 전달된 인자(initialValue)로 초기화된 변경 가능한 ref 객체를 반환합니다.
일반적으로 클래스형 컴포넌트에서는 ref를 사용해 DOM을 참조할 수 있지만, 함수형 컴포넌트에서는 ref를 사용할 수 없습니다. 이 때 useRef()를 사용하면 함수형 컴포넌트에서도 DOM을 참조할 수 있습니다.
쉽게 말하자면, 우리의 React 코드를 이용해 HTML 요소를 지정하고, 가져와서 변형할 수 있게 해준다.
function MyInput() {
const inputRef = useRef(null);
// 이후 inputRef.current를 사용하면
// 인풋 필드의 DOM 요소를 참조할 수 있다.
// 예를 들어 inputRef.current.focus()를 호출하면
// 인풋 필드에 포커스가 이동.
return <input ref={inputRef} />;
}
-- Board.tsx
const inputRef = useRef<HTMLInputElement>(null);
const onClick = () => {
inputRef.current?.focus();
};
.
.
.
return (
.
.
.
<input ref={inputRef} placeholder="grab me" />
<button onClick={onClick}>click me</button>
-- Board.tsx
<Droppable droppableId={boardId}>
{(
magic,
info // info == Snapshot
) => (
<Area
isDraggingOver={info.isDraggingOver}
isDraggingFromThis={Boolean(info.draggingFromThisWith)}
ref={magic.innerRef}
// react js 컴포넌트를 통해 html 요소를 가져올 수 있음
{...magic.droppableProps}
>