Ciao, я обнаружил вашу проблему: в функции select
вы уже установили selected
:
const select = blueprint => {
const index = blueprints.indexOf(blueprint);
if (index !== -1) {
setSelected(index); // here you set selected
}
};
При нажатии на значок IoMdClose
также запускается select
. В результате это useEffect
:
useEffect(() => {
console.log(`DEBUG ==> ${selected}`);
}, [selected]);
ничего не регистрирует.
Я пытался удалить setSelected(index);
из функции select
, и когда я нажимаю IoMdClose
icon, selected
будет установлено в -1 и будет использовать журналы эффектов DEBUG ==> -1
.
Но теперь у вас есть другая проблема: если вы удалите setSelected(index);
из select
и попытаетесь выбрать один чертеж из left treeview, чертеж не будет выбран. Поэтому я повторно добавил setSelected(index);
в функцию select
. Удалено setSelected(-1);
из функции remove
, и теперь useEffect ничего не регистрирует!
Я думаю, это происходит потому, что вы пытаетесь установить selected
на несуществующий индекс (потому что вы удалили blueprint при нажатии на значок). Чтобы проверить это, я изменил setSelected(index);
в функции select
на setSelected(0);
и теперь, если я удалю один чертеж, useEffect
будет срабатывать и записывать DEBUG ==> 0
.
Если идея, лежащая в основе setSelected(-1);
- это отменить выбор всех чертежей в древовидной структуре, вы можете сделать что-то вроде:
export const BlueprintsProvider = ({ children }) => {
....
const removeSelection = useRef(0);
useEffect(() => {
if (blueprints.length < removeSelection.current) setSelected(-1); // if I removed a blueprint, then fire setSelected(-1);
setCount(blueprints.length);
removeSelection.current = blueprints.length; //removeSelection.current setted as blueprints.length
}, [blueprints]);
И, конечно, удалить setSelected(-1);
из функции remove
.