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 의 결과는.. 다음 포스팅에 적어보겠음.