stencil: new cheatsheet
This commit is contained in:
parent
072cbe5817
commit
2701208596
|
@ -0,0 +1,186 @@
|
||||||
|
---
|
||||||
|
title: Stencil
|
||||||
|
category: JavaScript libraries
|
||||||
|
layout: 2017/sheet
|
||||||
|
updated: 2017-10-11
|
||||||
|
intro: |
|
||||||
|
[Stencil](https://github.com/ionic-team/stencil) is a compiler for web components made by the Ionic team. This guide targets Stencil v0.0.5.
|
||||||
|
---
|
||||||
|
|
||||||
|
## Quick-start guide
|
||||||
|
{: .-three-column}
|
||||||
|
|
||||||
|
### Getting started
|
||||||
|
{: .-prime}
|
||||||
|
|
||||||
|
#### JavaScript
|
||||||
|
|
||||||
|
```js
|
||||||
|
import { Component, Prop, State } from '@stencil/core'
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
tag: 'my-component',
|
||||||
|
styleUrl: 'my-component.scss'
|
||||||
|
})
|
||||||
|
export class MyComponent {
|
||||||
|
@Prop() name: string
|
||||||
|
@State() isVisible: boolean = true
|
||||||
|
|
||||||
|
render () {
|
||||||
|
return <p>I am {this.name}!</p>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### HTML
|
||||||
|
|
||||||
|
```html
|
||||||
|
<my-component name='Groot' />
|
||||||
|
```
|
||||||
|
|
||||||
|
That's the same example in the [Readme](https://github.com/ionic-team/stencil), that's as simple as you can get!
|
||||||
|
|
||||||
|
### DOM events
|
||||||
|
|
||||||
|
```js
|
||||||
|
export class MyComponent {
|
||||||
|
render () {
|
||||||
|
return (
|
||||||
|
<input
|
||||||
|
onChange={(event: UIEvent) => this.inputChanged(event)}
|
||||||
|
/>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
inputChanged (event) {
|
||||||
|
console.log('input changed:', event.target.value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
{: data-line="5,10,11"}
|
||||||
|
|
||||||
|
Stencil uses DOM events.
|
||||||
|
|
||||||
|
See: [Handling user input](https://stenciljs.com/docs/templating/#handling-user-input)
|
||||||
|
|
||||||
|
### Multiple children
|
||||||
|
|
||||||
|
```js
|
||||||
|
render () {
|
||||||
|
return [
|
||||||
|
<h1>Hello there</h1>,
|
||||||
|
<p>This component returns multiple nodes</p>
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
{: data-line="3,4"}
|
||||||
|
|
||||||
|
`render()` can return an array of elements.
|
||||||
|
|
||||||
|
See: [Complex template content](https://stenciljs.com/docs/templating#complex-template-content)
|
||||||
|
|
||||||
|
## State
|
||||||
|
|
||||||
|
### Managing state
|
||||||
|
|
||||||
|
```js
|
||||||
|
export class MyComponent {
|
||||||
|
@State() isVisible: boolean
|
||||||
|
|
||||||
|
show () {
|
||||||
|
this.isVisible = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
{: data-line="4,5"}
|
||||||
|
|
||||||
|
Just do assignments. You can't do mutations tho, see later!
|
||||||
|
|
||||||
|
See: [Managing component state](https://stenciljs.com/docs/decorators#managing-component-state)
|
||||||
|
|
||||||
|
### Updating arrays and objects
|
||||||
|
|
||||||
|
```js
|
||||||
|
this.names = [
|
||||||
|
...this.names,
|
||||||
|
'Larry'
|
||||||
|
]
|
||||||
|
```
|
||||||
|
|
||||||
|
```js
|
||||||
|
this.options = {
|
||||||
|
...this.options,
|
||||||
|
visible: true
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Mutable operations such as `push()` won't work. You'll need to assign a new copy.
|
||||||
|
|
||||||
|
See: [Updating arrays](https://stenciljs.com/docs/handling-arrays)
|
||||||
|
|
||||||
|
## Slots
|
||||||
|
|
||||||
|
### Using slot
|
||||||
|
|
||||||
|
```html
|
||||||
|
<my-component>
|
||||||
|
<span>Hello, friends</span>
|
||||||
|
</my-component>
|
||||||
|
```
|
||||||
|
{: data-line="2"}
|
||||||
|
|
||||||
|
#### Component
|
||||||
|
|
||||||
|
```js
|
||||||
|
render() {
|
||||||
|
return <h1><slot /></h1>
|
||||||
|
}
|
||||||
|
```
|
||||||
|
{: data-line="2"}
|
||||||
|
|
||||||
|
You can pass JSX/HTML as child elements. Use the `slot` tag to use them inside your component.
|
||||||
|
|
||||||
|
See: [Slots](https://stenciljs.com/docs/templating#slots)
|
||||||
|
|
||||||
|
### Multiple slots
|
||||||
|
|
||||||
|
```html
|
||||||
|
<my-component>
|
||||||
|
<p slot='my-header'>Hello</p>
|
||||||
|
<p slot='my-footer'>Thanks</p>
|
||||||
|
</my-component>
|
||||||
|
```
|
||||||
|
{: data-line="2,3"}
|
||||||
|
|
||||||
|
#### Component
|
||||||
|
|
||||||
|
```js
|
||||||
|
render () {
|
||||||
|
return <div>
|
||||||
|
<header><slot name='my-header' /></header>
|
||||||
|
<footer><slot name='my-footer' /></footer>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
```
|
||||||
|
{: data-line="3,4"}
|
||||||
|
|
||||||
|
See: [Slots](https://stenciljs.com/docs/templating#slots)
|
||||||
|
|
||||||
|
## Lifecycle
|
||||||
|
|
||||||
|
| Event | Description |
|
||||||
|
| --- | --- |
|
||||||
|
| `componentWilLLoad()` | Before rendering |
|
||||||
|
| `componentDidLoad()` | After rendering |
|
||||||
|
| --- | --- |
|
||||||
|
| `componentWillUpdate()` | Before updating |
|
||||||
|
| `componentDidUpdate()` | After updating |
|
||||||
|
| --- | --- |
|
||||||
|
| `componentDidUnload()` | After unmounting |
|
||||||
|
|
||||||
|
See: [Component lifecycle](https://stenciljs.com/docs/component-lifecycle)
|
||||||
|
|
||||||
|
## References
|
||||||
|
|
||||||
|
- [Stencil docs](https://stenciljs.com/docs/) _(stenciljs.com)_
|
Loading…
Reference in New Issue