티스토리 뷰

책/리다기

리다기 정리4(아이콘, 최적화)

안양사람 2021. 1. 21. 01:20
728x90
SMALL

자동완성을 만들려면 jsconfig.json 파일생성을 해서 ctl+space를 눌르면 코드 생성.

{
  "compilerOptions": {
    "target": "es6"
  }
}

 

flex 알고싶으면 추천

flexboxfroggy.com/#ko

 

Flexbox Froggy

A game for learning CSS flexbox

flexboxfroggy.com

 

yarn add react-icons

react 아이콘

react-icons.github.io/react-icons/#/icons/md

 

React Icons

React Icons Include popular icons in your React projects easily with react-icons, which utilizes ES6 imports that allows you to include only the icons that your project is using. Installation (for standard modern project) npm install react-icons --save Usa

react-icons.github.io

프로덕션 모드

yarn build

yarn globval and serve

serve -s build

 

성능 최적화를 위해 바뀌지 않은 아이템들의 리랜더링 막기 (클래스는 shouldComponentUpdate)

export default React.memo(TodoListItem);

 

1. useState의 함수형 업데이트

함수 바뀌지 않게 하기.

usecallback에서

      setTodos(todos=>todos.concat(todo));},[]

 

2. useReducer 사용하기

function todoReducer(todos, action) {
  switch (action.type) {
    case 'INSERT':
      return todos.concat(action.todo);
    case 'REMOVE':
      return todos.filter((todo) => todo.id !== action.id);
    case 'TOGGLE':
      return todos.map((todo) =>
        todo.id === action.id ? { ...todo, checked: !todo.checked } : todo,
      );
    default:
      return todos;
  }
}

  const onRemove = useCallback((id) => {
    dispatch({ type: 'REMOVE', id });
    // setTodos((todos) => todos.filter((todo) => todo.id !== id));
  }, []);

두가지는 취향 차이

 

 

스크롤하기전에(화면에 보이지 않는 컴포넌트) 컴포넌트 렌더링 하지 않고 보여질 때 렌더링 하기

yarn add react-virtualized

 

1

import React, { useCallback } from 'react';
import TodoListItem from './TodoListItem';
import './TodoList.scss';
import { List } from 'react-virtualized';

const TodoList = ({ todos, onRemove, onToggle }) => {
  const rowRenderer = useCallback(
    ({ index, key, style }) => {
      const todo = todos[index];
      return (
        <TodoListItem
          todo={todo}
          key={key}
          onRemove={onRemove}
          onToggle={onToggle}
          style={style}
        />
      );
    },
    [onRemove, onToggle, todos],
  );
  return (
    <List
      className="TodoList"
      width={512}
      height={513}
      rowCount={todos.length}
      rowHeight={57}
      rowRenderer={rowRenderer}
      lilst={todos}
      style={{ outline: 'none' }}
    />
    // <div className="TodoList">
    //   {todos.map((todo) => (
    //     <TodoListItem
    //       todo={todo}
    //       key={todo.id}
    //       onRemove={onRemove}
    //       onToggle={onToggle}
    //     />
    //   ))}
    // </div>
  );
};

export default React.memo(TodoList);

2

import React from 'react';
import {
  MdCheckBoxOutlineBlank,
  MdCheckBox,
  MdRemoveCircleOutline,
} from 'react-icons/md';
import cn from 'classnames';
import './TodoListItem.scss';

const TodoListItem = ({ todo, onRemove, onToggle, style }) => {
  const { id, text, checked } = todo;
  return (
    <div className="TodoListItem-virtualized" style={style}>
      <div className="TodoListItem">
        <div
          className={cn('checkbox', { checked })}
          onClick={() => onToggle(id)}
        >
          {checked ? <MdCheckBox /> : <MdCheckBoxOutlineBlank />}
          <div className="text">{text}</div>
        </div>
        <div className="remove" onClick={() => onRemove(id)}>
          <MdRemoveCircleOutline />
        </div>
      </div>
    </div>
  );
};

export default React.memo(
  TodoListItem,
  (preProps, nextProps) => preProps.todo === nextProps.todo,
);
728x90
LIST

' > 리다기' 카테고리의 다른 글

리다기 정리6(뉴스뷰어 만들기)  (0) 2021.01.22
리다기 정리5(immer, SPA)  (0) 2021.01.22
리다기 정리3(css)  (0) 2021.01.20
리다기 정리2(hook)  (0) 2021.01.19
리다기 정리1  (0) 2021.01.18
댓글
공지사항