# Alpine.js
Handling browser state.
## Properties: Alpine.js behavior
- Does not fetch data from server. Only [HTMX](htmx.md) does.
- State's father is `x-data`. Keep the scope within one html file.
- Event driven. `$dispatch('event-name')` to dispatch. `@htmx:after-request` to listen.
## Workflow: Creating global components
1. Create ./static/js/*componentName*.js:
```js
document.addEventListener('alpine:init', () => {
Alpine.data('componentName', () => ({
count: 0,
increment() { this.count++ }
}));
});
```
2. Customize as needed:
3. Load into base: ``
4. Use `x-data="componentName"` to invoke:
```html
```
## Properties: Insides of `Alpine.data('componentName', () => ({ ... }))`
- Variables: `count: 0`
- Methods: `increment() { this.count++ }`
- The constructor: `init() {console.log('hello!')}`
## Properties: Magics
- `$refs`: Accesses DOM elements marked with `x-ref`.
- `$el`: References the current element where the expression is executed.
- `$dispatch`: Fires custom browser events that can bubble up.
- `$nextTick`: Executes code only after Alpine has finished updating the DOM.
- `$watch`: Monitors changes to a specific data property.
## Workflow: Using $refs to access DOM elements directly:
1. Select the target element inside an `x-data` scope.
2. Assign a reference name using the `x-ref="name"` attribute.
3. Call the element using $refs.name within your Alpine expressions.
4. Perform standard DOM operations like .focus(), .scrollIntoView(), or .innerHTML = ''.