Size: a a a

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

2020 November 21

PI

Prophet Indream in React — русскоговорящее сообщество
это же useState - он один аргумент ждет - смысл в том, что оно один раз срабатывает и все
источник

PI

Prophet Indream in React — русскоговорящее сообщество
если без интервала запускать подряд 5 раз - срабюотает
источник

PI

Prophet Indream in React — русскоговорящее сообщество
не могу понять почему внутри сет интервала показывает один раз изменение потом одинаковый результат
источник

S

Stanislav in React — русскоговорящее сообщество
Prophet Indream
подскажите плиз - по хукам
есть код вот такой

const startGame = () => {

   let gridClone: number[][] = JSON.parse(JSON.stringify(grid));

...
setGrid(gridClone)
может весь код покажете?
источник

PI

Prophet Indream in React — русскоговорящее сообщество
const [isRunning, setRunning] = useState(false);
источник

PI

Prophet Indream in React — русскоговорящее сообщество
const gameRunning = useRef<any>(null);

 const startGame = () => {

   let gridClone: number[][] = JSON.parse(JSON.stringify(grid));

   for (let i = 0; i < rowsNum; i++) {
     for (let j = 0; j < columnsNum; j++) {
       let neighbors = 0;
       acts.forEach(([x, y]) => {
         const newI = i + x;
         const newJ = j + y;
         if (newI >= 0 && newI < rowsNum && newJ >= 0 && newJ < columnsNum) {
           neighbors += grid[newI][newJ];
         }
       });
       if (neighbors < 2 || neighbors > 3) {
         gridClone[i][j] = 0;
       } else if (grid[i][j] === 0 && neighbors === 3) {
         gridClone[i][j] = 1;
       }
     }
   }

   setGrid(gridClone);
 };
источник

PI

Prophet Indream in React — русскоговорящее сообщество
грид - это стэйт
источник

PI

Prophet Indream in React — русскоговорящее сообщество
я его обновляю в методе сет грид
источник

PI

Prophet Indream in React — русскоговорящее сообщество
const onStartClick = () => {
   if (!isRunning) {
     startGame()
     gameRunning.current = setInterval(startGame, 1000)
   } else {
     clearInterval(gameRunning.current)
   }
   setRunning(!isRunning)
 };
источник

И

Иван in React — русскоговорящее сообщество
Prophet Indream
вопрос почему срабатывает только один раз все остальные разы - результат одинаковый?
Потому что grid всегда ссылается на одно и то же значение через замыкание. Нарушил правило useEffect про зависимости
источник

PI

Prophet Indream in React — русскоговорящее сообщество
это же useState
источник

PI

Prophet Indream in React — русскоговорящее сообщество
так как тогда его решить?
источник

И

Иван in React — русскоговорящее сообщество
Serhio Toretto
Всем привет, кто нибудь касбин к проекту подключал?
источник

И

Иван in React — русскоговорящее сообщество
Prophet Indream
это же useState
Это замыкание
источник

PI

Prophet Indream in React — русскоговорящее сообщество
окей и как исправить?)
источник

И

Иван in React — русскоговорящее сообщество
Prophet Indream
const gameRunning = useRef<any>(null);

 const startGame = () => {

   let gridClone: number[][] = JSON.parse(JSON.stringify(grid));

   for (let i = 0; i < rowsNum; i++) {
     for (let j = 0; j < columnsNum; j++) {
       let neighbors = 0;
       acts.forEach(([x, y]) => {
         const newI = i + x;
         const newJ = j + y;
         if (newI >= 0 && newI < rowsNum && newJ >= 0 && newJ < columnsNum) {
           neighbors += grid[newI][newJ];
         }
       });
       if (neighbors < 2 || neighbors > 3) {
         gridClone[i][j] = 0;
       } else if (grid[i][j] === 0 && neighbors === 3) {
         gridClone[i][j] = 1;
       }
     }
   }

   setGrid(gridClone);
 };
А, у тебя нет useEffect. Но один хер замыкание
источник

PI

Prophet Indream in React — русскоговорящее сообщество
там же ref current
источник

И

Иван in React — русскоговорящее сообщество
Prophet Indream
окей и как исправить?)
setState(oldState => { ... return newState})
источник

И

Иван in React — русскоговорящее сообщество
Prophet Indream
там же ref current
У тебя в рефе лежит id интервала, а проблема с grid. При чем тут реф?
источник

PI

Prophet Indream in React — русскоговорящее сообщество
const [isRunning, setRunning] = useState(false);

 const gameRunning = useRef<any>(null);

 const startGame = () => {

   let gridClone: number[][] = JSON.parse(JSON.stringify(grid));

   for (let i = 0; i < rowsNum; i++) {
     for (let j = 0; j < columnsNum; j++) {
       let neighbors: number = 0;
       acts.forEach(([x, y]) => {
         const newI: number = i + x;
         const newJ: number = j + y;
         if (newI >= 0 && newI < rowsNum && newJ >= 0 && newJ < columnsNum) {
           neighbors += grid[newI][newJ];
         }
       });
       if (neighbors < 2 || neighbors > 3) {
         gridClone[i][j] = 0;
       } else if (grid[i][j] === 0 && neighbors === 3) {
         gridClone[i][j] = 1;
       }
     }
   }

   setGrid(gridClone);
 };
источник