开发UI框架:【laylte】Svelte版LAYUI(表单 - 下拉选项框)
从css部分进入了js部分了,想了想还是取个名字吧。框架就叫laylte吧,layui+Svelte=laylte。
于是有了专属文件夹了laylte
【laylte/LaySelect.svelte】
<script>
//import { createEventDispatcher } from 'svelte';
//const dispatch = createEventDispatcher();
export let value='';
let value_old='';
export let type="normal";
export let options;
export let keyword="";
let keyword_bak=null;
//转换成obj方便读取
function load_options_obj()
{
let options_obj={};
if(type=="normal" || type=="search")
{
for(var i in options)
{
options_obj[options[i].value]=options[i];
}
}else if(type=="group"){
for(var i in options)
{
let this_options=options[i].options
for(var j in this_options)
{
options_obj[this_options[j].value]=this_options[j];
}
}
}
return options_obj;
}
let options_obj=load_options_obj();
let keyword_input;
let open=false;
export let placeholder='请选择';
export let change=function(option){
console.log('change');
console.log(option);
};
//value转text的方法
function read_text(value)
{
console.log(options_obj);
console.log(value);
if(value!='')
{
if(options_obj[value].text)
{
return options_obj[value].text;
}else{
return '';
}
}else{
return '';
}
}
//打开隐藏
function select_display()
{
if(keyword_bak===null)
{
keyword_bak=keyword;
}
keyword=keyword_bak;
open=!open;
if(open){
value_old=value;
if(type=='search')
{
setTimeout(()=>{
keyword_input.focus();
},300);
}
}
}
function select_click(obj)
{
console.error('select_click');
console.log(obj);
if(obj.disabled)
{
return false;
}
open=false;
value=obj.value;
if(value_old!=value)
{
change(obj);
}
}
function select_click_none()
{
open=false;
value='';
if(value_old!=value)
{
change({value:'',text:placeholder});
}
}
function shade_close()
{
console.error('shade_close');
open=false;
}
function option_keywords(options,keyword)
{
var new_options=[];
for(var i in options)
{
if(keyword=='' || options[i].text.indexOf(keyword)>=0)
{
new_options.push(options[i]);
}
}
return new_options;
}
$: search_options=option_keywords(options,keyword);
</script>
<!-- svelte-ignore a11y-click-events-have-key-events -->
<div class="layui-unselect layui-form-select {open==true ? 'layui-form-selected' : ''}">
<!--遮罩层-->
{#if open==true}
<div style="background:rgba(0,0,0,0); position:fixed; width:100%;height:100%;top:0;left:0;" on:click={shade_close}></div>
{/if}
<!-- 常规下拉选项框 -->
{#if type=='normal'}
<div class="layui-select-title" on:click={select_display}>
<input type="text" placeholder="{placeholder}" value={read_text(value)} readonly="" class="layui-input layui-unselect">
<i class="layui-edge"></i>
</div>
<dl class="layui-anim layui-anim-upbit {type=='group' ? 'layui-select-group' :''}" style="">
<dd lay-value="" class="layui-select-tips {value=='' ? 'layui-this' : ''}" on:click={select_click_none}>{placeholder}</dd>
{#each options as option}
<dd lay-value="{option.value}" class="{value==option.value ? 'layui-this' : ''} {option.disabled==true ? 'layui-disabled':''}" on:click={select_click(option)}>{option.text}</dd>
{/each}
</dl>
{/if}
<!-- 分组下拉选项框 -->
{#if type=='group'}
<div class="layui-select-title" on:click={select_display}>
<input type="text" placeholder="{placeholder}" value={read_text(value)} readonly="" class="layui-input layui-unselect">
<i class="layui-edge"></i>
</div>
<dl class="layui-anim layui-anim-upbit layui-select-group" style="">
<dd lay-value="" class="layui-select-tips {value=='' ? 'layui-this' : ''}" on:click={select_click_none}>{placeholder}</dd>
{#each options as group}
<dt>{group.group}</dt>
{#each group.options as option}
<dd lay-value="{option.value}" class="{value==option.value ? 'layui-this' : ''} {option.disabled==true ? 'layui-disabled':''}" on:click={select_click(option)}>{option.text}</dd>
{/each}
{/each}
</dl>
{/if}
<!-- 搜索下拉选项框 -->
{#if type=='search'}
<div class="layui-select-title" on:click={select_display}>
{#if open==true}
<input bind:this={keyword_input} type="text" placeholder="{placeholder}" bind:value={keyword} class="layui-input layui-unselect">
{:else}
<input type="text" placeholder="{placeholder}" value={read_text(value)} readonly="" class="layui-input layui-unselect">
{/if}
<i class="layui-edge"></i>
</div>
<dl class="layui-anim layui-anim-upbit {type=='group' ? 'layui-select-group' :''}" style="">
{#if search_options.length>0}
<dd lay-value="" class="layui-select-tips {value=='' ? 'layui-this' : ''}" on:click={select_click_none}>{placeholder}</dd>
{#each search_options as option}
<dd lay-value="{option.value}" class="{value==option.value ? 'layui-this' : ''} {option.disabled==true ? 'layui-disabled':''}" on:click={select_click(option)}>{option.text}</dd>
{/each}
{/if}
{#if search_options.length==0}
<p class="layui-select-none">无匹配项</p>
{/if}
</dl>
{/if}
</div>
<style>
</style>Svelte的感觉就像写以前php+模版,后端加前端的混合写法,可能大部分人写不习惯,个人是比较习惯,毕竟早些年php还没框架化的时候用得熟悉了。
App.svelte也是比较简单的,
import LaySelect from '../laylte/LaySelect.svelte';后直接可以用了
【App.svelte】
<script>
import LaySelect from '../laylte/LaySelect.svelte';
//export let name;
let options1 = [
{ value: 1, text: '#0d0887' },
{ value: 2, text: '#6a00a8' , disabled:true },
{ value: 3, text: '#b12a90' },
{ value: 4, text: '#e16462' },
{ value: 5, text: '#fca636' }
];
let options2 = [
{
group:'高对比度',
options:[
{ value: 1, text: '#0d0887' },
{ value: 2, text: '#6a00a8' , disabled:true },
{ value: 3, text: '#b12a90' },
]
},
{
group:'低对比度',
options:[
{ value: 4, text: '#e16462' },
{ value: 5, text: '#fca636' }
]
}
];
let options3 = [
{ value: 1, text: 'lay1' },
{ value: 2, text: 'lay2' , disabled:true },
{ value: 3, text: 'lay3' },
{ value: 4, text: 'ay1' },
{ value: 5, text: 'ay2' }
];
function options1_change(value)
{
console.error('change1--xx',value);
}
let options1_value=3;
let options2_value=3;
function options2_change(value)
{
console.error('change2--xx',value);
}
let options3_value=3;
function options3_change(value)
{
console.error('change3--xx',value);
}
</script>
<svelte:head>
<title>layui - 表单 - 下拉选项框</title>
</svelte:head>
<!-- svelte-ignore a11y-label-has-associated-control -->
<main>
<blockquote class="layui-elem-quote layui-text">
下拉选项框
</blockquote>
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 20px;">
<legend>下拉选项框 * 演示</legend>
</fieldset>
<form class="layui-form" action="">
<div class="layui-form-item">
<label class="layui-form-label">下拉选项框</label>
<div class="layui-input-block">
<LaySelect bind:value="{options1_value}" options={options1} change={options1_change} ></LaySelect>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">下拉选项框</label>
<div class="layui-input-block">
<LaySelect bind:value="{options1_value}" options={options1} change={options1_change} ></LaySelect>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">选项框值</label>
<div class="layui-form-mid">{options1_value}</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">组下拉框</label>
<div class="layui-input-block">
<LaySelect type="group" bind:value="{options2_value}" options={options2} change={options2_change} ></LaySelect>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">组下拉框</label>
<div class="layui-input-block">
<LaySelect type="group" bind:value="{options2_value}" options={options2} change={options2_change} ></LaySelect>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">选项框值</label>
<div class="layui-form-mid">{options2_value}</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">搜索下拉框</label>
<div class="layui-input-block">
<LaySelect type="search" keyword="la" bind:value="{options3_value}" options={options3} change={options3_change} ></LaySelect>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">搜索下拉框</label>
<div class="layui-input-block">
<LaySelect type="search" keyword="la" bind:value="{options3_value}" options={options3} change={options3_change} ></LaySelect>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">选项框值</label>
<div class="layui-form-mid">{options3_value}</div>
</div>
</form>
</main>
<style>
</style>跟vue差不多的方式,由于不太熟悉Svelte,先这么着,后面发现坑了再调整。

学习layui支持个分组的select

简单看了一下,有那么点意思了,后面再接再厉吧!





