Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Ract 17+TypeScript (https://javascript.ru/forum/node-js-io-js/83263-ract-17-typescript.html)

od0201 03.11.2021 10:11

Ract 17+TypeScript
 
Доброе время суток
какая-то чертовщина, заблудился в 3 соснах.
todo.a увеличивается не на 1, а на два. Данный кусок кода срабатывает два раза.
toggleHander исходя и логов срабатывает один раз, в newTodo перед return нужный результат
но уже в useEffect (который также срабатывает один раз исходя из логов) результат двойной

Код:

export interface ITodo{
  title:string,
  id:number,
  completed:boolean,
  a:number
}
.................
  const [todos, setTodos]=useState<ITodo[]>([])
  useEffect(()=>{
    console.log(todos)
  },[todos])
  const toggleHander=(id:number)=>{
    setTodos(prev=>{
      const newTodo:ITodo[]=prev.map(todo=>{
        if(todo.id === id){
          console.log('+')
          todo.completed = !todo.completed
          todo.a=todo.a+1
          // todo.completed=false
        }else{console.log('-')}
        // console.log(todo)
        return todo
      })
      newTodo.forEach(e=>console.log(e))
      return newTodo
    })
  }
  const


Aetae 03.11.2021 12:51

todo - объёкт, объекты передаёются по ссылке, меняя a - ты меняешь его в исходном, чего делать в React нельзя.
const newTodo:ITodo[] = prev.map(todo=>{
        if(todo.id === id){ 
          console.log('+')

          return {...todo, completed: !todo.completed, a: todo.a+1};
        }else{console.log('-')}
        // console.log(todo)
        return todo
})

Не знаю правда связанно ли это с твоей проблемой, но такая хрень может привести к множеству странных эффектов.)

od0201 03.11.2021 14:24

Aetae,
Ты прав, проблема была в этом.
Спасибо


Часовой пояс GMT +3, время: 12:20.