You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: src/content/reference/react-dom/components/index.md
+84-10Lines changed: 84 additions & 10 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -162,23 +162,97 @@ Similar to the [DOM standard,](https://developer.mozilla.org/en-US/docs/Web/API/
162
162
163
163
### Custom HTML elements {/*custom-html-elements*/}
164
164
165
-
If you render a tag with a dash, like `<my-element>`, React will assume you want to render a [custom HTML element.](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements) In React, rendering custom elements works differently from rendering built-in browser tags:
166
-
167
-
- All custom element props are serialized to strings and are always set using attributes.
168
-
- Custom elements accept `class` rather than `className`, and `for` rather than `htmlFor`.
165
+
If you render a tag with a dash, like `<my-element>`, React will assume you want to render a [custom HTML element.](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements)
169
166
170
167
If you render a built-in browser HTML element with an [`is`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/is) attribute, it will also be treated as a custom element.
171
168
172
-
<Note>
169
+
#### Setting values on custom elements {/*attributes-vs-properties*/}
170
+
171
+
Custom elements have two methods of passing data into them:
172
+
173
+
1) Attributes: Which are displayed in markup and can only be set to string values
174
+
2) Properties: Which are not displayed in markup and can be set to arbitrary JavaScript values
175
+
176
+
By default, React will pass values bound in JSX as attributes:
177
+
178
+
```jsx
179
+
<my-element value="Hello, world!"></my-element>
180
+
```
181
+
182
+
Non-string JavaScript values passed to custom elements will be serialized by default:
183
+
184
+
```jsx
185
+
// Will be passed as `"1,2,3"` as the output of `[1,2,3].toString()`
186
+
<my-element value={[1,2,3]}></my-element>
187
+
```
188
+
189
+
React will, however, recognize an custom element's property as one that it may pass arbitrary values to if the property name shows up on the class during construction:
190
+
191
+
```javascript {4-6}
192
+
classMyElementextendsHTMLElement {
193
+
constructor() {
194
+
super();
195
+
// The value here will be overwritten by React
196
+
// when initialized as an element
197
+
this.value=undefined;
198
+
}
173
199
174
-
[A future version of React will include more comprehensive support for custom elements.](https://github.com/facebook/react/issues/11347#issuecomment-1122275286)
200
+
connectedCallback() {
201
+
this.innerHTML=this.value.join(", ");
202
+
}
203
+
}
204
+
```
175
205
176
-
You can try it by upgrading React packages to the most recent experimental version:
206
+
#### Listening for events on custom elements {/*custom-element-events*/}
207
+
208
+
A common pattern when using custom elements is that they may dispatch [`CustomEvent`s](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent) rather than accept a function to call when an event occur:
Events are case-sensative and support dashes (`-`). Preserve the casing of the event and include all dashes when listening for custom element's events:
180
249
181
-
Experimental versions of React may contain bugs. Don't use them in production.
0 commit comments