отрисовка от плоских данных к вложенным в создании вопроса

This commit is contained in:
krokodilka 2022-07-24 03:39:43 +03:00
parent e6caad37b2
commit 7efa51acb5
4 changed files with 118 additions and 23 deletions

@ -218,8 +218,25 @@ export default () => {
if (stockroom[index].isFocus) {
setFocus(undefined)
}
let newArr = stockroom
newArr.splice(index, 1)
let newArr:any = []
//Если удалённый объект был хранилищем (контейнером, или селектом), мы не вложим в новый массив его и его потомков
if (stockroom[index].type === 1 || stockroom[index].type === 7) {
stockroom.forEach((e:any, i:number) => {
if (e.id !== id) {
if (e.parent !== id) {
newArr.push(e)
} else {
if (e.isFocus) {
setFocus(undefined)
}
}
}
})
} else {
newArr = stockroom
newArr.splice(index, 1)
}
setStockroom([...newArr])
saveCondition("stockroom", newArr)
}
@ -237,7 +254,7 @@ export default () => {
onSubmit={(values, actions) => {
// console.log(JSON.stringify(values))
console.log(getCondition())
console.log(focus)
console.log(stockroom)
}}
>
{(props: FormikProps<Values>) => (

@ -27,7 +27,7 @@ export default (props:any) => {
e.type === 5 ?
<Text>Описание</Text>
:
<Text>{e.text}</Text>
<Text>{e.text} {e.id}</Text>
}
<Button

@ -7,26 +7,104 @@ import {Box} from "@chakra-ui/react";
export default ({stockroom, changeFocus} : any) => {
if (stockroom.length !== 0) {
// Перед работой проверяем все вложенности. На основе хранилища с плоскими объектами строится хранилище с вложенностями.
let newStorage:any = []
// На основе хранилища с плоскими объектами строится хранилище с вложенностями.
stockroom.forEach((e:any,i:number) => {
if (e.parent === undefined) {
newStorage.push(e)
} else {
newStorage.forEach()
console.log("строю с нуля на основании этого массива")
console.log(stockroom)
//Мы разворачиваем стартовый массив и вкладываем элементы в начало результирующего массива.
let reverseStockroom: any
let arrayStorage: any = {}
let newStorage: any = []
//Создаём хранилище со всеми вложенностями. Ключи - id родителя
stockroom.reverse().forEach((e: any, i: number) => {
if (e.parent !== undefined) {
if (arrayStorage[e.parent] === undefined) {
arrayStorage[e.parent] = []
}
arrayStorage[e.parent].unshift(e)
}
})
return(
<Types
element={stockroom[0]} keyInfo={0} changeFocus={changeFocus}
/>
)
//Если есть какие-то вложенности
if (Object.keys(arrayStorage).length !== 0) {
//Теперь у нас есть массив со всеми вложенностями.
//Будем проходиться по хранилищу задом наперёд, ибо не имеем пометок где заканчивается хранилище, но знаем где оно начинается
reverseStockroom = stockroom.reverse();
//Важно помнить, что мы проходимся по массиву линейно и совпадение id текущего элемента и id в arrayStorage может быть единожды.
//Это значит, что найдя id в arrayStorage мы можем что-либо сделать с этим массивом и больше уже больше никогда его не тронем.
//Возможны 4 состояния объекта:
//родитель_дети
//нет_______нет - просто вложить в результирующий массив
//нет________да - вложить в результирующий массив с полем children
//да________нет - этот объект уже был использован в массиве arrayStorage. Оставить в покое
//да_________да - этот объект уже был использован в массиве arrayStorage. В его поле children нужно вложить массив его детей
// в массиве arrayStorage вложить в поле children родителя массив с детьми и ждать, пока очередь дойдёт до родителя
reverseStockroom.forEach((e: any, i: number) => {
if (arrayStorage[e.id] === undefined) {
//Объект не содержит потомков. Дети - нет
if (e.parent === undefined) {
//Родитель - нет
newStorage.push(e)
} //else Родитель - да
} else {
//Объект содержит потомков. Дети - да
if (e.parent === undefined) { //является ли объект вложенным?
//Родитель - нет
e.children = arrayStorage[e.id]
newStorage.push(e)
} else {
//Родитель - да
arrayStorage[e.parent].forEach((el:any) => {
if (el.id === e.id) {
el.children = arrayStorage[e.id]
}
})
}
}
})
console.log("Я нашёл вложенности")
console.log(newStorage)
function isContains (e:any) {
return(
e.map((element:any) => {
console.log(element)
if (element.children === undefined) {
console.log("элемент без потомков")
return(
<Types
element={element} keyInfo={element.id} changeFocus={changeFocus} key={element.id}
/>
)
} else {
console.log("элемент с потомками")
return(
<div key={element.id} style={{border:"solid black 1px", padding: "10px"}}>
{isContains(element.children)}
</div>
)
}
})
)
}
return isContains(newStorage)
} else {
//Если вложенностей нет
console.log("Вложенностей нет")
return(stockroom.map((e: any, i: number) => {
return (
<Types
element={e} keyInfo={e.id} changeFocus={changeFocus} key={e.id}
/>
)
}))
}
} else {
return null
return <></>
}
}
// if (e.type === 1 || e.type === 7) {
//
// }
}

@ -13,7 +13,7 @@ const root = ReactDOM.createRoot(
);
root.render(
<React.StrictMode>
// <React.StrictMode>
<ChakraProvider>
<SnackbarProvider maxSnack={3}>
<BrowserRouter>
@ -26,5 +26,5 @@ root.render(
</BrowserRouter>
</SnackbarProvider>
</ChakraProvider>
</React.StrictMode>
// </React.StrictMode>
);