diff --git a/Alpine.js DOCS.md b/Alpine.js DOCS.md index 659b115..e38b372 100644 --- a/Alpine.js DOCS.md +++ b/Alpine.js DOCS.md @@ -703,4 +703,119 @@ Alpine also offers a hook that you can use to execute code AFTER it's done initi document.addEventListener('alpine:initialized', () => { // }) -``` \ No newline at end of file +``` + +----- +# Directives +# x-data + +Everything in Alpine starts with the `x-data` directive. + +`x-data` defines a chunk of HTML as an Alpine component and provides the reactive data for that component to reference. + +Here's an example of a contrived dropdown component: + +```html +
+   +
Content...
+
+``` + +Don't worry about the other directives in this example (`@click` and `x-show`), we'll get to those in a bit. For now, let's focus on `x-data`. + +## Scope + +Properties defined in an `x-data` directive are available to all element children. Even ones inside other, nested `x-data` components. + +For example: + +```html +
+   +
+   +
+ +
+
+
+``` + +## Methods + +Because `x-data` is evaluated as a normal JavaScript object, in addition to state, you can store methods and even getters. + +For example, let's extract the "Toggle Content" behavior into a method on `x-data`. + +``` +
 
Content...
+``` + +Notice the added `toggle() { this.open = ! this.open }` method on `x-data`. This method can now be called from anywhere inside the component. + +You'll also notice the usage of `this.` to access state on the object itself. This is because Alpine evaluates this data object like any standard JavaScript object with a `this` context. + +If you prefer, you can leave the calling parenthesis off of the `toggle` method completely. For example: + +``` +  +``` + +## [Getters](https://alpinejs.dev/directives/data#getters) + +JavaScript [getters](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get) are handy when the sole purpose of a method is to return data based on other state. + +Think of them like "computed properties" (although, they are not cached like Vue's computed properties). + +Let's refactor our component to use a getter called `isOpen` instead of accessing `open` directly. + +``` +
 
Content...
+``` + +Notice the "Content" now depends on the `isOpen` getter instead of the `open` property directly. + +In this case there is no tangible benefit. But in some cases, getters are helpful for providing a more expressive syntax in your components. + +## [Data-less components](https://alpinejs.dev/directives/data#data-less-components) + +Occasionally, you want to create an Alpine component, but you don't need any data. + +In these cases, you can always pass in an empty object. + +``` +
+``` + +However, if you wish, you can also eliminate the attribute value entirely if it looks better to you. + +``` +
+``` + +## [Single-element components](https://alpinejs.dev/directives/data#single-element-components) + +Sometimes you may only have a single element inside your Alpine component, like the following: + +``` +
+``` + +In these cases, you can declare `x-data` directly on that single element: + +``` + +``` + +## [Re-usable Data](https://alpinejs.dev/directives/data#re-usable-data) + +If you find yourself duplicating the contents of `x-data`, or you find the inline syntax verbose, you can extract the `x-data` object out to a dedicated component using `Alpine.data`. + +Here's a quick example: + +``` +
 
Content...
  +``` + +[→ Read more about `Alpine.data(...)`](https://alpinejs.dev/globals/alpine-data) \ No newline at end of file