我正在建立一个任务管理器应用程序使用Redux工具包来管理状态.电路板切片的InitialState中的active Board属性.当我将其导入到编辑页面时,我能够编辑输入中的boardName属性,但不能编辑active Board对象内的Columns数组中的任何文本.我一直收到一个错误
"无法为对象的只读属性‘board’赋值
来自active Board对象的Columns数组被传递到"Columns"useState挂钩中.奇怪的是,当我将一个数组硬编码到useState钩子上时,我能够编辑每一列输入.任何帮助都将不胜感激.
EditBoardModal.jsx个
import React, {useState} from 'react';
import {useDispatch, useSelector} from "react-redux";
import {editBoard} from "../../reducers/board/boardSlice";
import {hideModal} from "../../reducers/modal/modalSlice";
import Button from "../Button/Button";
import "./EditBoardModal.scss";
const EditBoardModal = () => {
const dispatch = useDispatch();
const {activeBoard} = useSelector(store => store.board);
const [boardName,
setBoardName] = useState(activeBoard.name);
const [columns,
setColumns] = useState([...activeBoard.columns]);
const nameChangeHandler = (e) => {
setBoardName(e.target.value)
}
const columnsChangeHandler = (i, e) => {
let columnsValues = [...columns];
columnsValues[i][e.target.name] = e.target.value;
console.log(columnsValues[0][e.target.name]);
setColumns(columnsValues);
}
return (
<div className="edit-board-modal">
<h3 className="edit-modal-title">Edit Board</h3>
<div className="edit-board-name-div">
<label>Board Name</label>
<input
value={boardName}
onChange={nameChangeHandler}
className="edit-task-title"
type="text"
name="edit board name"
placeholder="e.g. Web Design"/>
</div>
<div className="edit-board-columns-div">
<label>Board Columns</label>
{columns.map((column, index) => (
<div className="edit-columns-item-div" key={index}>
<input
onChange={e => columnsChangeHandler(index, e)}
className="edit-column-input"
type="text"
name="board"
value={column.board}
placeholder="e.g. Web Design"/>
<svg onClick={() => deleteColumn(index)} key={index} width="15" height="15" xmlns="http://www.w3.org/2000/svg">
<g fill="#828FA3" fillRule="evenodd"><path d="m12.728 0 2.122 2.122L2.122 14.85 0 12.728z"/><path d="M0 2.122 2.122 0 14.85 12.728l-2.122 2.122z"/></g>
</svg>
</div>
))}
</div>
<Button
onClick={() => dispatch(hideModal())}
text={"+ Add New Column"}
className={"add-column-subtask"}/>
<Button
onClick={() => {
dispatch(hideModal())
dispatch(editBoard(boardName));
}}
text={"Save Changes"}
className={"create-save-changes"}/>
</div>
)
}
export default EditBoardModal
boardSlice.js个
import {createSlice} from "@reduxjs/toolkit";
const boardSlice = createSlice({
name: "board",
initialState: {
boards: [],
activeBoard: null
},
reducers: {
setActiveBoard: (state, {payload}) => {
const getBoardByID = state.boards.find(el => el.id === payload);
state.activeBoard = getBoardByID;
},
addBoard: (state, {payload}) => {
const newBoard = {
id: payload.id,
name: payload.name,
columns: payload.columns
}
if (state.boards.length === 0) {
state.activeBoard = newBoard;
}
state.boards.push(newBoard);
},
editBoard: (state, {payload}) => {
state.activeBoard.name = payload;
},
deleteCurrentBoard: (state, {payload}) => {
const deletedBoard = state.boards.filter(item => item.id !== state.activeBoard.id);
state.boards = deletedBoard;
state.activeBoard = state.boards[0];
},
addColumn: (state, {payload}) => {
state.activeBoard.columns.push(payload)
}
}
});
export const {
addBoard,
setActiveBoard,
deleteCurrentBoard,
addColumn,
editBoard
} = boardSlice.actions;
export default boardSlice.reducer;