Cristiano Magro
10 days ago 9dfbe6d1cea2eb9f1f9f0edd5fe6a16d3dce76ed
Building a Custom Control Component
1 files added
1 files modified
73 ■■■■■ changed files
11 - Forms/xno-forms-01-starting-setup/src/components/RatingControl.vue 60 ●●●●● patch | view | raw | blame | history
11 - Forms/xno-forms-01-starting-setup/src/components/TheForm.vue 13 ●●●●● patch | view | raw | blame | history
11 - Forms/xno-forms-01-starting-setup/src/components/RatingControl.vue
New file
@@ -0,0 +1,60 @@
<template>
    <ul>
        <li :class="{ active: activeOption === 'poor' }">
            <button type="button" @click="activate('poor')">Poor</button>
        </li>
        <li :class="{ active: activeOption === 'average' }">
            <button type="button" @click="activate('average')">Average</button>
        </li>
        <li :class="{ active: activeOption === 'great' }">
            <button type="button" @click="activate('great')">Great</button>
        </li>
    </ul>
</template>
<script>export default {
    data() {
        return {
            activeOption: null,
        };
    },
    methods: {
        activate(option) {
            this.activeOption = option;
        }
    }
}
</script>
<style scoped>
.active {
    border-color: purple;
}
.active button {
    color: purple;
}
ul {
    list-style: none;
    margin: 0.5rem 0;
    padding: 0;
    display: flex;
}
li {
    margin: 0 1rem;
    border: 1px solid #ccc;
    padding: 1rem;
    display: flex;
    align-items: center;
}
button {
    font: inherit;
    border: none;
    background-color: transparent;
    cursor: pointer;
}
</style>
11 - Forms/xno-forms-01-starting-setup/src/components/TheForm.vue
@@ -47,6 +47,13 @@
        <label for="how-other">Other</label>
      </div>
    </div>
    <div class="form-control">
      <rating-control>
      </rating-control>
    </div>
    <div class="form-control">
      <input type="checkbox" id="confirm-terms" name="confirm-terms" v-model="confirm">
      <label for="confirm-terms">Agree to terms of use?</label>
@@ -58,7 +65,12 @@
</template>
<script>
import RatingControl from './RatingControl.vue';
export default {
  components: {
    RatingControl,
  },
  data() {
    return {
      userName: '',
@@ -123,6 +135,7 @@
.form-control.invalid input{
border-color: red;
}
.form-control.invalid label{
color: red;
}