Почему мое обновление в react redux создает новые данные с обновлением, которое я сделал, вместо того, чтобы просто редактировать его?

#javascript #reactjs #redux

#javascript #reactjs #redux

Вопрос:

Я не знаю, почему моя форма обновления воссоздает новые данные с элементом, который я передал для редактирования уже существующего элемента, а также, компонент не перезагружается, чтобы показать новое состояние. Я должен обновить его, чтобы увидеть изменения, но я вижу изменения в моем redux chrome inspector сразу после нажатия кнопки Отправить.

Что я сделал, я использовал перехват useEffect для прослушивания изменений в состоянии EditForm.

Полный код тоже находится на моем GitHub, это очень простой код.

Вот код

 EditForm component

import React, {useState, useEffect} from 'react'
import {connect} from 'react-redux'
import {taskEdit} from '../action/taskAction'

function TaskEditForm(props) {

  const [task, setTask] = useState(props.task)

  useEffect(()=>{
    setTask(props.task)
  }, [props])
  
  const handleChange = e => {
    setTask({
      ...task,
      name : e.target.value
    })
  }

  const handleSubmit = (e) => {
    e.preventDefault()
    const {name} = task

    const newTask = {
      name
    }

    props.taskEdit(task._id, newTask)
    props.isEditing(false)

  }

  return (
    <form onSubmit={handleSubmit}>
      <input type="text"  value={task.name} onChange={handleChange} />
      <button>Edit</button>
    </form>
  )
}

export default connect(null, {taskEdit})(TaskEditForm)

Reducer

 case TASK_UPDATE:
      return {
        ...state,
        tasks : state.tasks.map(task=>{
          if(task.id === action.payload.id){
            return Object.assign({}, task, {
              name : action.payload.task
            })
          } else {
            return task
          }
        })
      }


Action 

export const taskEdit = (id, task) => dispatch => {

  const req = {
    method : "POST",
    headers : {"Content-Type":"application/json"},
    body : JSON.stringify(task)
  }

  fetch('http://127.0.0.1:5000/task/add', req)
  .then(res => res.json())
  .then(data => dispatch({
    type : TASK_UPDATE,
    payload : {
      id,
      task
    }
  }))

}
  

Полный код тоже находится на моем GitHub, это очень простой код.

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

1. Вот как обновления в React работают в целом, вы возвращаете новую ссылку на объект, а не просто изменяете существующую, чтобы компонент перезаписывался. Вероятно, вам нужно обновить, чтобы увидеть обновленные данные, потому TaskEditForm что они поступают только taskEdit из redux. Есть ли какой -то родительский компонент, подписанный на хранилище, который передает обновленный объект props с обновленным task значением prop?

2. Да, я передал данные из компонента taskDetail, потому что я не знаю, как передать один элемент в компонент редактирования.

3. Не возражаете ли вы обновить свой вопрос, включив код родительского компонента, чтобы мы могли видеть, как task значение сохраняется и передается как prop?

4. Увидел недостаток. name : action.payload.task должно быть name: action.payload.task.name . Верно?

5.И я думаю, что может быть лучше, если вы укажете, что именно включено в props. Как function TaskEditForm({task, isEditing, ...}) { [props] и в useEffect, его можно заменить [props.task] .