Use the power of a JavaScript framework right in your HTML file!!
Tags: webdev, javascript, html, tutorial
Published: 2022-06-19 07:01:58


> _frameworks are overrated, let's use HTML!_

## Intro

Jokes apart, this blog is about ~~yet another javascript framework~~ but with a twist, you don't have to make those `.js` files to use it, it integrates right with your HTML! ;)

Curious? I'm talking about [alpineJS](https://alpinejs.dev/) here! Alpine's creator [Caleb](https://twitter.com/calebporzio) says - _"I hope you find Alpine to be a breath of fresh air. Silence among noise."_ AlpineJS is made to provide a simple, lightweight and powerful javascript framework to developers.

AlpineJS can be used using CDN or by installing the NPM package, but in this blog we'll be talking about only the CDN method as our goal is to use it with our HTML file. Let's start by building the classic ToDo app using AlpineJS!

## ToDo App using Alpine

Let's start by creating a HTML file and putting the basic HTML boilerplate. 
![ss1](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dpwebaacrxhemw2uqkmd.png)
  

The firsts thing we need to do is importing alpinejs in our html file which can be done by adding a script tag in our Head tag like this.
![ss2](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2g5cl9m6vcr2d02cbp6a.png) 

There are three basic things we need for todo app, current todo text, an array to contain all the todos and the todo handling functions. Let's start by defining our variables for the todo. To define variables for a scope in alpineJS, you need to use `x-data` directive provided by alpine. `x-data` defines a chunk of HTML as an Alpine component and provides the reactive data for that component to reference. Here's what my code looks like -
![ss3](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xscfkzukdcoqxy19ybc4.png) 
 
Notice how you have to use `this` to access the data inside methods. The function logic is kinda simple so I'll not go much in detail, let's start by making our todo app. We will need one input area, a button to add todo and a list of todos with each todo having a button to remove it. Let's start!
![ss4](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pzv79ja5wc2jm6kc4qa8.png) 
 
Now, let's try to understand the code ;)
The first thing you see is an input tag with a `x-model` directive whose value is equal to `todoEl` which we had defined in our `x-data` directive. `x-model` allows you to bind the value of an input element to given variable, it automatically looks for changes in the input value and changes the variable accordingly!

The second tag is a button with `@click` directive, alpine allows you to use `@` in place of `x-on:` directive which are mainly used for listening to DOM events like click, change, mouse events and other stuff. You can see that the `@click` has been bind with `addTodo` method from our `x-data`. So every time someone clicks on the button it ads the input text to our `todos` array as a string!

Now for the last part, we have the list of todos displayed using unordered list tag or `<ul>` tag. Inside, we have a `template` tag with `x-for` directive and a key. `x-for` directive allows you to create DOM elements by iterating through a list so basically we are iterating through all the todos inside our `todos` array to display them. Also note that alpine's `x-for` directive can be used only on aa template tag, we can't use it directly on a `li` tag. `x-for="(todo, index) in todos"` provides us with two things, the index of todo element and todo text which is a string.

Inside it we have another div with a `<li>` tag and a button to remove the todo. The li tag uses `x-text` directive to set it's value, it's another handy directive provided by alpine. The remove button has the same `@click` directive like our add todo button, it binds to the `removeTodo` function.

This is all you need to build a basic todo app using alpine, after adding some styles to the page it looks like this 👇

{% embed https://vimeo.com/721858730 %}

SOURCE CODE: https://gist.github.com/asheeeshh/f2dd43138bf66531d588b9b01e3d4737

TIP: Try to add a mark as completed button by yourself, alpine docs are very beginner friendly, if you still face any issues or have any doubts feel free to ask me below in comments. 

Thanks for reading!

🍕 [buy me a pizza slice!](https://buymeacoffee.com/asheeshh)