Practice and reinforce the concepts from Lesson 7
{#if}, {:else}, {:else if}) in Svelte{#each} loopsTotal Activity Time: 90 minutes
💡 Tip Save your work frequently by copying your code to a text editor - the Svelte REPL doesn't auto-save!
Time: 15 minutes | Difficulty: Easy
Objective: Make the output display "Surprise! 🥳" when the boxOpen prop is called in the App.svelte file.
Steps:
Box.svelte by clicking the + buttonBox.svelte, export a boxOpen prop\{#if\} and \{:else\} statements to show different messagesApp.svelte, import the Box componentboxOpen=\{true\} to see the surprise message💡 Tip Remember that in Svelte, props are exported using
export let propName;in the child component.
Box.svelte:
<script>
export let boxOpen;
</script>
{#if boxOpen}
<p>Surprise! 🥳</p>
{:else}
<p>Please open the box 🎁</p>
{/if}
App.svelte:
<script>
import Box from './Box.svelte';
</script>
<Box boxOpen={true} />
Before:

After:

Time: 15 minutes | Difficulty: Easy
Objective: Make the output display "Clicked" when the "Click Me" button is clicked.
Steps:
btn with initial value \{clicked: false\}click() function that toggles the clicked state\{#if\} statement to show different button text based on stateon:click💡 Tip To toggle a boolean value, use the NOT operator:
!btn.clickedwill flip between true and false.
App.svelte:
<script>
let btn = {clicked: false};
function click() {
btn.clicked = !btn.clicked;
}
</script>
{#if btn.clicked}
<button on:click={click}>
Clicked
</button>
{:else}
<button on:click={click}>
Click Me
</button>
{/if}
Before:

After:

Time: 20 minutes | Difficulty: Medium
Objective: Make the output display colors accordingly when the color name is typed in the text input.
Steps:
Color.svelte with an exported color propbind:value=\{color\} in Color.svelte\{#if\}, \{:else if\}, \{:else\})💡 Tip Use
bind:for two-way data binding between components. In the parent:<Color bind:color=\{color\} />
Color.svelte:
<script>
export let color;
</script>
<h3>Choose a color (red/blue/green)</h3>
<input type="text" placeholder="red/blue/green" bind:value={color}>
App.svelte:
<script>
import Color from './Color.svelte';
let color = "";
</script>
<Color bind:color={color} />
{#if color === 'green'}
<p>Green 🟩</p>
{:else if color === 'blue'}
<p>Blue 🟦</p>
{:else if color === 'red'}
<p>Red 🟥</p>
{:else}
<p>No color chosen yet</p>
{/if}
Before:

After:



Time: 20 minutes | Difficulty: Medium
Objective: Make the output display student names, heights, and weights using loop and array.
Steps:
students with at least 5 student objectsname, height, and weight properties\{#each students as student\} to loop through the array💡 Tip The
\{#each\}loop syntax is:\{#each arrayName as itemName\}...content...\{/each\}. You can access properties using dot notation like\{student.name\}.
\{#each array as item\}...\{/each\} to loop through arrays)App.svelte:
<script>
let students = [
{name:"Alice", height:165, weight:55},
{name:"Bob", height:175, weight:70},
{name:"Charlie", height:160, weight:60},
{name:"Diana", height:170, weight:58},
{name:"Eve", height:168, weight:65}
]
</script>
<h1 class="text-center">Telebort Prog E Monday 2PM</h1>
<h5>Teacher: </h5>
<p>Teacher John</p>
<h5>Students:</h5>
<table class="table table-bordered">
<thead class="thead-dark">
<tr>
<th>Name</th>
<th>Height (cm)</th>
<th>Weight (kg)</th>
</tr>
</thead>
{#each students as student}
<tr>
<td>{student.name}</td>
<td>{student.height}</td>
<td>{student.weight}</td>
</tr>
{/each}
</table>
<style>
@import url("https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css");
</style>

Time: 20 minutes | Difficulty: Hard
Objective: Create a BMI calculator that calculates BMI and displays weight status based on BMI ranges.
BMI Range Table:
| BMI Range | Weight Status |
|---|---|
| Below 18.6 | Underweight |
| 18.6 - 24.9 | Normal |
| 24.9 and above | Overweight |
Steps:
Details.svelte component with three input fields:
bind: to connect inputs between parent and child componentscalculateBMI() function that:
💡 Tip Common Challenges
(height * height) / 10000.toFixed(2) to round BMI to 2 decimal placesDetails.svelte:
<script>
export let name;
export let height;
export let weight;
</script>
<div>
<label>Name:</label>
<input type="text" bind:value={name}>
<label>Height (cm):</label>
<input type="number" bind:value={height}>
<label>Weight (kg):</label>
<input type="number" bind:value={weight}>
</div>
App.svelte:
<script>
import Details from './Details.svelte';
let name = '';
let height = 0;
let weight = 0;
let showResult = false;
let bmi = 0;
let status = '';
function calculateBMI() {
if (!name || !height || !weight) {
alert('Please fill in all details');
return;
}
bmi = (weight / ((height * height) / 10000)).toFixed(2);
if (bmi < 18.6) {
status = 'Underweight';
} else if (bmi < 24.9) {
status = 'Normal';
} else {
status = 'Overweight';
}
alert(`Your BMI is ${bmi}`);
showResult = true;
}
</script>
<Details bind:name={name} bind:height={height} bind:weight={weight} />
<button on:click={calculateBMI}>Calculate BMI</button>
{#if showResult}
<div>
<h3>Results for {name}:</h3>
<p>BMI: {bmi}</p>
<p>Status: {status}</p>
</div>
{/if}
Before the details are entered:

If the details are not filled yet but the Calculate BMI button is clicked:

When the Calculate BMI button is clicked after the details are entered:

After the alert of the BMI value comes out:

Make sure your Svelte Logic projects include:
{#if} and {:else} statements ✓{:else if} statements ✓{#each} loops with object properties ✓{#if condition}...{:else}...{/if}{#each array as item}...{/each}{:else if condition} between {#if} and {:else}!variable to flip true/false valuesexport let in child and bind: in parent"Cannot read property of undefined"
Two-way binding not working
bind: not just passing propsConditional logic not updating
obj = {...obj, property: newValue}⚠️ Important Submission Instructions
- Complete ALL 5 activities before submitting
- Test each activity thoroughly:
- Activity One: Both true and false states work
- Activity 2: Button toggles correctly
- Activity 3: All three colors display properly
- Activity 4: Table shows all student data
- Activity 5: BMI calculates and shows correct status
- Copy your final code to a safe place - REPL doesn't save automatically!
ℹ️ Need Help? Watch the code review video for solutions and explanations: Code Review: