Не используйте перехватчики useEffect
& useState
для преобразования данных, которое не является частью асинхронного потока.
Этот случай лучше обрабатывается с помощью useMemo
. Когда datalist
изменится, useMemo
произведет list
, и если оно не изменится, будет использовано записанное значение. Кроме того, это не приведет к бесконечному l oop, потому что не вызовет рендеринга при прослушивании своего собственного состояния.
Чтобы создать list
, используйте карту, которая будет содержать mime -типы и их соответствующие типы. Уменьшите массив элементов, и в соответствии с типом, который вы получаете с карты, поместите их в подмассивы images
или videos
.
/** external code (not in the hook) **/
const types = new Map([['video/mp4', 'video'], ['images/gpeg', 'image']])
const getListType = ({ type }) => types.has(type) ?
`${types.get(type)}List` : null
/** hook code **/
const list = useMemo(() => dataList.reduce((r, item) => {
const list = getListType(item.images[0])
is(list) r[list].push(item)
return r;
}, { imageList:[], videoList:[] }), [dataList])