JSX Elements#
Code Example
Runnable Example in Jac and JacLib
# JSX Elements with Contextual Lexing
# Demonstrates various JSX features supported in Jac
# Simple component function that returns JSX
def Button(text: str, onclick: str) -> dict {
return <button
onclick={onclick}
>
{text}
</button>;
}
# Component with multiple props
def Card(
title: str, content: str, className: str
) -> dict {
return (
<div
class={className}
>
<h2>
{title}
</h2>
<p>
{content}
</p>
</div>
);
}
# 1. Basic HTML element with text
glob basic_element = <div>
Hello World
</div>;
with entry {
print("Basic element:", basic_element);
}
# 2. Element with attributes
glob with_attrs = <div
class="container"
id="main"
>
Content
</div>;
with entry {
print("With attributes:", with_attrs);
}
# 3. Self-closing element
glob self_closing = <img
src="image.jpg"
alt="Description"
/>;
with entry {
print("Self-closing:", self_closing);
}
# 4. Nested elements
glob nested = (
<div>
<h1>
Title
</h1>
<p>
Paragraph text
</p>
</div>
);
with entry {
print("Nested elements:", nested);
}
# 5. Elements with expression attributes
glob name = "user123",
age = 25,
user_element = <div
id={name}
data-age={age}
>
User Info
</div>;
with entry {
print("Expression attributes:", user_element);
}
# 6. Elements with expression children
glob count = 42,
with_expr_child = <div>
Count: {count}
</div>;
with entry {
print("Expression children:", with_expr_child);
}
# 7. Component usage (capitalized names)
glob button = <Button
text="Click Me"
onclick="handleClick()"
/>;
with entry {
print("Component:", button);
}
# 8. Spread attributes
glob props = {"class": "btn", "type": "submit"},
with_spread = <button
{...props}
>
Submit
</button>;
with entry {
print("Spread attributes:", with_spread);
}
# 9. Mixed attributes and spread
glob base_props = {"class": "card"},
card = <Card
{...base_props}
title="Welcome"
content="Hello!"
className="custom"
/>;
with entry {
print("Mixed spread:", card);
}
# 10. Complex nested structure
glob app = (
<div class="app">
<header>
<h1>
My App
</h1>
<nav>
<a href="/home">
Home
</a>
<a href="/about">
About
</a>
</nav>
</header>
<main>
<Card
title="Card 1"
content="First card"
className="card-primary"
/>
<Card
title="Card 2"
content="Second card"
className="card-secondary"
/>
</main>
<footer>
<p>
Footer text
</p>
</footer>
</div>
);
with entry {
print("Complex structure:", app);
}
# 11. Fragment (no tag name)
glob fragment = (
<>
<div>
First
</div>
<div>
Second
</div>
</>
);
with entry {
print("Fragment:", fragment);
}
# 12. Dynamic list rendering
glob items = ["Apple", "Banana", "Cherry"],
list_items = [
(
<li
key={i}
>
{item}
</li>
) for (i, item) in enumerate(items)
],
list_element = <ul>
{list_items}
</ul>;
with entry {
print("Dynamic list:", list_element);
}
# 13. Conditional rendering with expressions
glob is_logged_in = True,
user_name = "Alice",
greeting = <div>
{f"Welcome, {user_name}!" if is_logged_in else "Please log in"}
</div>;
with entry {
print("Conditional:", greeting);
print("\nAll JSX examples completed successfully!");
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 | |
Jac Grammar Snippet
Description
JSX elements with contextual lexing allow embedding HTML-like syntax within Jac code.
Basic JSX Elements
JSX (JavaScript XML) syntax in Jac enables writing UI elements in a familiar HTML-like format. The lexer uses contextual lexing to switch between regular Jac syntax and JSX syntax seamlessly.
Key Features
- Self-closing tags:
<Component /> - Nested elements:
<Parent><Child /></Parent> - Attributes with values:
<div prop="value" /> - Dynamic content interpolation
This feature enables more expressive and readable code when working with UI components or templating.