123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- import { Button, Icon, Search } from 'vant';
- import { PropType, defineComponent, reactive, ref, watch } from 'vue';
- import styles from './index.module.less';
- import iconSearch from './images/icon_search.png';
- export default defineComponent({
- name: 'm-search',
- props: {
- modelValue: {
- type: String,
- default: ''
- },
- shape: {
- type: String as PropType<'round' | 'square'>,
- default: 'round'
- },
- disabled: {
- type: Boolean,
- default: false
- },
- clearable: {
- type: Boolean,
- default: true
- },
- autofocus: {
- // ios系统不支持
- type: Boolean,
- default: false
- },
- placeholder: {
- type: String,
- default: '请输入搜索关键词'
- },
- background: {
- type: String,
- default: '#fff'
- },
- searchIcon: {
- type: String,
- default: iconSearch
- },
- inputBackground: {
- type: String,
- default: '#f8f9fc'
- }
- },
- emits: ['search', 'focus', 'blur'],
- setup(props, { slots, emit, expose }) {
- const forms = reactive({
- search: props.modelValue || '',
- });
- const searchRef = ref()
- watch(
- () => props.modelValue,
- () => {
- forms.search = props.modelValue;
- }
- );
- const searchBlur = () => {
- searchRef.value?.blur()
- }
- expose({
- searchBlur
- })
- return () => (
- <Search
- class={[styles['m-search'], styles[props.inputBackground]]}
- style={{"--van-search-content-background": props.inputBackground}}
- ref={searchRef}
- shape={props.shape}
- background={props.background}
- placeholder={props.placeholder}
- disabled={props.disabled}
- autofocus={props.autofocus}
- autocomplete="off"
- clearable={props.clearable}
- v-model={forms.search}
- clearTrigger="always"
- onClear={() => {
- console.log('clear');
- forms.search = '';
- emit('search', forms.search);
- }}
- onFocus={() => emit('focus')}
- onBlur={() => emit('blur', forms.search)}
- onSearch={() => emit('search', forms.search)}>
- {{
- left: () => slots.left && slots.left(),
- 'left-icon': () => (
- <Icon name={props.searchIcon} class={styles.leftIcon} />
- ),
- 'right-icon': () => (
- <Button
- disabled={props.disabled}
- class={styles.searchBtn}
- round
- type="primary"
- size="mini"
- onClick={() => emit('search', forms.search)}>
- 搜索
- </Button>
- )
- }}
- </Search>
- );
- }
- });
|