I have used for
loop and given its value in the click function so I can get the seat number when the seat is clicked but I only get the last number of for loop on every seat click. can anyone tell me how to get the seat number of each seat?
API Data is
var seats = [
{ name: "Premium", seattotal: "15", cost: "250", id: "1" },
{ name: "Club", seattotal: "30", cost: "150", id: "2" },
{ name: "Diamond", seattotal: "25", cost: "170", id: "3" },
{ name: "Gold", seattotal: "20", cost: "170", id: "4" },
];
function handleClick(seatnumber, seatamount, seatname) {
alert(seatnumber " " count " " seatamount " "
seatname);
setIsActive((oldArray) => [...oldArray, seatnumber]);
setAmount((oldamt) => parseFloat(oldamt) parseFloat(seatamount));
if (selectseat.includes(seatname) === false) {
setSelectSeat((oldArray) => [...oldArray, seatname]);
}
console.log(isActive " " selectseat);
}
function seat(totalseat, seatcost, seatname) {
var seats = [];
for (var i = 1; i <= totalseat; i ) {
seats.push(
i % 5 ? (
<TouchableOpacity
key={i}
style={isActive == i ? styles.activeseat : styles.seat}
onPress={(event) => handleClick(i, seatcost, seatname)}
>
<Text style={{ fontSize: 10 }}>{i}</Text>
</TouchableOpacity>
) : (
<TouchableOpacity
key={i}
style={
isActive == i
? { ...styles.activeseat, marginRight: 30 }
: { ...styles.seat, marginRight: 30 }
}
onPress={(event) => handleClick(i, seatcost, seatname)}
>
<Text style={{ fontSize: 10 }}>{i}</Text>
</TouchableOpacity>
)
);
}
totalseat != 0
? seats.push(
<View
key={i}
style={{ backgroundColor: "white", height: 20, width:
"100%" }}
></View>
)
: "";
return seats;
}
const allseatui = Object.keys(seats).map((key) => {
const varseat = seat(
seats[key].seattotal,
seats[key].cost,
seats[key].name
);
if (seats[key].name != undefined) {
return (
<View key={seats[key].id}>
<Text style={{ margin: 12, fontSize: 14, color: "grey" }}>
{seats[key].name} Rs {seats[key].cost}
</Text>
<View
style={{
flexDirection: "row",
flexWrap: "wrap",
}}
>
{varseat}
</View>
</View>
);
}
});
CodePudding user response:
Issue
i
is declared as var
and gets mutated during the for-loop when populating the seats
array. Because it's a conventional for-loop there's only the single i
variable reference in scope that each onPress
handleClick
callback hander is accessing. On the final iteration i
is incremeneted once more and since it is now strictly greater than totalseat
the loop is exited. In other words, when totalseat
equals "20"
and the exit condition is i <= 20
there will be 20 iterations and i
will equal 21 when exiting.
Solution
Use the Array.prototype.map
function to map an array of length totalseat
to the JSX you want to save into the seats
array. The .map
callback will receive its own copy of the currently mapped index value.
const seats = Array(totalseat).fill().map((_, i) => (
<TouchableOpacity
key={i}
style={
...isActive === (i 1) ? styles.activeSeat : styles.seat,
...(i 1) % 5 ? {} : { marginRight: '30' }
}
style={isActive == i ? styles.activeseat : styles.seat}
onPress={() => handleClick(i 1, seatcost, seatname)}
>
<Text style={{ fontSize: 10 }}>{i 1}</Text>
</TouchableOpacity>
));
if (totalseat) { // any non-zero value is truthy
seats.push(
<View
key={totalseat 1}
style={{ backgroundColor: "white", height: 20, width:
"100%" }}
/>
);
}
return seats;