Как мне это сделать прямо сейчас
У меня есть список предметов. Прямо сейчас, когда пользователь нажимает кнопку X, shouldShowItem
переключается. shouldShowItem
в конечном итоге лежит в редуксе и передается в Item
в качестве реквизита. это либо true
, либо false
. Когда он меняется, вызывается toggleDisplay и меняет состояние в моем хуке:
useEffect(() => {
toggleDisplay(!display); //this is just a useState hook call
}, [shouldShowItem]); //PS: I'm aware that I don't need this extra step here, but my actual code is a bit more complicated, so I just simplified it here.
Моя проблема в том, что у меня есть одно единственное свойство shouldShowItem
в избыточном, а не одно shouldShowItem
для каждого пункт. Я не хочу переводить это свойство в состояние приращения для каждого элемента.
Проблема:
Однако проблема с моей конструкцией заключается в том, что shouldShowItem
сохраняется, что означает, что если я переключу его в время X для элемента Y , а затем мой Item Z также будет повторно визуализирован в результате несвязанное событие, оно будет перерисовано с обновленным состоянием shouldShowItem
, хотя это изменение состояния было предназначено для Элемент X .
По сути, я сохраняю состояние shouldShowItem
в приставке в то время как Мне просто нужен тумблер, который я могу отправить один раз, который работает с текущим Предметом, а затем больше не читается / не нужен. Я хочу в основном отправить тумблер, - меня не волнует состояние каждого элемента в избыточном коде, мне просто важно, чтобы он переключался один раз.
Предложения?
Редактировать: Подробнее Код
Элемент:
const Item = ({shouldShowItem, itemText, updateCurrentItem})=>
{
const [display, toggleDisplay] = useState(false);
useEffect(() => {
if (isSelected) {
toggleDisplay(!display);
}
}, [shouldShowItem]);
return (
<div
onClick={() => {
toggleDisplay(!display);
updateCurrentItem(item._id);
}}
>
{display && <span>{itemText}</span>}
</div>
);
}
Отображение списка элементов:
allItems.map((item, i) => {
return (
<Item
key={i}
shouldShowItem={this.props.shouldShowItem}
itemText={item.text}
updateCurrentItem={this.props.updateCurrentItem}
);
});
Реквизиты здесь получены из избыточного числа, поэтому shouldShowItem
является логическим значением значение, которое лежит в приставке, и updateCurrentItem
является создателем действия. И в редуксе я просто переключаю shouldShowItem
true & false всякий раз, когда отправляется действие переключения. (Действие переключения, которое устанавливает и отменяет значение true / false для shouldShowItem
, находится в каком-то другом компоненте и работает нормально)