Skip to content

Commit

Permalink
Memoize 'TaskItem'.
Browse files Browse the repository at this point in the history
  • Loading branch information
elle-j committed Jun 8, 2023
1 parent 01ed826 commit 4761e78
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 11 deletions.
19 changes: 13 additions & 6 deletions example-wasm/src/components/TaskItem.tsx
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import { memo } from 'react';

import { Task } from '../models/Task';
import styles from '../styles/TaskItem.module.css';

type TaskItemProps = {
task: Task;
onToggleStatus: () => void;
onDelete: () => void;
onToggleStatus: (task: Task) => void;
onDelete: (task: Task) => void;
};

// TODO: Memoize
export function TaskItem({ task, onToggleStatus, onDelete }: TaskItemProps) {
export const TaskItem = memo(({ task, onToggleStatus, onDelete }: TaskItemProps) => {
return (
<div className={task.isComplete ? [styles.task, styles.completed].join(' ') : styles.task}>
<p className={styles.description}>
Expand All @@ -17,17 +18,23 @@ export function TaskItem({ task, onToggleStatus, onDelete }: TaskItemProps) {
<div className={styles.buttons}>
<button
className={[styles.button, styles.toggleBtn].join(' ')}
onClick={onToggleStatus}
onClick={() => onToggleStatus(task)}
>
</button>
<button
className={[styles.button, styles.deleteBtn].join(' ')}
onClick={onDelete}
onClick={() => onDelete(task)}
>
x
</button>
</div>
</div>
);
}, shouldNotRerender);

function shouldNotRerender({ task: prevTask }: Readonly<TaskItemProps>, { task: nextTask }: Readonly<TaskItemProps>) {
return prevTask._id.equals(nextTask._id)
&& prevTask.description === nextTask.description
&& prevTask.isComplete === nextTask.isComplete;
}
10 changes: 5 additions & 5 deletions example-wasm/src/components/TaskList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ import { TaskItem } from './TaskItem';
import styles from '../styles/TaskList.module.css';

type TaskListProps = {
tasks: Realm.Results<Task /*& Realm.Object*/>;
onToggleTaskStatus: (task: Task /*& Realm.Object*/) => void;
onDeleteTask: (task: Task /*& Realm.Object*/) => void;
tasks: Realm.Results<Task>;
onToggleTaskStatus: (task: Task) => void;
onDeleteTask: (task: Task) => void;
};

export function TaskList({ tasks, onToggleTaskStatus, onDeleteTask }: TaskListProps) {
Expand All @@ -17,8 +17,8 @@ export function TaskList({ tasks, onToggleTaskStatus, onDeleteTask }: TaskListPr
<TaskItem
key={task._id.toHexString()}
task={task}
onToggleStatus={() => onToggleTaskStatus(task)}
onDelete={() => onDeleteTask(task)}
onToggleStatus={onToggleTaskStatus}
onDelete={onDeleteTask}
/>
))}
</div>
Expand Down

0 comments on commit 4761e78

Please sign in to comment.