#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]
.