Состояния, не показывающие отражения изменений в ReactJS

#javascript #reactjs #django-rest-framework

#javascript #reactjs #django-rest-framework

Вопрос:

Недавно я начал изучать React и создавать API с помощью Django REST. Я просто попытался извлечь некоторые данные из API, работающего на 127.0.0.1: 8000, для отображения в приложении react to-do, работающем на 1270.0.1: 3000. Отображение данных работает хорошо. Но я хочу изменить состояние флажка, который я использовал для определения того, завершена задача todo или нет. Для этого у меня есть функция, которая вызывается всякий раз, когда мы хотим изменить состояние. Это работает идеально, когда данные извлекаются статически, но плохо работает с использованием API. Взгляните на приведенный ниже код :

App.js

 import React from 'react'
import Todo from './Components/Todo'
import ToDoData from './Components/ToDoData';
import Nav from './Components/Nav'
import { Switch, Route, Link } from 'react-router-dom';
import List from './Components/List'
// function based Component
function App() {
  //const Data = ToDoData.map(details => <Todo det={details} />)
  return (

    <div>
      <Switch>
        <Route path="/" component={List} exact />
      </Switch>
    </div>

  );
}
export default App
 

index.js

 import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';
import {BrowserRouter} from 'react-router-dom';

ReactDOM.render(
  <React.StrictMode>
    <BrowserRouter>
      <App />
    </BrowserRouter>
  </React.StrictMode>, 
  document.getElementById('root')
);

serviceWorker.unregister();

 

List.js

 import React from 'react'
import Todo from './Todo'
import Nav from './Nav'

//Class based Component
class List extends React.Component {

    constructor() {
        super()
        this.state = {
            todos: [],
        }
        this.handleChange = this.handleChange.bind(this)
    }

    fetchData() {
        fetch('http://localhost:8000/Todo-api/')
            .then(response => response.json())
            .then((data) => {
                this.setState({
                    todos: data
                });
            });
    }

    componentDidMount() {
        this.fetchData();
    }

    handleChange(id) {
        console.log("Parth")
        this.setState(prevState => {
            const updatedData = prevState.todos.map(todo => {
                if (todo.id === id) {
                    todo.completed = !todo.completed
                }
                return todo
            })
            return {
                todos: updatedData
            }
        })
    }

    currentDate() {
        return new Date().getFullYear();
    }


    render() {
        const Data = this.state.todos.map(details => <Todo key={details.id} det={details} handleChange={this.handleChange} />)

        const someStyle = {
            marginTop: "40px", marginLeft: "100px", marginRight: "100px",
        }
        console.log(this.state.todos)
        return (
            <div>
                <Nav />

                <div className="todo-list box">
                    {Data}
                </div>

                <hr style={someStyle} />

                <p className="text-center" style={{ fontFamily: "Roboto Mono", lineHeight: 0.5 }}>Copyright ©️ {this.currentDate()} Parth Pandya </p>

                <p className="text-center" style={{ fontFamily: "Roboto Mono", fontSize: 10, lineHeight: 0.5 }}>Some rights reserved.</p>
            </div>
        )
    }
}

export default List
 

Todo.js

 import React from 'react'



function Todo(props) {
  const completeStyles = {
    fontStyle: "italic",
    textDecoration: "Line-through",
    color: "gray",
  }

  return (
    <div className="todo-item">
      <input type="checkbox" onChange={() => props.handleChange(props.det.id)} checked={props.det.completed} />
      <p style={props.det.completed ? completeStyles : null}>{props.det.title}</p>
    </div>
  );
}

export default Todo;
 

Может кто-нибудь, пожалуйста, предложить что-нибудь? Любая помощь будет полезна для завершения этого крошечного проекта и некоторых концепций 🙂 Только простая проблема с флажком!

Комментарии:

1. Вы пробовали использовать console.log() для ответа api? Если это работает статически, то проблема может быть где-то внутри вашего приложения django.

2. Да, я это сделал. Но логическое значение не меняется при вызове функции handleChange().

3. Могу ли я разместить весь код в репозитории github? затем вы можете протестировать его на своем локальном компьютере.

4. @NoahKanyo вы можете найти репозиторий моего проекта здесь .