livewire 에서 select2 말고 choices.js 사용하기

Updated on

호옹 호옹

livewire 에서 select2 를 사용하려고 했었다.
하지만, select2는 jquery 를 사용하고 있었고, 어쩔 수 없이 jquery 를 같이 사용했다.
영 ~ 아니였음.

그래서 찾은 repo 가…

https://joshuajohnson.co.uk/Choices/

이거였는데…

크게 문제되지는 않았다. 잘 사용 된다.

하지만, 데이터가 20000개 이상이 넘어가기 시작하면, modal 을 매번 열때마다 20000개의 data를 매번 받아와야하고 하는 문제점이 있더라…
너무 불편했던것이다…

그래서 axios 를 이용하여, 해당 내용에 맞는 sql 만 찾아오도록 개선하였다.

<div class="mt-1"
     x-data="{ value: @entangle('company_id').defer, set() { this.Element.setChoiceByValue(''); }, Element: null, Search: null }"
     x-init="
            () => {
                Element = new Choices($refs.input, {
                    renderChoiceLimit: 20,
                    searchFloor: 1,
                    searchResultLimit: 40,
                    searchFields: ['label'],
                    noResultsText: '찾을 수 없음',
                    itemSelectText: '💎',
                    resetScrollPosition: true,
                });
                 let timer = null
                 Element.passedElement.element.addEventListener(
                   'search',
                   function(event) {
                     if (event.detail.value.length > 0 && Search !== event.detail.value) {
                        Element.clearChoices();
                        clearTimeout(timer);
                        timer = setTimeout(() => {
                           $fetch({ url: '/test/'+event.detail.value, method: 'get' }).then(({ data }) => {
                                Element.setChoices(data,'value','label',true)._handleSearch(event.detail.value)
                           })
                        }, 200);
                        Search = event.detail.value;
                     }
                   },
                   false,
                 );
            }
"
     x-on:change="value = $refs.input.value;"
     @open-event.window="set"
     wire:ignore>
    <div wire:ignore>
        <select class="block w-full bg-white border border-gray-300 rounded-md shadow-sm py-2 px-3 focus:outline-none focus:ring-gray-900 focus:border-gray-900 text-xs sm:text-sm"
                x-ref="input">
            <option value="">선택</option>
        </select>
    </div>
    @error('company_id')<p class="mt-1 text-sm text-red-500">{{ $message }}</p>@enderror
</div>

참고로, axios 값으로 받아온 애들을 setChoices 해주고나서, 꼭 _handleSearch(event.detail.value) 로 다시 검색결과를 리로드시켜줘야만 했다.
애초에 choices 프로젝트 자체가 업데이트가 잘 되지 않고 있기 때문에… 이걸 써도 되나 망설여지긴 했다.

하지만 어쨌든 그래도… 그냥 Choices.js 써도 되긴할텐데…

그냥 찾다보니 https://fusejs.io/ 를 찾게 되었고,
fusejs 를 통해서 직접 alpine + tailwindcss 로 한번 만들어보려고 한다.

자, 그러면 fusejs 의 결과는.. 다음 포스팅에 적어보겠음.