Filter the orders table by customer

React · React · intermediate · greenfield

Adds the customer filter to the orders table. The visible rows are derived with `useMemo` keyed on the orders prop and the query, so parent re-renders don't re-run the 10k-row filter; the query is trimmed and lowercased once per recompute. Empty state included.

Requirements

Files touched

--- src/components/OrderList.jsx
+import { useMemo, useState } from 'react';
+
+function OrderList({ orders }) {
+  const [query, setQuery] = useState('');
+
+  const visible = useMemo(() => {
+    const needle = query.trim().toLowerCase();
+    if (needle === '') {
+      return orders;
+    }
+    return orders.filter((order) =>
+      order.customer.toLowerCase().includes(needle),
+    );
+  }, [orders, query]);
+
+  return (
+    <div className="order-list">
+      <input
+        type="search"
+        value={query}
+        onChange={(event) => setQuery(event.target.value)}
+        aria-label="Filter orders by customer"
+        placeholder="Filter by customer"
+      />
+      <ul>
+        {visible.map((order) => (
+          <li key={order.id}>
+            {order.customer} — {order.itemCount} items
+          </li>

Review this PR

React practice