@@ -1,12 +1,12 @@
< script lang = "ts" >
export default {
export default {
name : "LaySelect" ,
} ;
< / script >
} ;
< / script >
< script setup lang = "ts" >
import "./index.less" ;
import {
< script setup lang = "ts" >
import "./index.less" ;
import {
provide ,
computed ,
ref ,
@@ -16,51 +16,59 @@ import {
VNode ,
Component ,
watch ,
} from "vue" ;
import LayInput from "../input/index.vue" ;
import LayTagInput from "../tagInput/index.vue" ;
import LayDropdown from "../dropdown/index.vue" ;
import LaySelectOption , {
} from "vue" ;
import LayInput from "../input/index.vue" ;
import LayTagInput from "../tagInput/index.vue" ;
import LayDropdown from "../dropdown/index.vue" ;
import LaySelectOption , {
LaySelectOptionProps ,
} from "../selectOption/index.vue" ;
} from "../selectOption/index.vue" ;
export interface LaySelectProps {
export interface LaySelectProps {
name ? : string ;
create ? : boolean ;
disabled ? : boolean ;
placeholder ? : string ;
showEmpty ? : boolean ;
emptyMessage ? : string ;
modelValue ? : any ;
multiple ? : boolean ;
items ? : LaySelectOptionProps [ ] ;
size ? : "lg" | "md" | "sm" | "xs" ;
collapseTagsTooltip ? : boolean ;
minCollapsedNum ? : number ;
allowClear ? : boolean ;
}
}
export interface SelectEmits {
export interface SelectEmits {
( e : "update:modelValue" , value : string ) : void ;
( e : "change" , value : string ) : void ;
}
}
const props = withDefaults ( defineProps < LaySelectProps > ( ) , {
const props = withDefaults ( defineProps < LaySelectProps > ( ) , {
modelValue : null ,
placeholder : "请选择" ,
showEmpty : true ,
emptyMessage : "请选择" ,
collapseTagsTooltip : true ,
minCollapsedNum : 3 ,
disabled : false ,
multiple : false ,
create : false ,
size : "md" ,
allowClear : false ,
} ) ;
} ) ;
const slots = useSlots ( ) ;
const searchValue = ref ( "" ) ;
const singleValue = ref ( "" ) ;
const multipleValue = ref ( [ ] ) ;
const openState : Ref < boolean > = ref ( false ) ;
const selectedItem : Ref < any > = ref ( [ ] ) ;
const options = ref < any > ( [ ] ) ;
const emits = defineEmits < SelectEmits > ( ) ;
const slots = useSlots ( ) ;
const searchValue = ref ( "" ) ;
const singleValue = ref ( "" ) ;
const multipleValue = ref ( [ ] ) ;
const openState : Ref < boolean > = ref ( false ) ;
const selectedItem : Ref < any > = ref ( [ ] ) ;
const options = ref < any > ( [ ] ) ;
const emits = defineEmits < SelectEmits > ( ) ;
onMounted ( ( ) => {
onMounted ( ( ) => {
if ( slots . default ) {
getOption ( slots . default ( ) ) ;
}
@@ -71,9 +79,13 @@ onMounted(() => {
selectedValue ,
( ) => {
if ( multiple . value ) {
multipleValue . value = selectedValue . value . map ( ( value : any ) => {
return options . value . find ( ( item : any ) => item . value === value )
} )
multipleValue . value = selectedValue . value . map ( ( value : any ) => {
return options . value . find ( ( item : any ) => {
item . disabled == "" || item . disabled == true ? item . closable = false : item . closable = true ;
return item . value === value ;
} ) ;
} ) ;
} else {
singleValue . value = options . value . find ( ( item : any ) => {
return item . value === selectedValue . value ;
@@ -82,9 +94,9 @@ onMounted(() => {
} ,
{ immediate : true }
) ;
} ) ;
} ) ;
const getOption = function ( nodes : VNode [ ] ) {
const getOption = function ( nodes : VNode [ ] ) {
nodes ? . map ( ( item : VNode ) => {
let component = item . type as Component ;
if ( component . name === LaySelectOption . name ) {
@@ -93,9 +105,9 @@ const getOption = function (nodes: VNode[]) {
getOption ( item . children as VNode [ ] ) ;
}
} ) ;
} ;
} ;
const selectedValue = computed ( {
const selectedValue = computed ( {
get ( ) {
return props . modelValue ;
} ,
@@ -103,20 +115,20 @@ const selectedValue = computed({
emits ( "update:modelValue" , val ) ;
emits ( "change" , val ) ;
} ,
} ) ;
} ) ;
const multiple = computed ( ( ) => {
const multiple = computed ( ( ) => {
return props . multiple ;
} ) ;
} ) ;
provide ( "openState" , openState ) ;
provide ( "selectedItem" , selectedItem ) ;
provide ( "selectedValue" , selectedValue ) ;
provide ( "searchValue" , searchValue ) ;
provide ( "multiple" , multiple ) ;
< / script >
provide ( "openState" , openState ) ;
provide ( "selectedItem" , selectedItem ) ;
provide ( "selectedValue" , selectedValue ) ;
provide ( "searchValue" , searchValue ) ;
provide ( "multiple" , multiple ) ;
< / script >
< template >
< template >
< div class = "layui-select" >
< lay-dropdown
:disabled = "disabled"
@@ -128,6 +140,8 @@ provide("multiple", multiple);
v-if = "multiple"
v-model = "multipleValue"
:allow-clear = "allowClear"
:collapseTagsTooltip = "collapseTagsTooltip"
:minCollapsedNum = "minCollapsedNum"
:disabledInput = "true"
>
< template # suffix >
@@ -161,6 +175,7 @@ provide("multiple", multiple);
size = "sm"
> < / lay-input >
< / div >
< lay-select-option v-if = "showEmpty && !multiple" :label="emptyMessage" value="" > < / lay -select -option >
< template v-if = "items" >
< lay -select -option
v-for = "(item, index) in items"
@@ -173,4 +188,4 @@ provide("multiple", multiple);
< / template >
< / lay-dropdown >
< / div >
< / template >
< / template >