This repository has been archived on 2021-09-06. You can view files and clone it, but cannot push or open issues or pull requests.
vuejs_course/2021-03-19_axios-01-start/src/components/auth/signup.vue

202 lines
4.7 KiB
Vue

<template>
<div id="signup">
<div class="signup-form">
<form @submit.prevent="onSubmit">
<div class="input">
<label for="email">Mail</label>
<input
type="email"
id="email"
v-model="email">
</div>
<div class="input">
<label for="age">Your Age</label>
<input
type="number"
id="age"
v-model.number="age">
</div>
<div class="input">
<label for="password">Password</label>
<input
type="password"
id="password"
v-model="password">
</div>
<div class="input">
<label for="confirm-password">Confirm Password</label>
<input
type="password"
id="confirm-password"
v-model="confirmPassword">
</div>
<div class="input">
<label for="country">Country</label>
<select id="country" v-model="country">
<option value="usa">USA</option>
<option value="india">India</option>
<option value="uk">UK</option>
<option value="germany">Germany</option>
</select>
</div>
<div class="hobbies">
<h3>Add some Hobbies</h3>
<button @click="onAddHobby" type="button">Add Hobby</button>
<div class="hobby-list">
<div
class="input"
v-for="(hobbyInput, index) in hobbyInputs"
:key="hobbyInput.id">
<label :for="hobbyInput.id">Hobby #{{ index }}</label>
<input
type="text"
:id="hobbyInput.id"
v-model="hobbyInput.value">
<button @click="onDeleteHobby(hobbyInput.id)" type="button">X</button>
</div>
</div>
</div>
<div class="input inline">
<input type="checkbox" id="terms" v-model="terms">
<label for="terms">Accept Terms of Use</label>
</div>
<div class="submit">
<button type="submit">Submit</button>
</div>
</form>
</div>
</div>
</template>
<script>
import axios from '../../axios-auth';
export default {
data () {
return {
email: '',
age: null,
password: '',
confirmPassword: '',
country: 'usa',
hobbyInputs: [],
terms: false
}
},
methods: {
onAddHobby () {
const newHobby = {
id: Math.random() * Math.random() * 1000,
value: ''
}
this.hobbyInputs.push(newHobby)
},
onDeleteHobby (id) {
this.hobbyInputs = this.hobbyInputs.filter(hobby => hobby.id !== id)
},
onSubmit () {
const formData = {
email: this.email,
age: this.age,
password: this.password,
confirmPassword: this.confirmPassword,
country: this.country,
hobbies: this.hobbyInputs.map(hobby => hobby.value),
terms: this.terms
}
console.log(formData)
axios.post("/users.json", formData)
.then(response => console.log(response))
.catch(error => console.log(error));
}
}
}
</script>
<style scoped>
.signup-form {
width: 400px;
margin: 30px auto;
border: 1px solid #eee;
padding: 20px;
box-shadow: 0 2px 3px #ccc;
}
.input {
margin: 10px auto;
}
.input label {
display: block;
color: #4e4e4e;
margin-bottom: 6px;
}
.input.inline label {
display: inline;
}
.input input {
font: inherit;
width: 100%;
padding: 6px 12px;
box-sizing: border-box;
border: 1px solid #ccc;
}
.input.inline input {
width: auto;
}
.input input:focus {
outline: none;
border: 1px solid #521751;
background-color: #eee;
}
.input select {
border: 1px solid #ccc;
font: inherit;
}
.hobbies button {
border: 1px solid #521751;
background: #521751;
color: white;
padding: 6px;
font: inherit;
cursor: pointer;
}
.hobbies button:hover,
.hobbies button:active {
background-color: #8d4288;
}
.hobbies input {
width: 90%;
}
.submit button {
border: 1px solid #521751;
color: #521751;
padding: 10px 20px;
font: inherit;
cursor: pointer;
}
.submit button:hover,
.submit button:active {
background-color: #521751;
color: white;
}
.submit button[disabled],
.submit button[disabled]:hover,
.submit button[disabled]:active {
border: 1px solid #ccc;
background-color: transparent;
color: #ccc;
cursor: not-allowed;
}
</style>