封装下拉框组件

前一段时间写页面,有一个下拉框功能需要封装一个组件, 封装的组件给大哥气不行, 封装的稀碎.大哥忍无可忍.

新组件代码:

// 下拉框组件
interface DropdownMenuProps{
    className?: string;
    height?: string;
    value?: string;
    options: Array<{value:string;label:string}>;
    onChange?:(value: string)
    children: React.ReactNode;
}

export default function DropdownMenu(fvalue,options,onChange,children,className}:DropdownMenuProps){
    return (
        <div class="pos-r"> //pos-r:定位
            {children}
            <div class="pos-a">
                {options.map(item=>(
                    <div onClick={()=>onChange(item.value)}>{item.label}</div>
                ))}
            </div>
        </div>
    )
}
// 使用组件
let [selectIpt, setSelectIpt] = useState('');
let list = [
    {value:'11',label:'11'},
    {value:'22',label:'22'},
]
<div>
    <DropdownMenu options={list} onChange={(e)=>setSelectIpt(e)}>
        <div>{selectIpt}</div>
    </DropdownMenu>
</div>

 旧版代码:

// 父组件
<div className="flex-1 pos-r d-flex-r ai-center" onClick={() => setTimeSelectDialogShow(!timeSelectDialogShow)}>
    <div className="flex-1 text-center">{timeSelect}</div>
    <img className="icon-24" src="/pic/icon_select_down.png" alt="" />
    {timeSelectDialogShow && (
        <SelectDialog activeItem={timeSelect} list={timerList} onCancel={(v) =>         setTimeSelect(v)} />
    )}
</div>

// 子组件
interface props {
  list: string[];
  activeItem?: string;
  onCancel: (v: string) => void;
}
export default function SelectDialogPage({ list, activeItem, onCancel }: props) {
  return (
    <div className="select-dialog bw-100 pos-a d-shadow pt-10 pl-10 pr-20 border-    radius-4">
      {list.map((item, idx) => (
        <div key={idx} className="mb-10 d-flex-r ai-center" onClick={() => onCancel(item)}>
          <img className={`icon-20 ${activeItem !== item && 'view-opacity-0'}`} src="/pic/icon_ok.png" alt="" />
          <span className={`ml-5 ${activeItem === item && 'text-color-p'}`}>{item}</span>
        </div>
      ))}
    </div>
  );
}

明白一个道理,如果要封装组件的话,就尽量都弄进组件中,否则将会代码显的特别乱,到后期可能会不好维护.

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 Vue2 下拉框组件封装案例。 ```vue <template> <div class="dropdown"> <div class="dropdown-toggle" @click="toggleDropdown"> {{ currentOption.text }} </div> <ul class="dropdown-menu" v-show="dropdownOpen"> <li v-for="(option, index) in options" :key="index" @click="selectOption(option)" > {{ option.text }} </li> </ul> </div> </template> <script> export default { props: { options: { type: Array, required: true }, defaultOption: { type: Object, default: () => ({ value: null, text: 'Select an option' }) } }, data() { return { dropdownOpen: false, currentOption: this.defaultOption } }, methods: { toggleDropdown() { this.dropdownOpen = !this.dropdownOpen }, selectOption(option) { this.currentOption = option this.dropdownOpen = false this.$emit('option-selected', option) } } } </script> <style> .dropdown { position: relative; display: inline-block; } .dropdown-toggle { cursor: pointer; } .dropdown-menu { position: absolute; top: 100%; left: 0; z-index: 1000; display: none; padding: 0; margin: 0; list-style: none; background-color: #fff; border: 1px solid #ccc; border-radius: 4px; box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); } .dropdown-menu li { padding: 5px 10px; cursor: pointer; } .dropdown-menu li:hover { background-color: #f5f5f5; } </style> ``` 使用方法: ```vue <template> <div> <dropdown :options="options" @option-selected="onOptionSelected" /> </div> </template> <script> import Dropdown from './Dropdown.vue' export default { components: { Dropdown }, data() { return { options: [ { value: 1, text: 'Option 1' }, { value: 2, text: 'Option 2' }, { value: 3, text: 'Option 3' } ] } }, methods: { onOptionSelected(option) { console.log('Selected option:', option) } } } </script> ``` 在这个例子中,我们创建了一个 `Dropdown` 组件,它接受一个 `options` 属性,一个包含下拉框选项的数组。默认选项是 `defaultOption` 属性,如果没有提供,则默认为“选择一个选项”。 当用户点击下拉框时,我们通过 `toggleDropdown` 方法来打开或关闭下拉框。当用户选择一个选项时,我们通过 `selectOption` 方法来更新当前选项,并触发 `option-selected` 事件。 在使用该组件时,我们将 `options` 属性设置为一个包含选项的数组,并监听 `option-selected` 事件来处理用户选择的选项。 这个例子只是一个简单的 Vue2 下拉框组件封装案例,你可以根据自己的需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值