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>
);
}
with entry {
# 1. Basic HTML element with text
let basic_element = <div>Hello World</div>;
print("Basic element:", basic_element);
# 2. Element with attributes
let with_attrs = <div class="container" id="main">Content</div>;
print("With attributes:", with_attrs);
# 3. Self-closing element
let self_closing = <img src="image.jpg" alt="Description" />;
print("Self-closing:", self_closing);
# 4. Nested elements
let nested = (
<div>
<h1>Title</h1>
<p>Paragraph text</p>
</div>
);
print("Nested elements:", nested);
# 5. Elements with expression attributes
let name = "user123";
let age = 25;
let user_element = <div id={name} data-age={age}>User Info</div>;
print("Expression attributes:", user_element);
# 6. Elements with expression children
let count = 42;
let with_expr_child = <div>Count: {count}</div>;
print("Expression children:", with_expr_child);
# 7. Component usage (capitalized names)
let button = <Button text="Click Me" onclick="handleClick()" />;
print("Component:", button);
# 8. Spread attributes
let props = {"class": "btn", "type": "submit"};
let with_spread = <button {...props}>Submit</button>;
print("Spread attributes:", with_spread);
# 9. Mixed attributes and spread
let base_props = {"class": "card"};
let card = <Card {...base_props} title="Welcome" content="Hello!" className="custom" />;
print("Mixed spread:", card);
# 10. Complex nested structure
let 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>
);
print("Complex structure:", app);
# 11. Fragment (no tag name)
let fragment = (
<>
<div>First</div>
<div>Second</div>
</>
);
print("Fragment:", fragment);
# 12. Dynamic list rendering
let items = ["Apple", "Banana", "Cherry"];
let list_items = [(<li key={i}>{item}</li>) for (i, item) in enumerate(items)];
let list_element = <ul>{list_items}</ul>;
print("Dynamic list:", list_element);
# 13. Conditional rendering with expressions
let is_logged_in = True;
let user_name = "Alice";
let greeting = <div>{ f"Welcome, {user_name}!" if is_logged_in else "Please log in" }</div>;
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 |
|
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.