How can I detect prop changes in stencil, in angular is something like this:
But I don't know how is in stencil.
import { Component, Input, OnInit } from '@angular/core';
@Component({
selector: 'my-name',
template: `
<h2>First name: {{name}} ({{_name}})</h2>
`,
})
export class ChildComponent implements OnInit {
private _name: string;
constructor() {}
get name(): string {
// transform value for display
return this._name.toUpperCase();
}
@Input()
set name(name: string) {
console.log('prev value: ', this._name);
console.log('got name: ', name);
this._name = name;
}
ngOnInit() {
console.log('on init');
console.log(this._name);
}
}
I need to detect properties changes
Using Objects/Arrays as Props within Another Framework You just need to use the framework syntax and bind the component attributes to the relevant object/array. st-login is a Stencil component and you can find it's implementation here. In the code example I just bind the forgotPasswordUrl Prop using brackets.
Attribute Name ( attribute ) In Stencil, the @Prop() decorator applied to a property will instruct the Stencil compiler to also listen for changes in a DOM attribute. Usually, the name of a property is the same as the attribute, but this is not always the case.
Stencil is a compiler that generates Web Components (more specifically, Custom Elements). Stencil combines the best concepts of the most popular frameworks into a simple build-time tool.
Stencil is a React-inspired web component library. It is using the same JSX as React and some of the same concepts (Render function, props, state). However, Stencil differs as it compiles to an optimal bundle, creating Virtual DOM that is consolidated directly into the DOM itself (no VDOM to VDOM comparison).
You can use the @Watch
decorator on a method that will trigger when the property changed.
@Watch('name')
onNameChanged(newValue: string, oldValue: string) {
this._name = newValue;
}
Note on
@Watch
: this decorator only trigger on prop changed, it means theonNameChanged()
method won't be called the first time that prop is set. In order to intercept the first set, you have to use thecomponentWillLoad()
hook.componentWillLoad(){ this.onNameChanged(this.name); }
Working example:
import { Component, Prop, Watch } from '@stencil/core';
@Component({
tag: 'my-name'
})
export class ChildComponent {
private _name: string;
@Prop() name: string = '';
@Watch('name')
onNameChanged(name: string) {
console.log('prev value: ', this._name);
console.log('got name: ', name);
this._name = name.toUpperCase();
}
componentWillLoad(){
this.onNameChanged(this.name);
}
render() {
return (<h2>First name: {this.name} ({this._name})</h2>);
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With