Lifting state upintermediate
When two components must always agree, neither of them can own the value — it moves to the lowest component containing both, and comes back down as props.
A search box, a count and a list of results. Three components that must always agree — which means exactly one of them can own the state, and it is none of these three.
One piece of state, held above all three, and the count always matches the list.
Published in full, before you start — every point is one of these and there is nothing else. Each one runs your code; it is not a search for keywords.
When two components must always agree, neither of them can own the value — it moves to the lowest component containing both, and comes back down as props.
A component receives everything it needs as props and renders it — which is what lets the same card show a laptop on one page and a desk on another without being rewritten.
A list component owns the collection and a row component owns one item, and the empty case is a state to render rather than a blank space where a table should be.