Size: a a a

React — русскоговорящее сообщество

2020 July 14

OR

Oleg Rizhkov in React — русскоговорящее сообщество
Pidburachynskyi Rostyslav 🇺🇦
Привет, не могу сделать хук useIndex, который для каждого компонента будет возвращать уникальный ему индекс, при чем пока компонент не удалился должен быть один и тот же. Вот код:

let _index = 0;

const useIndex = () => {
 const index = useMemo(() => _index++, []);
 // const [index] = useState(_index++); - same problem
 console.log("INDEX", index);
 return index;
};

const useHook = () => {
 const index = useIndex();

 console.log("Now index is", index);

 useEffect(() => {
   return () => {
     console.log(`Remove ${index}`);
   };
 }, []);

 return { index };
};

export default function App() {
 const [isIndex, setIsIndex] = useState(true);
 return (
   <div className="App">
     {isIndex && <NonIndexComponent />}
     {!isIndex && <IndexComponent />}
     <button onClick={() => setIsIndex(!isIndex)}>
       Toggle indexes components
     </button>
   </div>
 );
}

const IndexComponent = () => {
 const { index } = useHook();
 return <h1>My index is {index}</h1>;
};

const NonIndexComponent = () => {
 return <h1>I'm without index</h1>;
};

Вот вывод консоли:

INDEX 0
Now index is 0
INDEX 1
Now index is 1
// вывод ниже после удаления компонента
Remove 1

Почему один компонент получает разные индексы?

Codesandbox - https://codesandbox.io/s/gallant-hooks-1drpy?file=/src/App.js
вообще очень хотелось бы узнать проблему, решающую этим хуком.
источник

P

Pidburachynskyi Rost... in React — русскоговорящее сообщество
Oleg Rizhkov
родитель рендерится, по идее.
Да, возможно, проверял на рутовом компоненте, там все ок.
источник

P

Pidburachynskyi Rost... in React — русскоговорящее сообщество
Иван
а почему он должен получать одинаковые индексы?
Вообще или исходя из моего кода?
источник

И

Иван in React — русскоговорящее сообщество
Pidburachynskyi Rostyslav 🇺🇦
Вообще или исходя из моего кода?
из твоего кода
источник

P

Pidburachynskyi Rost... in React — русскоговорящее сообщество
Oleg Rizhkov
вообще очень хотелось бы узнать проблему, решающую этим хуком.
Нужно держать данные и после удаление удалять данные. Это как useState, только вне компонента.
источник

OR

Oleg Rizhkov in React — русскоговорящее сообщество
Pidburachynskyi Rostyslav 🇺🇦
Нужно держать данные и после удаление удалять данные. Это как useState, только вне компонента.
отличное описание. у меня всё ещё ощущение, что ты пишешь бред. но я в чужие дела не лезу, если пишешь херь, значит есть зачем.
источник

P

Pidburachynskyi Rost... in React — русскоговорящее сообщество
Иван
из твоего кода
Ну, useMemo же одинажды выполниться, (кроме частных случаев) по идеи, и индекс всегда будет один. Но там и строка с useState есть, там точно должен быть один.
источник

И

Иван in React — русскоговорящее сообщество
Pidburachynskyi Rostyslav 🇺🇦
Ну, useMemo же одинажды выполниться, (кроме частных случаев) по идеи, и индекс всегда будет один. Но там и строка с useState есть, там точно должен быть один.
ну так на каждый маунт будет вызываться новый инстанс компонента, чтобы отрендериться ему нужно выполнить коллбэк в useMemo
источник

P

Pidburachynskyi Rost... in React — русскоговорящее сообщество
Иван
ну так на каждый маунт будет вызываться новый инстанс компонента, чтобы отрендериться ему нужно выполнить коллбэк в useMemo
Так маунт один же. Я не пересоздаю объект.
источник

DN

Dima N1ght in React — русскоговорящее сообщество
Народ, посоветуйте плиз книгу, где написано как работает js и его среда выполнения на низком уровне: работа со стеком и кучей, gc, асинхронность, типы данных, jit компиляторы итд. Типа Рихтера для c#. Спасибо заранее!
источник

И

Иван in React — русскоговорящее сообщество
Pidburachynskyi Rostyslav 🇺🇦
Ну, useMemo же одинажды выполниться, (кроме частных случаев) по идеи, и индекс всегда будет один. Но там и строка с useState есть, там точно должен быть один.
а если тебя смущает, что индекс перескакивает через единицу — удали StrictMode в index.js
источник

P

Pidburachynskyi Rost... in React — русскоговорящее сообщество
Иван
а если тебя смущает, что индекс перескакивает через единицу — удали StrictMode в index.js
Воу, спасибо. Но все же, можно ли подругому решить?
источник

OR

Oleg Rizhkov in React — русскоговорящее сообщество
Иван
а если тебя смущает, что индекс перескакивает через единицу — удали StrictMode в index.js
а если мы все попросим, реакт тима пофиксит стрикт мод? плакала половина чата.
источник

И

Иван in React — русскоговорящее сообщество
Oleg Rizhkov
а если мы все попросим, реакт тима пофиксит стрикт мод? плакала половина чата.
это намеренное поведение. если мы все у дурова попросим, то он пофиксит херню, из-за которой я могу сообщения в телеграм отправлять?
источник

OR

Oleg Rizhkov in React — русскоговорящее сообщество
Иван
это намеренное поведение. если мы все у дурова попросим, то он пофиксит херню, из-за которой я могу сообщения в телеграм отправлять?
в смысле "намеренное"? оно помогает отловить баги? как?
источник

И

Иван in React — русскоговорящее сообщество
Pidburachynskyi Rostyslav 🇺🇦
Воу, спасибо. Но все же, можно ли подругому решить?
источник

P

Pidburachynskyi Rost... in React — русскоговорящее сообщество
Dima N1ght
Народ, посоветуйте плиз книгу, где написано как работает js и его среда выполнения на низком уровне: работа со стеком и кучей, gc, асинхронность, типы данных, jit компиляторы итд. Типа Рихтера для c#. Спасибо заранее!
Не тот чат. https://t.me/js_ru
источник

И

Иван in React — русскоговорящее сообщество
Pidburachynskyi Rostyslav 🇺🇦
Воу, спасибо. Но все же, можно ли подругому решить?
я хз, что ты там хочешь пофиксить
источник

DN

Dima N1ght in React — русскоговорящее сообщество
Спасибо
источник

OR

Oleg Rizhkov in React — русскоговорящее сообщество
Pidburachynskyi Rostyslav 🇺🇦
Воу, спасибо. Но все же, можно ли подругому решить?
то, что ты пытаешься сделать очень напоминает глобал стор.
источник