mirror of
https://github.com/yewstack/yew.git
synced 2025-12-08 21:26:25 +00:00
* change suffixes from md to mdx fix broken links for English locale tree shake and update docusaurus add docusaurus ideal image plugin use svg and themed image delete unused static asset * move localized landing page * change GitLocalize project page * nit pick * remove ignore to have the block checked
231 lines
5.9 KiB
Plaintext
231 lines
5.9 KiB
Plaintext
---
|
|
title: "HTML"
|
|
sidebar_label: Introduction
|
|
description: "The procedural macro for generating HTML and SVG"
|
|
---
|
|
|
|
import Tabs from '@theme/Tabs';
|
|
import TabItem from '@theme/TabItem';
|
|
|
|
The `html!` macro allows you to write HTML and SVG code declaratively. It is similar to JSX
|
|
\(an extension to JavaScript which allows you to write HTML-like code inside of JavaScript\).
|
|
|
|
**Important notes**
|
|
|
|
1. The `html!` macro only accepts one root html node \(you can counteract this by
|
|
[using fragments or iterators](./../html/lists.mdx)\)
|
|
2. An empty `html! {}` invocation is valid and will not render anything
|
|
3. Literals must always be quoted and wrapped in braces: `html! { "Hello, World" }`
|
|
|
|
:::note
|
|
The `html!` macro can reach the default recursion limit of the compiler. If you encounter compilation errors, add an attribute like `#![recursion_limit="1024"]` in the crate root to overcome the problem.
|
|
:::
|
|
|
|
## Tag Structure
|
|
|
|
Tags are based on HTML tags. Components, Elements, and Lists are all based on this tag syntax.
|
|
|
|
Tags must either self-close `<... />` or have a corresponding end tag for each start tag.
|
|
|
|
<Tabs>
|
|
<TabItem value="Open - Close" label="Open - Close" default>
|
|
|
|
```rust
|
|
use yew::html;
|
|
|
|
html! {
|
|
<div id="my_div"></div>
|
|
};
|
|
```
|
|
|
|
</TabItem>
|
|
<TabItem value="Invalid" label="Invalid">
|
|
|
|
```rust ,compile_fail
|
|
use yew::html;
|
|
|
|
html! {
|
|
<div id="my_div"> // <- MISSING CLOSE TAG
|
|
};
|
|
```
|
|
|
|
</TabItem>
|
|
</Tabs>
|
|
|
|
<Tabs>
|
|
<TabItem value="Self-closing" label="Self-closing">
|
|
|
|
```rust
|
|
use yew::html;
|
|
|
|
html! {
|
|
<input id="my_input" />
|
|
};
|
|
```
|
|
|
|
</TabItem>
|
|
<TabItem value="Invalid" label="Invalid">
|
|
|
|
```rust ,compile_fail
|
|
use yew::html;
|
|
|
|
html! {
|
|
<input id="my_input"> // <- MISSING SELF-CLOSE
|
|
};
|
|
```
|
|
|
|
</TabItem>
|
|
</Tabs>
|
|
|
|
:::tip
|
|
For convenience, elements which _usually_ require a closing tag are **allowed** to self-close. For example, writing `html! { <div class="placeholder" /> }` is valid.
|
|
:::
|
|
|
|
## Children
|
|
|
|
Create complex nested HTML and SVG layouts with ease:
|
|
|
|
<Tabs>
|
|
<TabItem value="HTML" label="HTML">
|
|
|
|
```rust
|
|
use yew::html;
|
|
|
|
html! {
|
|
<div>
|
|
<div data-key="abc"></div>
|
|
<div class="parent">
|
|
<span class="child" value="anything"></span>
|
|
<label for="first-name">{ "First Name" }</label>
|
|
<input type="text" id="first-name" value="placeholder" />
|
|
<input type="checkbox" checked=true />
|
|
<textarea value="write a story" />
|
|
<select name="status">
|
|
<option selected=true disabled=false value="">{ "Selected" }</option>
|
|
<option selected=false disabled=true value="">{ "Unselected" }</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
};
|
|
```
|
|
|
|
</TabItem>
|
|
<TabItem value="SVG" label="SVG">
|
|
|
|
```rust
|
|
use yew::html;
|
|
|
|
html! {
|
|
<svg width="149" height="147" viewBox="0 0 149 147" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path d="M60.5776 13.8268L51.8673 42.6431L77.7475 37.331L60.5776 13.8268Z" fill="#DEB819"/>
|
|
<path d="M108.361 94.9937L138.708 90.686L115.342 69.8642" stroke="black" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
|
|
<g filter="url(#filter0_d)">
|
|
<circle cx="75.3326" cy="73.4918" r="55" fill="#FDD630"/>
|
|
<circle cx="75.3326" cy="73.4918" r="52.5" stroke="black" stroke-width="5"/>
|
|
</g>
|
|
<circle cx="71" cy="99" r="5" fill="white" fill-opacity="0.75" stroke="black" stroke-width="3"/>
|
|
<defs>
|
|
<filter id="filter0_d" x="16.3326" y="18.4918" width="118" height="118" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
|
<feGaussianBlur stdDeviation="2"/>
|
|
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"/>
|
|
</filter>
|
|
</defs>
|
|
</svg>
|
|
};
|
|
```
|
|
|
|
</TabItem>
|
|
</Tabs>
|
|
|
|
## Lints
|
|
|
|
If you compile Yew using a nightly version of the Rust compiler, the macro will warn you about some
|
|
common pitfalls that you might run into. Of course, you may need to use the stable compiler (e.g.
|
|
your organization might have a policy mandating it) for release builds, but even if you're using a
|
|
stable toolchain, running `cargo +nightly check` might flag some ways that you could improve your
|
|
HTML code.
|
|
|
|
At the moment the lints are mostly accessibility-related. If you have ideas for lints, please feel
|
|
free to [chime in on this issue](https://github.com/yewstack/yew/issues/1334).
|
|
|
|
## Special properties
|
|
|
|
There are special properties which don't directly influence the DOM but instead act as instructions to Yew's virtual DOM.
|
|
Currently, there are two such special props: `ref` and `key`.
|
|
|
|
`ref` allows you to access and manipulate the underlying DOM node directly. See [Refs](../components/refs) for more details.
|
|
|
|
`key` on the other hand gives an element a unique identifier which Yew can use for optimization purposes.
|
|
|
|
:::important
|
|
The documentation for keys is yet to be written. See [#1263](https://github.com/yewstack/yew/issues/1263).
|
|
|
|
For now, use keys when you have a list where the order of elements changes. This includes inserting or removing elements from anywhere but the end of the list.
|
|
:::
|
|
|
|
## If blocks
|
|
|
|
To conditionally render some markup, we wrap it in an `if` block:
|
|
|
|
<Tabs>
|
|
<TabItem value="if" label="if">
|
|
|
|
```rust
|
|
use yew::html;
|
|
|
|
html! {
|
|
if true {
|
|
<p>{ "True case" }</p>
|
|
}
|
|
};
|
|
```
|
|
|
|
</TabItem>
|
|
<TabItem value="if - else" label="if - else">
|
|
|
|
```rust
|
|
use yew::html;
|
|
let some_condition = true;
|
|
|
|
html! {
|
|
if false {
|
|
<p>{ "True case" }</p>
|
|
} else {
|
|
<p>{ "False case" }</p>
|
|
}
|
|
};
|
|
```
|
|
|
|
</TabItem>
|
|
<TabItem value="if let" label="if let">
|
|
|
|
```rust
|
|
use yew::html;
|
|
let some_text = Some("text");
|
|
|
|
html! {
|
|
if let Some(text) = some_text {
|
|
<p>{ text }</p>
|
|
}
|
|
};
|
|
```
|
|
|
|
</TabItem>
|
|
<TabItem value="if let else" label="if let else">
|
|
|
|
```rust
|
|
use yew::html;
|
|
let some_text = Some("text");
|
|
|
|
html! {
|
|
if let Some(text) = some_text {
|
|
<p>{ text }</p>
|
|
} else {
|
|
<p>{ "False case" }</p>
|
|
}
|
|
};
|
|
```
|
|
|
|
</TabItem>
|
|
</Tabs>
|