У меня есть сценарий использования React, когда компонент получает пропущенную category
опору, а также имеет локальное значение состояния limit
.Мое желаемое поведение:
Когда выбирается category
, limit
сбрасывается на 10, если в настоящее время оно превышает 10.
Когда category
очищается, limit
сбрасывается до 50, если в настоящее время он ниже 50.
Пока category
не изменяется, пользователь может выбрать любойlimit
они хотят.
Я установил это поведение в ловушке эффектов, как показано ниже (более полный пример):
useEffect(() => {
if (category && limit > 10) {
setLimit(10);
} else if (!category && limit < 50) {
setLimit(50);
}
}, [category]);
Это работает нормально,но идет вразрез с правилом реакции-ловушки / исчерпывающего-deps linter , которое говорит, что я должен включить limit
в массив зависимостей.Я на самом деле не хочу этого, потому что я не хочу, чтобы инициированное пользователем изменение limit
могло что-либо инициировать, и я хочу, чтобы пользователь мог превышать верхний / нижний пороги, пока категория не меняется.
Есть ли "правильный" способ сделать это, который соблюдает правила хуков, но не вводит еще несколько хуков, чтобы манипулировать всеми возможными переходами реквизита / состояния?
Подробнееполный пример:
function App() {
const [category, setCategory] = useState(true);
return (
<div className="App">
<button onClick={() => setCategory(!category)}>Toggle category</button>
<List category={category} />
</div>
);
}
function List({ category }) {
const [limit, setLimit] = useState(10);
// Change the limit when category changes
// BUT only if limit is above/below a threshold!
useEffect(() => {
if (category && limit > 10) {
setLimit(10);
} else if (!category && limit < 50) {
setLimit(50);
}
}, [category]);
return (
<div>
<select value={limit} onChange={e => setLimit(e.target.value)}>
{[5, 10, 25, 50, 100].map(d => (
<option key={d}>{d}</option>
))}
</select>
<div>Category is {category ? "on" : "off"}</div>
<div>Would show {limit} items</div>
</div>
);
}