반응 앱의 내 확인란이 확인란을 클릭 한 후에도 상태가 변경되지 않습니다.

Ashil

나는 반응으로 todoapp을 만들고 있는데, 확인란을 클릭해도 아무 일도 일어나지 않습니다. 이 문제에 대한 해결책을 얻지 못하고 있습니다. 내 코드는 다음과 같습니다.

App.js

import './App.css';
import React from 'react'
import TodoItem from './components/TodoItem'
import todosData from './components/TodoList'

class App extends React.Component {
  constructor() {
    super()
    this.state = {
      todos : todosData
    }
    this.handleChange = this.handleChange.bind(this) 
  }

    handleChange(id) {
        this.setState(prevState => {
           const updatedTodos = prevState.todos.map(todo => {
            if (todo.id === id) {               
               todo.completed = !todo.completed
            }
            console.log(todo)
            return todo
          }) 
          return {
            todos : updatedTodos
          }
        })
        
    }
  
  render() {
    const todoItems = this.state.todos.map(item => <TodoItem key={item.id} item={item}
    handleChange={this.handleChange}  />)

    return (
      <div className='todo-list'>
        {todoItems}
      </div> 
      
    );
  }

}
  

export default App;

TodoItem.js

import React from 'react'

function TodoItem(props) {
    return (
        <div className='todo-item'>
            <input type='checkbox'
                checked={props.item.completed}
                onChange={() =>{props.handleChange(props.item.id)}}
            />
            <p>{props.item.text}</p>
           
        </div>
        
    )
} 

export default TodoItem

TodoList.js

const todosData = [
    {
        id : 1,
        text : "Take Out the trash",
        completed : false
    },
    {
        id : 2,
        text : "Grocery shopping",
        completed : false
    },
    {
        id : 3,
        text : "Mow lawn",
        completed : false
    },
    {
        id : 4,
        text : "Clean toilet",
        completed : true
    },
]

export default todosData

나머지 API 응답을 모방하기 위해 사전으로 TodoList.js 에서 데이터를 받고 있습니다 . 문제가 무엇인지 모르겠습니다. 반응이 처음입니다. 코드에 문제가 있습니까?

반응 버전 : 17.0.1

Nithish

귀하의 코드에서 볼 수있는 한 가지 문제 handleChangeApp구성 요소 상태 메서드 에서 prevState.todos.map. 즉,

