I am using react-grid-layout to make drag-drop and resize components
, So i am able to achieve the functionality as mentioned in the doc.
My Issue
- I am creating dynamic UI so I am rendering my UI with data.
- Here in this library I need to create layout like
{ {i: 'a', x: 0, y: 0, w: 1, h: 2}
- When I am creating static UI I am able to achieve what I want.Here is working code sandbox
In static Ui with predefined layout I did like below.
const layout = [
{ i: "a", x: 0, y: 0, w: 2, h: 1 },
{ i: "b", x: 2, y: 0, w: 2, h: 1 },
{ i: "c", x: 4, y: 0, w: 2, h: 1 },
{ i: "d", x: 6, y: 0, w: 2, h: 1 },
{ i: "e", x: 0, y: 2, w: 2, h: 1 }
];
<div className="App">
<GridLayout
className="layout"
layout={layout}
style={{ backgroundColor: "blue" }}
>
{layout.map((li) => (
<div key={li.i} style={{ backgroundColor: "yellow" }}>
{li.i}
</div>
))}
</GridLayout>
This is working fine, But here the layout I have defined is static, So for this I searched and got one example with dynamic height and width, which is creating a dynamic layout.
But that is creating the layout with just random numbers which is not showing up with my UI (as per my use), This is what I found out in library for dynamic UI
What I am trying to do
I have this data as in my state
const [data1, setData] = useState({
EmpData: [
{
empId: 11,
lay1: { i: 'a' },
data: [
{
firstName: 'Steve',
lastName: 'Smith',
},
{
firstName: 'Michel',
lastName: 'Muner',
},
],
},
{
empId: 12,
lay1: { i: 'b' },
data: [
{
firstName: 'Charles',
lastName: 'Johnsen',
},
{
firstName: 'Glen',
lastName: 'Tyson',
},
],
},
{
empId: 13,
lay1: { i: 'c' },
data: [
{
firstName: 'Steve',
lastName: 'Smith',
},
{
firstName: 'Michel',
lastName: 'Muner',
},
],
},
{
empId: 14,
lay1: { i: 'd' },
data: [
{
firstName: 'Steve',
lastName: 'Smith',
},
{
firstName: 'Michel',
lastName: 'Muner',
},
],
},
{
empId: 15,
lay1: { i: 'e' },
data: [
{
firstName: 'Steve',
lastName: 'Smith',
},
{
firstName: 'Michel',
lastName: 'Muner',
},
],
},
],
});
By above data I am creating Ui as per my need
return data1.EmpData.map((li, index) => (
<div key={index.toString()} data-grid={index}"> </div> //what should I pass here as key and layout that I am not getting
<>
{li.data.map((l) => (
<>
<div>{l.firstName}</div>
<div>{l.lastName}</div>
</>
))}
</>
</div>
));
};
Passing key
and creating dynamic layout
is where I am not able to figure out how can I achieve this, as this is totally new thing to me.
My UI is totally dynamic Every time I am going to get dynamic data so that much cards or divs I need to show.
Here is my code sand box what I am trying to do dynamically
Edit / Update
The answer I got from @Daniil Loban
is very helpfull, but when I am trying to loop with my real time data it is looping twice, That is hapenning because my data is little bit different of what I have shown here
Actually I am not able to understand I use data1.EmpData[l.i] to get data to display when I map layout.
this line.
My data
[
{
compId: 5,
company_name: "Info",
comp_data: [
{
empId: 1,
empName:"steve"
},
{
empId: 2,
empName:"meg"
}
]
},
{
compId: 6,
company_name: "wipro",
comp_data: [
{
empId: 11,
empName:"mark"
},
{
empId: 12,
empName:"Tnml"
}
]
}
]
- How data goes is like company->employ of that company->data of that company,
- So here company can be multiple employ can be multiple similarly for data
- What i have updated in previous data I have not mentioned the company as I thought of writing minimal code.
- I have added full code Now and Here is my code sandbox
The issue
Issue is it is repeating the data, I am getting duplicate data on display
I ll explain here like company namme->companydata->employe name
this should be the perfect but what is happening is -- companyname->the in one div both employ I a, getting and in other again I am getting both ones
It should be for Info
there are two employ so in one grid one employ and in other one the other employ.
The issue is in generateDOM
this function as layout is generated perfectly but in one Layout it is repeating all then same for others, if lenght is 3 then it is creating 3 layouts which is totally fine, but inside one layout it is agian looping and showing duplicate data
Here by I am attaching one image how it should show on UI
See Question&Answers more detail:
os