Hi, here we want to make a simple crud app with Vue.js
by using json-server
, axios
and Tailwind CSS
for styling.
In this app we have two fields: name
, username
with three default values that we can edit, delete them or add a new one.
You can find source code here: source code
let's start this project together step by step:
1. Setup project
Run vue create vue-crud-app
to create a new app. Open the project and run npm run serve
to see the project in your browser and then open a new terminal and run this command to start json-server
:npx json-server --watch data/data.json --port 8000
.
2. Files & Folder
we just need App.vue
file and delete other files. Then create two folders: components & data.
Components :
In the src
folder, create a components folder to put all of our files inside it. We have five components inside this folder :
AddUser.vue
: to add a user.
EditUser.vue
: to edit a user.
UserList.vue
: to show all users.
Home.vue
: it is our homepage,where we show UserList.vue
& AddUser.vue
components.
UserDetail.vue
: to show user detail.
data:
It is in the root folder. Inside this folder create a file and called it data.json
and put all of our data inside it.
{
"users":[
{
"name":"Negin",
"username":"negin007",
"id":1
},
{
"name":"Craig",
"username":"benisphere",
"id":2
},
{
"name":"Ben",
"username":"siliconeidolon",
"id":3
}
]
}
3.Code
router.js
-
src/router.js
. - It is used to define and configure the router for our application & allowing you to navigate between different pages or components based on the URL.
const routes = [
{
path: "/",
name: "users",
component: () => import("./components/Home")
},
{
path: "/user/:id",
name: "editUser",
component: () => import("./components/EditUser")
// props: true
},
{
path: "/addUser",
name: "addUser",
component: () => import("./components/AddUser")
},
{
path: "/users/:id",
name: "userDetail",
component: () => import("./components/UserDetail")
}
];
App.vue
-
src/App.vue
. - It has
blockquote
tag and<router-view/>
to display the content of your different pages.
<template>
<blockquote class="text-2xl font-semibold italic text-center text-blue-500 my-10">
<span
class="mx-2 before:block before:absolute before:-inset-1 before:-skew-y-3 before:bg-pink-400 relative inline-block">
<span class="relative text-white "> CRUD App </span>
</span>
with Vue.js
</blockquote>
<router-view />
</template>
<script>
export default {};
</script>
Home.vue
src/components/Home.vue
.It contains
UserList
andAddUser
components.we fetch users here and then pass it as props to these components.
<template>
<div class="max-w-xl pb-8 mx-auto px-5 bg-slate-100">
<UserList :users="users" @userDeleted="handleUserDeleted" />
<AddUser :users="users" />
</div>
</template>
<script>
import UserList from "./UserList.vue";
import AddUser from "./AddUser.vue";
import axios from 'axios';
export default {
components: {
UserList,
AddUser,
},
data() {
return {
users: []
}
},
mounted() {
this.fetchUsers();
},
methods: {
fetchUsers() {
axios
.get('http://localhost:8000/users')
.then((res) => { this.users = res.data })
.catch(err => console.log(err))
},
handleUserDeleted(userId) {
this.users = this.users.filter((user) => user.id !== userId);
}
}
};
</script>
UserList
-
src/components/UserList.vue
. - It shows list of users with two buttons for edit and delete each user.By click on name you can see user detail.
- we have two methods:
deleteUser
: for delete each user.
updateUser
: for navigate to edit page and then edit name & username.
<template>
<div v-if="users.length" class='py-5'>
<div v-for="user in users " :key="user.id" class='flex justify-between border-b-4'>
<div class="flex ">
<router-link :to="'/users/' + user.id">
<p class='my-3 px-3'>{{ user.name }}</p>
</router-link>
<p class='my-3 px-3'>{{ user.username }}</p>
</div>
<div class="flex ">
<p @click="updateUser(user.id)" class='mx-2 my-3 px-2 py-1 text-green-800
hover:bg-green-400 hover:rounded-md hover:border hover:border-green-800'>EDIT</p>
<p @click="deleteUser(user.id)" class='my-3 px-2 py-1 text-red-800
hover:bg-red-400 hover:rounded-md hover:border hover:border-red-800'>DELETE</p>
</div>
</div>
</div>
</template>
<script>
import axios from 'axios';
import UserDetail from './UserDetail.vue';
export default {
components: {
UserDetail,
},
props: ['users'],
methods: {
deleteUser(id) {
axios
.delete(`http://localhost:8000/users/${id}`)
.then(() => {
this.$emit('userDeleted', id)
})
.catch((error) => { console.log(error) })
},
updateUser(id) {
this.$router.push(`/user/${id}`)
}
}
}
</script>
EditUser
-
src/components/EditUser.vue
. - We have two input fields for showing name & username.
- Two methods for updating user and cancel editing and back to home page.
<template>
<div class="flex items-center justify-center">
<form @submit.prevent="handleSubmit">
<div class='flex flex-col justify-center items-center bg-slate-100 p-10 mt-10 rounded-md'>
<input v-model="name" class='my-2 px-5 py-1 rounded-full border border-gray-600' />
<input v-model="username" class='my-2 px-5 py-1 rounded-full border border-gray-600' />
</div>
<div class="flex my-2 mx-20">
<button class='text-white mx-1 px-5 py-1 rounded-full bg-blue-500 hover:bg-blue-700'>Update User</button>
<button class='text-white mx-1 px-5 py-1 rounded-full bg-blue-500 hover:bg-blue-700'
@click="backToHome">Cancel</button>
</div>
</form>
</div>
</template>
<script>
import axios from 'axios';
export default {
data() {
return {
id: this.$route.params.id,
name: "",
username: ""
}
},
mounted() {
axios
.get('http://localhost:8000/users/' + this.id)
.then((user) => {
this.name = user.data.name;
this.username = user.data.username;
})
},
methods: {
handleSubmit() {
axios
.put('http://localhost:8000/users/' + this.id, {
name: this.name,
username: this.username,
})
.then(() => {
this.$router.push("/");
})
},
backToHome() {
this.$router.push('/')
}
},
}
UserDetail
-
src/components/UserDetail.vue
. - To see user detail,here: name & username.
<template>
<div class="max-w-xl pb-8 mx-auto px-5 bg-slate-100">
<div class="flex flex-col text-center py-5 ">
<p class='px-3 py-3 border-b-4'>Name : {{ user ? user.name : '' }}</p>
<p class='px-3 py-3'>UserName : {{ user ? user.username : '' }}</p>
</div>
</div>
</template>
<script>
import axios from 'axios';
export default {
data() {
return {
user: null,
id: this.$route.params.id
}
},
mounted() {
this.fetchUser();
},
methods: {
fetchUser() {
axios
.get('http://localhost:8000/users/' + this.id)
.then((res) => { this.user = res.data })
.catch(err => console.log(err))
}
}
}
</script>
AddUser
-
src/components/AddUser.vue
. - It has two fields for add
name
andusername
& ahandleSubmit
method to add user to list of users.
<template>
<form @submit.prevent="handleSubmit">
<div class='flex flex-col justify-center items-center '>
<div class='mb-2'>
<input class='px-3 py-1 rounded-full border border-gray-600' v-model="name" placeholder="Name" />
</div>
<div class='mb-2'>
<input class='px-3 py-1 rounded-full border border-gray-600' v-model="username" placeholder="UserName" />
</div>
<div class='mb-2'>
<button class="bg-blue-500 hover:bg-blue-700 text-white py-1 px-3 rounded-full">
Add
</button>
</div>
</div>
</form>
</template>
<script>
import axios from 'axios';
export default {
props: ['users'],
data() {
return {
name: '',
username: ''
}
},
methods: {
handleSubmit() {
axios
.post("http://localhost:8000/users", {
name: this.name,
username: this.username,
})
.then((response) => {
const data = response.data;
this.users.push(data);
this.name = "";
this.username = "";
});
},
}
}
</script>
Now here we go! We created a simple crud app with Vue.js
, json-server
, axios
and Tailwind CSS
.
Thank you for reading! 🍀
Top comments (0)