handleChange(id) {
        this.setState(prevState => {
           const updatedTodos = prevState.todos.map(todo => {
            if (todo.id === id) {               
               todo.completed = !todo.completed  //--> Here the state is getting mutated.
            }
//...rest of the code

여기에서는 배열에서 사용 Array.map하고 todos있지만 todo맵의 각각 은 여전히 ​​동일한 참조를 가지므로 상태 todo.completed = !todo.completedtodos배열이 업데이트 될 때 . 예측할 수없는 문제가 발생할 수 있습니다.

그래서 우리는 그 handleChange방법을 아래와 같이 변환 할 수 있습니다.

handleChange(id) {
  this.setState(prevState => {
    const updatedTodos = prevState.todos.map(todo => {
      return {
        ...todo,
        ...(todo.id === id && {
          completed: !todo.completed
        })
      }
    })
    return {
      todos: updatedTodos
    }
  })
}

아래는 실행 가능한 스 니펫입니다.

const todosData = [{id:1,text:"Take Out the trash",completed:false},{id:2,text:"Grocery shopping",completed:false},{id:3,text:"Mow lawn",completed:false},{id:4,text:"Clean toilet",completed:true}]

const {Component} = React;

function TodoItem(props) {
    return (
        <div className='todo-item'>
            <input type='checkbox'
                checked={props.item.completed}
                onChange={() =>{props.handleChange(props.item.id)}}
            />
            <p>{props.item.text}</p>
        </div>
    )
} 

class App extends Component {
  constructor() {
    super()
    this.state = {
      todos: todosData
    }
    this.handleChange = this.handleChange.bind(this) 
  }

    handleChange(id) {
        this.setState(prevState => {
           const updatedTodos = prevState.todos.map(todo => {
            return {
              ...todo,
              ...(todo.id === id && {completed: !todo.completed})
            }
          }) 
          return {
            todos: updatedTodos
          }
        })
    }
  
  render() {
    const todoItems = this.state.todos.map(item => <TodoItem key={item.id} item={item}
    handleChange={this.handleChange}  />)

    return (
      <div className='todo-list'>
        {todoItems}
      </div> 
      
    );
  }

}
  

ReactDOM.render(<App />, document.getElementById("react"));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.0/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.0/umd/react-dom.production.min.js"></script>

<div id="react"></div>

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

클릭 가능한 열에 넣을 때 확인란 클릭이 작동하지 않습니다.

분류에서Dev

확인란을 클릭해도 변경되지 않습니다.

분류에서Dev

JQuery, 확인란을 클릭 한 후 값이 업데이트되지 않음

분류에서Dev

React 확인란은 레이블 클릭시 상태를 확인하도록 설정하지 않습니다.

분류에서Dev

내 양식의 확인란을 더 이상 클릭 할 수 없습니까?

분류에서Dev

SharedPreferences가 내 Android 앱의 확인란을 저장하지 않습니다.

분류에서Dev

확인란의 시각적 상태가 변경되지 않습니다.

분류에서Dev

내 페이지에 두 개의 확인란이 있지만 두 번째 확인란은 항상 내 모델에 대해 false를 반환합니다.

분류에서Dev

확인란을 클릭하면 다른 확인란의 선택을 취소하고 이전에 선택한 항목에서 변경을 트리거하거나 이벤트를 클릭합니다.

분류에서Dev

정의되지 않음을 확인한 후 반응 상태가 정의되지 않음

분류에서Dev

확인란의 상태에 따라 16 진수 단어의 비트 값을 업데이트하고 그 반대의 경우도 마찬가지입니다.

분류에서Dev

내 확인란이 angularjs의 어떤 상자도 선택되지 않았습니다.

분류에서Dev

내 Windows 8.1 앱의 확인란이 에뮬레이터에서 활성화되지 않습니다.

분류에서Dev

한 페이지에 2 개 이상의 jquery 모바일 가로 확인란이 엉망이되었습니다.

분류에서Dev

한 페이지에 2 개 이상의 jquery 모바일 가로 확인란이 엉망이되었습니다.

분류에서Dev

확인란이 선택되어 있거나 확인란이 선택되지 않은 경우 값을 제거하면 다른 텍스트 상자에서 확인란 값과 텍스트 상자 값의 합계를 어떻게 얻을 수 있습니까?

분류에서Dev

버튼을 클릭하면 팝업 페이지에서 상위 페이지로 선택한 여러 확인란 행이 표시되기를 원합니다.

분류에서Dev

클릭하지 않고 신속하게 확인란의 상태를 변경할 수 있습니까?

분류에서Dev

사용자가 다음 페이지 매김 페이지 또는 페이지 새로 고침을 클릭 한 후 확인란 상태 및 게시 값을 페이지에 저장하는 방법은 무엇입니까?

분류에서Dev

한 번의 클릭으로 Oracle ApEx에서 DB 열을 나타내는 모든 확인란을 확인하는 방법은 무엇입니까?

분류에서Dev

Knockout.js의 클릭 이벤트에서 확인란이 선택되었는지 확인합니다.

분류에서Dev

확인란이 반짝이는 앱 R을 선택한 경우에만 드롭 다운 메뉴

분류에서Dev

Jquery 하나의 확인란을 클릭하면 한 행 내의 모든 확인란을 선택해야합니다

분류에서Dev

확인란을 선택한 속성이 정의되지 않았습니다.

분류에서Dev

Laravel : 레이블을 클릭해도 확인란이 설정되지 않습니다.

분류에서Dev

각도 클릭 입력 확인란이 호출되지 않음

분류에서Dev

IE8의 확인란에 이상한 jquery 속성이 추가되었습니다.

분류에서Dev

.net core에서 ViewBag를 사용하는 동안 확인란의 상태가 유지되지 않습니다.

분류에서Dev

확인란에 대한 Vue 변경 이벤트가 작동하지 않습니다.

Related 관련 기사

  1. 1

    클릭 가능한 열에 넣을 때 확인란 클릭이 작동하지 않습니다.

  2. 2

    확인란을 클릭해도 변경되지 않습니다.

  3. 3

    JQuery, 확인란을 클릭 한 후 값이 업데이트되지 않음

  4. 4

    React 확인란은 레이블 클릭시 상태를 확인하도록 설정하지 않습니다.

  5. 5

    내 양식의 확인란을 더 이상 클릭 할 수 없습니까?

  6. 6

    SharedPreferences가 내 Android 앱의 확인란을 저장하지 않습니다.

  7. 7

    확인란의 시각적 상태가 변경되지 않습니다.

  8. 8

    내 페이지에 두 개의 확인란이 있지만 두 번째 확인란은 항상 내 모델에 대해 false를 반환합니다.

  9. 9

    확인란을 클릭하면 다른 확인란의 선택을 취소하고 이전에 선택한 항목에서 변경을 트리거하거나 이벤트를 클릭합니다.

  10. 10

    정의되지 않음을 확인한 후 반응 상태가 정의되지 않음

  11. 11

    확인란의 상태에 따라 16 진수 단어의 비트 값을 업데이트하고 그 반대의 경우도 마찬가지입니다.

  12. 12

    내 확인란이 angularjs의 어떤 상자도 선택되지 않았습니다.

  13. 13

    내 Windows 8.1 앱의 확인란이 에뮬레이터에서 활성화되지 않습니다.

  14. 14

    한 페이지에 2 개 이상의 jquery 모바일 가로 확인란이 엉망이되었습니다.

  15. 15

    한 페이지에 2 개 이상의 jquery 모바일 가로 확인란이 엉망이되었습니다.

  16. 16

    확인란이 선택되어 있거나 확인란이 선택되지 않은 경우 값을 제거하면 다른 텍스트 상자에서 확인란 값과 텍스트 상자 값의 합계를 어떻게 얻을 수 있습니까?

  17. 17

    버튼을 클릭하면 팝업 페이지에서 상위 페이지로 선택한 여러 확인란 행이 표시되기를 원합니다.

  18. 18

    클릭하지 않고 신속하게 확인란의 상태를 변경할 수 있습니까?

  19. 19

    사용자가 다음 페이지 매김 페이지 또는 페이지 새로 고침을 클릭 한 후 확인란 상태 및 게시 값을 페이지에 저장하는 방법은 무엇입니까?

  20. 20

    한 번의 클릭으로 Oracle ApEx에서 DB 열을 나타내는 모든 확인란을 확인하는 방법은 무엇입니까?

  21. 21

    Knockout.js의 클릭 이벤트에서 확인란이 선택되었는지 확인합니다.

  22. 22

    확인란이 반짝이는 앱 R을 선택한 경우에만 드롭 다운 메뉴

  23. 23

    Jquery 하나의 확인란을 클릭하면 한 행 내의 모든 확인란을 선택해야합니다

  24. 24

    확인란을 선택한 속성이 정의되지 않았습니다.

  25. 25

    Laravel : 레이블을 클릭해도 확인란이 설정되지 않습니다.

  26. 26

    각도 클릭 입력 확인란이 호출되지 않음

  27. 27

    IE8의 확인란에 이상한 jquery 속성이 추가되었습니다.

  28. 28

    .net core에서 ViewBag를 사용하는 동안 확인란의 상태가 유지되지 않습니다.

  29. 29

    확인란에 대한 Vue 변경 이벤트가 작동하지 않습니다.

뜨겁다태그

보관