Skip to main content

handle amenity change and checkbox in rent app

 

I’ll explain only the Checkbox part and handleAmenityChange step-by-step in a simple + beginner-friendly way.


1️⃣ Amenities state (important to understand first)

amenities: [] as string[]

This means:

  • amenities is an array of strings

  • It will store selected amenities like:

["wifi", "parking", "gym"]

2️⃣ Amenities list (source of checkboxes)

const amenitiesList = ['wifi', 'parking', 'kitchen', 'tv', 'gym', 'pool', 'laundry'];

This array is used to:

  • loop

  • create one checkbox per amenity


3️⃣ Checkbox UI part (main focus)

{amenitiesList.map((amenity) => ( <div key={amenity} className="flex items-center space-x-2"> <Checkbox id={amenity} checked={formData.amenities.includes(amenity)} onCheckedChange={(checked) => handleAmenityChange(amenity, checked as boolean) } /> <Label htmlFor={amenity} className="text-sm capitalize"> {amenity === 'wifi' ? 'WIFI' : amenity} </Label> </div> ))}

🔹 What is happening here?

1. .map() creates multiple checkboxes

For each item in amenitiesList, a checkbox is created.

Example:

  • wifi → checkbox

  • parking → checkbox

  • gym → checkbox


2. checked={formData.amenities.includes(amenity)}

This line decides:
👉 Is the checkbox checked or not?

Example:

formData.amenities = ["wifi", "gym"];
  • wifi → ✅ checked

  • gym → ✅ checked

  • parking → ❌ unchecked

Because:

["wifi", "gym"].includes("wifi") // true

3. onCheckedChange

onCheckedChange={(checked) => handleAmenityChange(amenity, checked as boolean) }
  • Runs whenever checkbox is clicked

  • checked is:

    • true → checkbox selected

    • false → checkbox unselected

We pass:

  • amenity"wifi"

  • checkedtrue / false


4️⃣ handleAmenityChange function (core logic)

const handleAmenityChange = (amenity: string, checked: boolean) => { if (checked) { setFormData(prev => ({ ...prev, amenities: [...prev.amenities, amenity] })); } else { setFormData(prev => ({ ...prev, amenities: prev.amenities.filter(a => a !== amenity) })); } };

🔹 Case 1: Checkbox is CHECKED ✅

Example: user checks wifi

checked === true

This runs:

amenities: [...prev.amenities, amenity]

If before:

amenities = ["parking"]

After:

amenities = ["parking", "wifi"]

👉 Adds amenity to array


🔹 Case 2: Checkbox is UNCHECKED ❌

Example: user unchecks wifi

checked === false

This runs:

amenities: prev.amenities.filter(a => a !== amenity)

If before:

amenities = ["wifi", "gym"]

After:

amenities = ["gym"]

👉 Removes amenity from array


5️⃣ Why this approach is GOOD ✅

✔ Controlled component
✔ React state is always source of truth
✔ Easy to send amenities to backend
✔ No duplicate values
✔ Beginner + production friendly


6️⃣ Final flow in simple words 🧠

  1. User clicks checkbox

  2. onCheckedChange fires

  3. handleAmenityChange() runs

  4. If checked → add amenity

  5. If unchecked → remove amenity

  6. UI updates automatically

Comments

Popular posts from this blog

Tailwind css and its corresponding vanilla css

Tailwind Class CSS Property Vanilla CSS Equivalent Description bg-white background-color background-color: #ffffff; Sets background color to white. shadow-sm box-shadow box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); Adds a small shadow under the element. border-b border-bottom-width border-bottom-width: 1px; Adds a bottom border. Default color: #e5e7eb (gray-200). max-w-7xl max-width max-width: 80rem; /* 1280px */ Restricts container width for large screens. mx-auto margin-left , margin-right margin-left: auto; margin-right: auto; Centers the container horizontally. px-4 padding-left , padding-right padding-left: 1rem; padding-right: 1rem; Adds horizontal padding (16px). sm:px-6 Responsive padding (small screens ≥640px) @media (min-width: 640px) { padding-left: 1.5rem; padding-right: 1.5rem; } Increases padding on small screens. lg:px-8 Responsive padding (large screens ≥1024px) @media (min-width: 1024px) { padding-left: 2rem; paddi...

Rest and spread operator in javascript

  Absolutely 👍 — here are several practical and clear examples of the rest operator ( ... ) in JavaScript, covering functions, arrays, and objects 👇 🧮 1. Rest in Function Parameters When you don’t know how many arguments a function will receive: function multiply ( factor, ...numbers ) { return numbers. map ( n => n * factor); } console . log ( multiply ( 2 , 1 , 2 , 3 , 4 )); // Output: [2, 4, 6, 8] 👉 factor gets the first argument ( 2 ), and ...numbers collects the rest into an array [1, 2, 3, 4] . 🧑‍🤝‍🧑 2. Rest with Array Destructuring You can collect remaining array elements into a variable: const fruits = [ "apple" , "banana" , "mango" , "orange" ]; const [first, second, ...others] = fruits; console . log (first); // "apple" console . log (second); // "banana" console . log (others); // ["mango", "orange"] 👉 The rest operator gathers all remaining elements afte...

Role of box-sizing and its attributes in css

  🧱 Default behavior (content-box) By default, browsers use: box-sizing : content-box; This means: Total element width = content width + padding + border So if you have: .container { width : 300px ; padding : 20px ; border : 5px solid black; } Then the total visible width becomes: 300 (content) + 40 ( left + right padding) + 10 ( left + right border) = 350 px ⚠️ The box becomes wider than 300px , which can cause overflow or layout shifts. ✅ With box-sizing: border-box When you use: box-sizing : border-box; the formula changes to: Total element width = width (including padding + border) So the same CSS now behaves like this: width = 300 px (total) → content area = 300 - ( 40 padding + 10 border) = 250 px ✅ The box stays exactly 300px wide — no overflow. 🎯 Why it’s useful Prevents unexpected overflow due to padding/borders Makes responsive layouts easier Keeps your box sizes consistent You can trust width to be the actu...