Loft State и обработчики для ближайшего общего предка. Counter
затем становится «тупым» компонентом.
Upting State Up
Counter.jsx
const Counter = ({ count, onIncrementClick, onDecrementClick }) => (
<div>
<h2>Count: {count}</h2>
<button type="button" onClick={onIncrementClick}>
+
</button>
<button type="button" onClick={onDecrementClick}>
-
</button>
</div>
);
UniversalCounter.jsx
const UniversalCounter = () => {
const [counters, setCounters] = useState([0, 0, 0]);
const incrementCount = (index, c) => () =>
setCounters(counts =>
counts.map((count, i) => (index === i ? count + c : count))
);
const incrementCountAll = c => () =>
setCounters(counts => counts.map((count, i) => count + c));
return (
<div>
<h2>All Counters</h2>
{counters.map((count, i) => (
<Counter
key={i}
count={count}
onIncrementClick={incrementCount(i, 1)}
onDecrementClick={incrementCount(i, -1)}
/>
))}
<button type="button" onClick={incrementCountAll(1)}>
Increase All
</button>
<button type="button" onClick={incrementCountAll(-1)}>
Decrease All
</button>
</div>
);
};
Если ( по какой-то не DRY причине вообще ) хотел визуализировать каждый счетчик индивидуально:
return (
<div>
<h2>All Counters</h2>
<Counter
count={counters[0]}
onIncrementClick={incrementCount(0, 1)}
onDecrementClick={incrementCount(0, -1)}
/>
<Counter
count={counters[1]}
onIncrementClick={incrementCount(1, 1)}
onDecrementClick={incrementCount(1, -1)}
/>
<Counter
count={counters[2]}
onIncrementClick={incrementCount(2, 1)}
onDecrementClick={incrementCount(2, -1)}
/>
<button type="button" onClick={incrementCountAll(1)}>
Increase All
</button>
<button type="button" onClick={incrementCountAll(-1)}>
Decrease All
</button>
</div>
);