Компоненты Vue

vue
sm
md
lg
xl

Пример

/** Параметры для компонента SelectUI */
<script>
    const people = [
        {
            id: 1,
            name: 'Петров Иван',
        },
        {
            id: 2,
            name: 'Самонов Александр',
        },
        {
            id: 3,
            name: 'Афиногенов Петр',
        },
        {
            id: 4,
            name: 'Мирнов Павел',
        },
        {
            id: 5,
            name: 'Афиногенов Петр',
        },
        {
            id: 6,
            name: 'Афиногенов Петр',
        },
        {
            id: 7,
            name: 'Афиногенов Петр',
        },
        {
            id: 8,
            name: 'Афиногенов Петр',
        },
        {
            id: 9,
            name: 'Афиногенов Петр',
        },
        {
            id: 10,
            name: 'Афиногенов Петр',
        },
    ];
    const label = 'Пример выпадающего списка на Vue';

    let app = new Vue({
        el: '#app',
        data () {
            return {
                options: people,
                label: label,
            }
        }
    });
</script>

/** Вызов компонента SelectUI */
<div id="app">
	<my-component :label="label" :options='options' ></my-component>
</div>

/** Компонент SelectUI */
<template>
   <div class="t-0">
        <div class="w-full left m-bottom-1/3">
            <label class=" bolder">{{ label }}</label>
        </div>

        <div class="">
            <button class="btn btn-white border-surface-inverse radius-1/2 m-bottom-1/2 color-on-surface w-full flex" v-on:click="changeState">
                <span class="w-full left">{{ selectedOptionName }}</span>
                <input type="hidden" :name="inputname" :value="selectedOptionId">
                <span class="absolute flex items-cross-center top-0 right-0 bottom-0 m-left-1 p-right-1/2">
                    <svg class="svg-1" x-description="Heroicon name: solid/selector" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
                        <path fill-rule="evenodd" d="M10 3a1 1 0 01.707.293l3 3a1 1 0 01-1.414 1.414L10 5.414 7.707 7.707a1 1 0 01-1.414-1.414l3-3A1 1 0 0110 3zm-3.707 9.293a1 1 0 011.414 0L10 14.586l2.293-2.293a1 1 0 011.414 1.414l-3 3a1 1 0 01-1.414 0l-3-3a1 1 0 010-1.414z" clip-rule="evenodd"></path>
                    </svg>
                </span>
            </button>
            <ul class="absolute mt-1  bg-surface-0 max-h-5 p-top-1/3 p-bottom-1/3 p-right-0 p-left-0 sf-scroll radius-1/2 l-none border-surface-inverse shadow-1 hidden" :name="id" :id="id" >
                <li class="relative bg-surface-0 hover:bg-yellow hover:c-white p-top-1/2 p-bottom-1/2 p-left-1 p-right-1 left cursor-pointer"
                    v-on:click="chooseOption(option.name)"
                    v-for="option in options" v-bind:key="option.id">
                    {{option.name}}
                </li>
            </ul>
        </div>
   </div>
</template>

<script>
    export default {
        name: 'SelectUI',
        props: ['options', 'label', 'isActive'],
        data() {
            return {
               id: 'ui-select-' + Math.floor(Math.random() * 1001),
               state: false,
               selectedOptionName: 'Не выбрано',
               selectedOptionId: '',
            }
        },
        methods: {
            changeState: function() {
                var selectUI = document.querySelector(`#${this.id}`);

                if (selectUI.classList.contains('hidden'))
                {
                    selectUI.classList.remove('hidden');
                    this.state = true;
                } else {
                    selectUI.classList.add('hidden');
                    this.state = false;
                }
            },
            chooseOption: function(name) {
                this.selectedOptionName = name;
                this.changeState();
            },
        },
    }
</script>

Изменить статью