UI 未显示 React redux 工具包应用程序中数组项的更改
UI is not displaying changes from an array item in a react redux tool kit app
我正在使用 react-redux toolkit.I 开发一个 ToDo 应用程序可以 read/display,插入和删除成功但不更新,因为 UI 没有显示对 to- DOS,即使我看到 Redux ToolsDev
.
中的变化
我认为 <ToDoList/>
负责使用来自状态的数组显示所有待办事项的组件不会重新渲染,因为没有检测到数组本身的变化,因为数组项 (todo) 是唯一更新的。
代码:
toDoSlice
const initialState = {
toDos: [
{ id: nanoid(), text: "First ToDo" },
{ id: nanoid(), text: "Second ToDo" },
],
text: "",
};
const toDoSlice = createSlice({
name: "toDo",
initialState,
reducers: {
saveChanges: (state, action) => {
state.toDos[action.payload].text = state.text;
// updating other state values...
},
},
});
export const selectToDos = (state) => state.todo.toDos;
export const selectText = (state) => state.todo.text;
export const selectEditStatus = (state) => state.todo.editStatus;
export const { saveChanges } = toDoSlice.actions;
export default toDoSlice.reducer;
<ToDoList/>
显示数组中的待办事项
export default function ToDoList({ toDos }) {
return (
<form className="p-3" style={{ backgroundColor: "#F0E8E5" }}>
<h2>List</h2>
{toDos.map((todo) => (
<ToDo key={todo.id} {...todo} />
))}
</form>
);
}
<ToDo/>
使用 id 和文本显示待办事项
export default function ToDo({ id, text }) {
const dispatch = useDispatch();
return (
<>
<div className="input-group mt-3">
<input type="text" className="form-control" defaultValue={text} />
<button
type="button"
className="btn btn-warning"
onClick={() => dispatch(editToDo(id))}
>
Update
</button>
<button
type="button"
className="btn btn-danger"
onClick={() => dispatch(deleteTodo(id))}
>
Delete
</button>
</div>
</>
);
}
如果您在开发工具中看到组件更新但没有重新渲染,那么问题可能出在商店连接到 ToDoList
组件的方式上。
Here's a StackBlitz showing the code all wired together - 我创建了一个简单的“主机”组件,它使用您的 selectToDos
选择器将商店连接到 ToDoList
-
function ToDoListHost() {
const toDos = useSelector(selectToDos);
return (
<ToDoList toDos={toDos} />
);
}
我还稍微更改了 ToDo
组件,以便通过在输入字段中连接 onChange
事件,将每个更新立即传播到商店:
import React, { useState } from 'react';
import { useDispatch } from 'react-redux';
import { editToDo, deleteToDo } from './store';
export default function ToDo({ id, text }) {
const dispatch = useDispatch();
const handleChange = event =>
dispatch(editToDo({ id, text: event.target.value }));
return (
<>
<div className="input-group mt-3">
<input
type="text"
className="form-control"
value={text}
onChange={handleChange}
/>
<button
type="button"
className="btn btn-danger"
onClick={() => dispatch(deleteToDo(id))}
>
Delete
</button>
</div>
</>
);
}
我正在使用 react-redux toolkit.I 开发一个 ToDo 应用程序可以 read/display,插入和删除成功但不更新,因为 UI 没有显示对 to- DOS,即使我看到 Redux ToolsDev
.
中的变化
我认为 <ToDoList/>
负责使用来自状态的数组显示所有待办事项的组件不会重新渲染,因为没有检测到数组本身的变化,因为数组项 (todo) 是唯一更新的。
代码:
toDoSlice
const initialState = {
toDos: [
{ id: nanoid(), text: "First ToDo" },
{ id: nanoid(), text: "Second ToDo" },
],
text: "",
};
const toDoSlice = createSlice({
name: "toDo",
initialState,
reducers: {
saveChanges: (state, action) => {
state.toDos[action.payload].text = state.text;
// updating other state values...
},
},
});
export const selectToDos = (state) => state.todo.toDos;
export const selectText = (state) => state.todo.text;
export const selectEditStatus = (state) => state.todo.editStatus;
export const { saveChanges } = toDoSlice.actions;
export default toDoSlice.reducer;
<ToDoList/>
显示数组中的待办事项
export default function ToDoList({ toDos }) {
return (
<form className="p-3" style={{ backgroundColor: "#F0E8E5" }}>
<h2>List</h2>
{toDos.map((todo) => (
<ToDo key={todo.id} {...todo} />
))}
</form>
);
}
<ToDo/>
使用 id 和文本显示待办事项
export default function ToDo({ id, text }) {
const dispatch = useDispatch();
return (
<>
<div className="input-group mt-3">
<input type="text" className="form-control" defaultValue={text} />
<button
type="button"
className="btn btn-warning"
onClick={() => dispatch(editToDo(id))}
>
Update
</button>
<button
type="button"
className="btn btn-danger"
onClick={() => dispatch(deleteTodo(id))}
>
Delete
</button>
</div>
</>
);
}
如果您在开发工具中看到组件更新但没有重新渲染,那么问题可能出在商店连接到 ToDoList
组件的方式上。
Here's a StackBlitz showing the code all wired together - 我创建了一个简单的“主机”组件,它使用您的 selectToDos
选择器将商店连接到 ToDoList
-
function ToDoListHost() {
const toDos = useSelector(selectToDos);
return (
<ToDoList toDos={toDos} />
);
}
我还稍微更改了 ToDo
组件,以便通过在输入字段中连接 onChange
事件,将每个更新立即传播到商店:
import React, { useState } from 'react';
import { useDispatch } from 'react-redux';
import { editToDo, deleteToDo } from './store';
export default function ToDo({ id, text }) {
const dispatch = useDispatch();
const handleChange = event =>
dispatch(editToDo({ id, text: event.target.value }));
return (
<>
<div className="input-group mt-3">
<input
type="text"
className="form-control"
value={text}
onChange={handleChange}
/>
<button
type="button"
className="btn btn-danger"
onClick={() => dispatch(deleteToDo(id))}
>
Delete
</button>
</div>
</>
);
}