@v4fire/client
Version:
V4Fire client core library
171 lines (124 loc) • 4.85 kB
Markdown
# super/i-block/modules/dom
Class provides helper methods to work with a component' DOM tree.
```js
this.dom.appendChild(parent, newEl);
```
## getId
Takes a string identifier and returns a new identifier that is connected to the component.
This method should use to generate id attributes for DOM nodes.
```
< b-input :id = getId('foo')
< label :for = getId('foo')
My label
```
## getComponent
Returns a component's instance from the specified element or CSS selector.
There are four scenarios of working the method:
1. You provide the root element of a component, and the method returns a component's instance from this element.
2. You provide not the root element, and the method returns a component's instance from the closest parent component's root element.
```js
console.log(this.dom.getComponent(someElement)?.componentName);
console.log(this.dom.getComponent(someElement, '.b-form')?.componentName);
```
3. You provide the root element of a component, and the method returns a component's instance from this element.
4. You provide not the root element, and the method returns a component's instance from the closest parent
component's root element.
```js
console.log(this.dom.getComponent('.foo')?.componentName);
console.log(this.dom.getComponent('.foo__bar', '.b-form')?.componentName);
```
## delegate
Wraps the specified function as an event handler with delegation.
```typescript
import iBlock, { component, watch } from 'super/i-block/i-block';
@component()
export default class bExample extends iBlock {
// Adding a listener via the `@watch` decorator
@watch({
path: '$el:click',
wrapper: (ctx, handler) => ctx.dom.delegate('[data-foo="baz"]', handler)
})
onClick(e: MouseEvent) {
console.log(e.delegateTarget);
}
mounted() {
this.$el.addEventListener('click', this.dom.delegate('[data-foo="bar"]', (e: MouseEvent) => {
// Always refers to the element to which we are delegating the handler
console.log(e.delegateTarget);
console.log(e.currentTarget === this.$el);
}))
}
}
```
## delegateElement
Wraps the specified function as an event handler with delegation of a component element.
```typescript
import iBlock, { component, watch } from 'super/i-block/i-block';
@component()
export default class bExample extends iBlock {
// Adding a listener via the `@watch` decorator
@watch({
path: '$el:click',
wrapper: (ctx, handler) => ctx.dom.delegateElement('user', handler)
})
onClick(e: MouseEvent) {
console.log(e.delegateTarget);
}
mounted() {
this.$el.addEventListener('click', this.dom.delegateElement('item', (e: MouseEvent) => {
// Always refers to the element to which we are delegating the handler
console.log(e.delegateTarget);
console.log(e.currentTarget === this.$el);
}))
}
}
```
## putInStream
Puts an element to the render stream.
The method forces rendering of the element (by default it uses the root component' element), i.e.,
you can check its geometry.
```js
this.dom.putInStream(() => {
console.log(this.$el.clientHeight);
});
this.dom.putInStream(this.$el.querySelector('.foo'), () => {
console.log(this.$el.clientHeight);
})
```
## appendChild
Appends a node to the specified parent.
The method returns a link to an `Async` worker that wraps the operation.
```js
const id = this.dom.appendChild(this.$el, document.createElement('button'));
this.async.terminateWorker(id);
```
## replaceWith
Replaces a component element with the specified node.
The method returns a link to an `Async` worker that wraps the operation.
```js
const id = this.dom.replaceWith(this.block.element('foo'), document.createElement('button'));
this.async.terminateWorker(id);
```
## localInView
A link to a component' `core/dom/in-view` instance.
## watchForIntersection
Watches for intersections of the specified element by using the `core/dom/in-view` module.
The method returns a link to an `Async` worker that wraps the operation.
You should prefer this method instead of raw `core/dom/in-view` to cancel the intersection observing
when the component is destroyed.
```js
const id = this.watchForIntersection(myElem, {delay: 200}, {group: 'inView'})
this.async.terminateWorker(id);
```
## watchForResize
Watches for size changes of the specified element by using the `core/dom/resize-observer` module.
The method returns a link to an `Async` worker that wraps the operation.
You should prefer this method instead of raw `core/dom/resize-observer` to cancel resize observing
when the component is destroyed.
```js
const id = this.watchForResize(myElem, {immediate: true}, {group: 'resize'})
this.async.terminateWorker(id);
```
## createBlockCtxFromNode
Creates a [[Block]] instance from the specified node and component instance.
Basically, you don't need to use this method.