I'm building a count down in lit, and there is no HTML attributes (count, width, color, colorback, display) values unless adding timeout to constructor:
JS:
import { LitElement, html } from "lit";
class ProgressBar extends LitElement {
static get properties() {
return {
count: { type: Number },
width: { type: Number },
color: { type: String },
colorback: { type: String },
display: { type: String },
};
}
render() {
let output = "";
if (this.display === "true") {
output = html`
<style>
:host > div {
background-color: ${this.colorback};
width: 100%;
}
:host > div > div {
background-color: ${this.color};
width: ${this.width}%;
height: 30px;
}
</style>
<div>
<div></div>
</div>
`;
}
return output;
}
draw() {
let self = this;
let x = self._date_end - +new Date();
self.width = (x * 100) / self.count;
if (self.width > 0) {
window.setTimeout(function () {
self.draw();
}, 1000 / 60);
} else self.width = 0;
}
main() {
let self = this;
self._date_end = new Date(+new Date() + self.count);
self.draw();
}
constructor() {
super();
let self = this;
// working
window.setTimeout(function () {
self.main();
}, 1000);
// not working
self.main();
}
}
window.customElements.define("progress-bar", ProgressBar);
HTML:
<!DOCTYPE html>
<html>
<head> </head>
<body>
<progress-bar
display="true"
width="100"
color="#4cAf50"
colorback="#ddd"
count="5000"
>
</progress-bar>
<script src="main.js"></script>
</body>
</html>
How to deal with it? Thank you
Using connectedCallback method works fine:
connectedCallback()
{
super.connectedCallback()
this.main()
}
constructor()
{
super()
}
https://lit.dev/docs/components/lifecycle/#connectedcallback