为什么我的 reducer hook 会忽略我的 if 语句?
why does my reducer hook ignore my if statment?
当 运行 我的 reducer 调度方法在这里:
function reducer(state, action) {
switch (action.type) {
case "updateBox":
return state.map((input, index) => {
input.map((data, NextIndex)=>{
if (action.NextIndex === NextIndex) { data.comment = action.text } else {data.comment = data.comment}
})
});
开发工具显示,无论 action.Nextindex = NextIndex,data.comment 将始终更改为 action.text。
其他代码:
let object = {
comment:""
}
let box = [object, object]
let list = [box, box]
const [listState, listDispatch] = useReducer(reducer, list);
{ listState.map((data, index)=> (
{data.map((input, NextIndex)=>(
<TextField value={data[NextIndex].comment}
onChange={(e)=>{listDispatch({type:"updateBox", text:e.target.value, field:"comment", NextIndex, index})}}
multiline fullWidth variant="outlined"/>
)})}
沙盒link
https://codesandbox.io/s/charming-sid-wdn0h?file=/src/App.js
仅仅因为变量不处于 React 状态并不意味着它是按值复制的。
当每个变量改变时,其他变量也会改变。
更好的方法是将映射方面替换为:
let stateCopyr = [...listState];
stateCopyr[action.index][action.NextIndex].comment = action.text
console.log(stateCopyr)
console.log("update")
return stateCopyr
当 运行 我的 reducer 调度方法在这里:
function reducer(state, action) {
switch (action.type) {
case "updateBox":
return state.map((input, index) => {
input.map((data, NextIndex)=>{
if (action.NextIndex === NextIndex) { data.comment = action.text } else {data.comment = data.comment}
})
});
开发工具显示,无论 action.Nextindex = NextIndex,data.comment 将始终更改为 action.text。
其他代码:
let object = {
comment:""
}
let box = [object, object]
let list = [box, box]
const [listState, listDispatch] = useReducer(reducer, list);
{ listState.map((data, index)=> (
{data.map((input, NextIndex)=>(
<TextField value={data[NextIndex].comment}
onChange={(e)=>{listDispatch({type:"updateBox", text:e.target.value, field:"comment", NextIndex, index})}}
multiline fullWidth variant="outlined"/>
)})}
沙盒link
https://codesandbox.io/s/charming-sid-wdn0h?file=/src/App.js
仅仅因为变量不处于 React 状态并不意味着它是按值复制的。
当每个变量改变时,其他变量也会改变。
更好的方法是将映射方面替换为:
let stateCopyr = [...listState];
stateCopyr[action.index][action.NextIndex].comment = action.text
console.log(stateCopyr)
console.log("update")
return stateCopyr