인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

김사랑님의 프로필 이미지
김사랑

작성한 질문수

따라하며 배우는 리액트 A-Z[19버전 반영]

React.memo 를 이용한 렌더링 최적화

react.memo 를 했는데 안되요 오타도 아닌데 왜그럴까요?

작성

·

427

0

import React from 'react'

    const List = React.memo (({
        id, title, completed, todoData, setTodoData, provided, snapshot
    }) =>{

    console.log('List is Rendering');

    const handleClick =(id) => {
        let newTodoData = todoData.filter((data)=> data.id !== id)
        console.log ('newTodoData', newTodoData);
        //this.setState({todoData: newTodoData});
        setTodoData(newTodoData);
        };

    const handleCompleteChange = (id) => {
        let newTodoData = todoData.map(data => {
            if(data.id === id){
            data.completed = !data.completed;
            }
            return data;
        })
        //this.setState({ todoData : newTodoData})
        setTodoData(newTodoData);
    };

  return (
    <div key={id} {...provided.draggableProps} ref={provided.innerRef} {...provided.dragHandleProps}
    className={`${snapshot.isDragging ? "bg-gray-400" : "bg-gray-100"} flex items-center justify-between w-full px-4 py-1 my-2 text-gray-600 bg-gray-100 rounded`}>

        <div className='item-center'>
            <input 
            type="checkbox" 
            defaultChecked={completed}
            onChange={() => handleCompleteChange(id)}/>
            <span className={completed ? 'line-through' : undefined}>{title}</span>
        </div>
            <div className='item-center'>
                <button className="px-4 py-2 float-right" onClick={()=> handleClick(id)}>x</button>
            </div>

    </div>
  )
});

export default List





import React from 'react'
import { DragDropContext, Draggable, Droppable } from 'react-beautiful-dnd';
import List from './List';

const Lists = React.memo(({ todoData,setTodoData }) => {
  console.log('Lists Component');

  const handleEnd = (result) => {
    console.log('result', result);
    if(!result.destination) return;
    const newTodoData = todoData;

    //1. 변경시키는 아이템을 배열에서 지워줍니다.
    //2. return 값으로 지워진 아이템을 잡아줍니다.
    const [reorderedItem] = newTodoData.splice(result.source.index, 1);

    //3. 원하는자리에 reorderedItem을 insert 해줍니다.
    newTodoData.splice(result.destination.index, 0, reorderedItem);
    setTodoData(newTodoData);
    
  };
x
  return (
      <div>
      <DragDropContext onDragEnd={handleEnd}>
          <Droppable droppableId='todo'>
              {(provided) => (
                  <div {...provided.droppableProps} ref={provided.innerRef}>
                      {todoData.map((data, index) => (
                          <Draggable
                              key={data.id}
                              draggableId={data.id.toString()}
                              index={index}
                          >
                              {(provided, snapshot) => (
                                <List
                                  key={data.id}
                                  id={data.id}
                                  title={data.title}
                                  completed={data.completed}
                                  todoData={todoData}
                                  setTodoData={setTodoData}
                                  provided={provided}
                                  snapshot={snapshot}
                                />
                              )}
                          </Draggable>
                      ))}
                      {provided.placeholder}
                  </div>
              )}
          </Droppable>
      </DragDropContext>
  </div>
  );

});

export default Lists

답변 1

0

John Ahn님의 프로필 이미지
John Ahn
지식공유자

안녕하세요 사랑님

렌더링 최적화가 적용이 안된다는 건가요?!

새 글에 저장소 주소랑 같이 올려주시면 직접 해볼게요 ~

감사합니다.

김사랑님의 프로필 이미지
김사랑

작성한 질문수

질문하기