VictoryBiz / laravel-simple-select
Laravel Simple Select 是为 Blade 和 Livewire 设计的输入组件。
Requires
- php: ^7.4|^8.0
- illuminate/support: ^8.0|^9.0|^10.0|^11.0
- livewire/livewire: ^2.4|^3.0
Requires (Dev)
- orchestra/testbench: ^6.0|^8.0|^9.0
- phpunit/phpunit: ^9.0|^10.5
README
Laravel Simple Select 是为 Blade 和 Livewire 设计的输入组件。
演示预览
目录
安装
您可以通过 composer 安装此包
composer require victorybiz/laravel-simple-select
可选:为了自定义组件,您应该使用 vendor:publish Artisan 命令发布配置文件。配置文件将被放置在您的应用程序的 config 目录中,视图文件在 views 目录中。
# Publish the config file
php artisan vendor:publish --tag=simple-select:config
# Publish the view file
php artisan vendor:publish --tag=simple-select:views
需求
此包使用以下包。
- 当使用 Livewire 的
wire:model
时,需要 Laravel Livewire (https://laravel-livewire.com/) - TailwindCSS (https://tailwind.org.cn/)
- Heroicon (https://heroicons.com/)
- Alpine.js v3 (https://alpinejs.dev/)
- Popper.js (https://popper.js.org/)
请在使用此组件之前确保包含这些依赖项。
JavaScript 依赖
对于任何外部 JavaScript 依赖项,我们建议您通过 npm 或 yarn 安装它们,然后在您的项目 JavaScript 中要求它们。要安装此包使用的每个依赖项,请在终端中运行以下命令
npm install -D alpinejs @popperjs/core
import Alpine from 'alpinejs' import { createPopper } from "@popperjs/core"; window.Alpine = Alpine; Alpine.start() window.createPopper = createPopper;
如果您使用的是编译后的 JavaScript,别忘了在它之前包含 JavaScript 依赖项的 CDN 版本。
用法
简单选择
@php // Basic Arrays $options = ['Nigeria', 'United Kingdom', 'United States']; // Above will output Option Value e.g Nigeria // Above will output Option Text e.g Nigeria // OR // Associative Arrays $options = [ ['value' => 'NG', 'text' => 'Nigeria'], ['value' => 'GB', 'text' => 'United Kingdom'], ['value' => 'US', 'text' => 'United States'] ]; // Above will output Option Value e.g NG // Above will output Option Text e.g Nigeria // OR // Using Associative Arrays data from a Model/Database, // ensure to customize the field names with value-field="code" and text-field="name" properties of the component. $options = [ ['code' => 'NG', 'name' => 'Nigeria'], ['code' => 'GB', 'name' => 'United Kingdom'], ['code' => 'US', 'name' => 'United States'] ]; // OR $options = [ ['code' => 'NG', 'name' => 'Nigeria', 'flag' => 'https://www.countryflags.io/ng/shiny/32.png'], ['code' => 'GB', 'name' => 'United Kingdom', 'flag' => 'https://www.countryflags.io/gb/shiny/32.png'], ['code' => 'US', 'name' => 'United States', 'flag' => 'https://www.countryflags.io/us/shiny/32.png'] ]; // Above will output Option Value e.g NG // Above will output Option Text e.g Nigeria @endphp
<x-simple-select name="country" id="country" :options="$options" value-field='code' text-field='name' placeholder="Select Country" search-input-placeholder="Search Country" :searchable="true" class="form-select" />
自定义选项插槽
<x-simple-select name="country" id="country" :options="$options" value-field='code' text-field='name' placeholder="Select Country" search-input-placeholder="Search Country" :searchable="true" class="form-select" > <x-slot name="customOption"> <img class="float-left mr-2 -mt-1" :src="option.flag"> <span x-text="option.name"></span> </x-slot> </x-simple-select> <x-simple-select name="country" id="country" :options="$options" value-field='code' text-field='name' placeholder="Select Country" search-input-placeholder="Search Country" :searchable="true" class="form-select" > <x-slot name="customOption"> <img class="float-left mr-2 -mt-1" :src="`https://www.countryflags.io/${option.code?.toLowerCase()}/shiny/32.png`"> <span x-text="option.name"></span> </x-slot> </x-simple-select>
自定义选中插槽
<x-simple-select name="country" id="country" :options="$options" value-field='code' text-field='name' placeholder="Select Country" search-input-placeholder="Search Country" :searchable="true" class="form-select" > <x-slot name="customSelected"> <img class="float-left mr-2" :src="`https://www.countryflags.io/${option.code?.toLowerCase()}/shiny/24.png`"> <span x-text="option.name"></span> </x-slot> <x-slot name="customOption"> <img class="float-left mr-2 -mt-1" :src="`https://www.countryflags.io/${option.code?.toLowerCase()}/shiny/32.png`"> <span x-text="option.name"></span> </x-slot> </x-simple-select>
自定义图标插槽
<x-simple-select name="country" id="country" :options="$options" value-field='code' text-field='name' placeholder="Select Country" search-input-placeholder="Search Country" :searchable="true" class="form-select" > <x-slot name="customOption"> <img class="float-left mr-2 -mt-1" :src="option.flag"> <span x-text="option.name"></span> </x-slot> <x-slot name="customDeselectOptionIcon"> <!-- Heroicon solid/x-circle --> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" class = 'h-4 fill-current'> <path d="M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm6 16.538l-4.592-4.548 4.546-4.587-1.416-1.403-4.545 4.589-4.588-4.543-1.405 1.405 4.593 4.552-4.547 4.592 1.405 1.405 4.555-4.596 4.591 4.55 1.403-1.416z"/> </svg> </x-slot> </x-simple-select>
相关选择
如果您有一个自定义选择,其选项依赖于另一个选择的选择,或者需要满足某种条件,您可以通过监听主选择的 livewire 模型的更新事件来更新相关选择的选项。
// Expected data in Database // Model Country::class $countries = [ ['code' => 'NG', 'name' => 'Nigeria'], ['code' => 'GB', 'name' => 'United Kingdom'], ['code' => 'US', 'name' => 'United States'] ]; // Model State::class $states = [ ['id' => 1, 'country_code' => 'NG', 'name' => 'Abuja'], ['id' => 2, 'country_code' => 'NG', 'name' => 'Edo'], ['id' => 3, 'country_code' => 'NG', 'name' => 'Lagos'], ['id' => 4, 'country_code' => 'US', 'name' => 'Alaska'], ['id' => 5, 'country_code' => 'US', 'name' => 'Califonia'], ['id' => 6, 'country_code' => 'US', 'name' => 'Florida'], ['id' => 7, 'country_code' => 'GB', 'name' => 'Belfast'], ['id' => 8, 'country_code' => 'GB', 'name' => 'London'], // ... ];
创建一个 livewire 组件作为表单页面
<?php namespace App\Http\Livewire; use Livewire\Component; class CreateUser extends Component { public $countries = []; public $states = []; public $name; public $country; public $state; protected function rules() { // } public function updated($propertyName) { $this->validateOnly($propertyName); } public function store() { $this->validate(); // Store the data } public function mount() { $this->countries = \App\Models\Country::orderBy('name')->get()->toArray(); } public function updatedCountry($countryCode) { if ($countryCode) { $this->states = \App\Models\State::where('country_code', $countryCode)->orderBy('name')->get()->toArray(); } else { $this->states = []; } $this->state = null; } public function render() { return view('livewire.create-user'); } }
在您的组件视图中
<form wire:submit.prevent="store"> <label for="name">Name</label> <div class="mt-1"> <input wire:model="name" name="name" id="name" placeholder="Enter name" class="form-input" /> </div> <label for="country">Country</label> <div class="mt-1"> <x-simple-select wire:model="country" name="country" id="country" :options="$options" value-field='code' text-field='name' placeholder="Select Country" search-input-placeholder="Search Country" :searchable="true" class="form-select" /> </div> <label for="state">State</label> <div class="mt-1"> <x-simple-select wire:model="state" name="state" id="state" :options="$states" value-field='id' text-field='name' placeholder="Select State" search-input-placeholder="Search State" :searchable="true" class="form-select" /> </div> </form>
事件监听器
window.addEventListener('select', function(option) { console.log(option.detail.value); // Select option value(s) console.log(option.detail.name); // The select element name console.log(option.detail.id); // The select element ID });
定位
simple-select 组件使用 Popper.js
定位选择菜单。这应该可以消除现在固定定位选择菜单的需要。除了在打开时定位菜单外,Popper.js 还会在页面滚动时根据需要重新定位菜单。
属性/属性
插槽/自定义显示
事件
测试
composer test
变更日志
有关最近更改的更多信息,请参阅 CHANGELOG
贡献
有关详细信息,请参阅 CONTRIBUTING
安全性
如果您发现任何安全问题,请通过电子邮件 lavictorybiz@gmail.com 而不是使用问题跟踪器。
致谢
许可证
MIT 许可证 (MIT)。有关更多信息,请参阅 许可证文件
Laravel 包模板
此包是用 Laravel 包模板 生成的。