# hooked-elements
**Repository Path**: mirrors_WebReflection/hooked-elements
## Basic Information
- **Project Name**: hooked-elements
- **Description**: wickedElements 🧙 with render hooks
- **Primary Language**: Unknown
- **License**: ISC
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-08-19
- **Last Updated**: 2025-12-20
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# hookedElements 🪝
**Social Media Photo by [chuttersnap](https://unsplash.com/@chuttersnap) on [Unsplash](https://unsplash.com/)**
### 📣 Community Announcement
Please ask questions in the [dedicated discussions repository](https://github.com/WebReflection/discussions), to help the community around this project grow ♥
---
This module integrates [µhooks](https://github.com/WebReflection/uhooks#readme) in [wickedElements](https://github.com/WebReflection/wicked-elements#readme) for a *~2K* all-inclusive package and zero polyfills needed whatsoever.
The compatibility is the same as _wickedElements_, meaning IE11+ and other Desktop/Mobile browsers.
**[Live Demo](https://codepen.io/WebReflection/pen/JjdGjOM)**
```js
// define via callback to receives the element right away
import {define, useState} from 'hooked-elements';
define('button.counter', element => {
const [count, update] = useState(0);
element.onclick = () => update(count + 1);
element.textContent = `${count} clicks`;
});
```
The callback is used as `render` method and automatically augmented and invoked as soon as the element becomes _wicked_.
### In A Nutshell
All [hooks](https://github.com/WebReflection/augmentor#available-hooks) are available, and `useEffect` is granted to run *before* `disconnected`, if it returns a callback to drop the effect.
**[Live Demo](https://codepen.io/WebReflection/pen/mdJVERz)**
```js
// define via wickedElements literal, render auto-augmented
import {define, render, useEffect, useState} from 'hooked-elements';
define('button.counter', {
// if not provided, the init() is automatically defined as such:
init() {
// the render augment the current render method once
// and invokes it right away for the first time
// the element gets upgraded as "wicked"
render(this);
},
// all other wickedElements goodies are in too,
// and if there is an effect that returns a callback,
// that will always be invoked before `disconnected`
disconnected() {
console.log(this.element, 'disconnected');
},
// the render also receives an element, but you can always
// retrieve it via `const {element} = this;`
// please note the element is bound, so that any
// `this.render()` call will always automatically pass
// the component element too.
render(element) {
useEffect(() => {
console.log('FX on');
return () => console.log('FX off');
});
const [count, update] = useState(0);
element.onclick = () => update(count + 1);
element.textContent = `${count} clicks`;
}
});
```
## F.A.Q.
Can I use 3rd parts libraries to render content?
Sure thing! Following a µhtml integration example, also live in CodePen:
**[Live Demo](https://codepen.io/WebReflection/pen/poJyjGy)**
```js
import {render, html, svg} from 'uhtml';
import {define, useState} from 'hooked-elements';
// as mixin
const MicroHTML = {
html() { return render(this.element, html.apply(null, arguments)); },
svg() { return render(this.element, svg.apply(null, arguments)); }
};
define('button.counter', {
...MicroHTML,
render(element) {
const [count, update] = useState(1);
element.onclick = () => update(count + 1);
this.html`Hello 👋 ${count} times!`;
}
});
// or straight forward via callback and explicit render
define('my-counter', element => {
const [count, update] = useState(0);
render(element, html`
${count}
`);
});
```
How can I use hooks outside the render()?
While the `render()` is the only augmented callback, as hooks changes are usually reflected through the UI, you can compose hooks outside the `render` method, or assign their state without any issue within such method.
**[Live Demo](https://codepen.io/WebReflection/pen/JjdGKmL)**
```js
// define via wickedElements literal, render auto-augmented
import {define, useState} from 'hooked-elements';
define('button.counter', {
render(element) {
// assign the current counter state
this.countState = useState(0);
// use only what you need in here
const [count] = this.countState;
element.textContent = `${count} clicks`;
},
// handle clicks through such state
onClick() {
const [count, update] = this.countState;
update(count + 1);
}
});
```
Simply remember that a wicked component is unreachable, unless exposed otherwise, so that it's always safe to assign at runtime any property to it (it's just an object literal, after all 😉).