使用 useReducer 将 属性 添加到状态数组中的对象
add property to object in state array with useReducer
我有一组对象存储在如下状态:
{
"file": {},
"myFsize": 1321,
"fileType": "image/jpeg"
},
{
"file": {},
"myFsize": 999,
"fileType": "image/jpeg"
}
]
我正在使用 useHookReducer
成功添加和删除对象
const [fileSelectedArrax, setfileSelectedArrax] = useReducer(fileSelectReducer, [])
但是我还想在每个对象上传时添加一个上传进度。它应该看起来像这样...
{
"file": {},
"myFsize": 1321,
"fileType": "image/jpeg",
"percent": "90"
},
{
"file": {},
"myFsize": 999,
"fileType": "image/jpeg",
"percent": "100"
}
]
这是我的减速器:
function fileSelectReducer(state, action) {
switch (action.type) {
case 'add':
console.log(state)
return [...state, action.filex]
case 'adduploadprogress':
//WHAT HERE?
return [...state]
case 'remove':
const update = [...state]
update.splice(update.indexOf(action.file), 1)
document.getElementById(fileattach).value = ''
return update
default:
return state
}
}
我调用它的函数是:
function adduploadprogress({ file, percent }) {
const filex = { file, percent }
console.log(filex)
setfileSelectedArrax({ filex, type: 'adduploadprogress' })
}
我已尝试 for loops
和 ternerys 将状态中的对象与操作中传入的文件进行匹配,但似乎没有任何效果
您可以映射文件数组 (state
),并用包含新 percent
:
的新对象替换当前文件的对象
case 'adduploadprogress':
return state.map(f => f.file === action.filex.file ? ({
...f,
percent: action.filex.percent,
}) : f)
我有一组对象存储在如下状态:
{
"file": {},
"myFsize": 1321,
"fileType": "image/jpeg"
},
{
"file": {},
"myFsize": 999,
"fileType": "image/jpeg"
}
]
我正在使用 useHookReducer
成功添加和删除对象
const [fileSelectedArrax, setfileSelectedArrax] = useReducer(fileSelectReducer, [])
但是我还想在每个对象上传时添加一个上传进度。它应该看起来像这样...
{
"file": {},
"myFsize": 1321,
"fileType": "image/jpeg",
"percent": "90"
},
{
"file": {},
"myFsize": 999,
"fileType": "image/jpeg",
"percent": "100"
}
]
这是我的减速器:
function fileSelectReducer(state, action) {
switch (action.type) {
case 'add':
console.log(state)
return [...state, action.filex]
case 'adduploadprogress':
//WHAT HERE?
return [...state]
case 'remove':
const update = [...state]
update.splice(update.indexOf(action.file), 1)
document.getElementById(fileattach).value = ''
return update
default:
return state
}
}
我调用它的函数是:
function adduploadprogress({ file, percent }) {
const filex = { file, percent }
console.log(filex)
setfileSelectedArrax({ filex, type: 'adduploadprogress' })
}
我已尝试 for loops
和 ternerys 将状态中的对象与操作中传入的文件进行匹配,但似乎没有任何效果
您可以映射文件数组 (state
),并用包含新 percent
:
case 'adduploadprogress':
return state.map(f => f.file === action.filex.file ? ({
...f,
percent: action.filex.percent,
}) : f)