vue2 开发记录

文章介绍了如何修改El-Select组件的选择项样式,包括解决默认样式限制和调整行高的问题,以及如何自定义filter-method实现模糊搜索。还讨论了多选回显、双向绑定和数据更新的问题及解决方案。
摘要由CSDN通过智能技术生成

el-select

如何修改选择项的样式/el-select-dropdown__item 文字上下显示  

测试代码

        <div style='margin-left: 100px'>
            <!--            测试代码-->
            <el-select filterable
                       size='mini'>
                <div class='xxx-el-select'>
                    <el-option
                        v-for='item in [{key:1,des:2,value:3}]'
                        :key='item.value'
                        :label='item.key'
                        :value='item.value'>
                        <span style='margin-right: 5px;'>{{ item.key }}</span>
                        <br>
                        <span style='color: #8492a6; font-size: 12px'>{{ item.des }}</span>
                    </el-option>
                </div>
            </el-select>
        </div>

默认的样式为

可以看到设置的换行没有显示第二行的内容,原因是默认的选项的行高限制了显示,第二行内容被遮挡了。查看元素可以看到代码中是有值的。

尝试调整.el-select-dropdown__item的style

可以看到修改后其实选项是可以按照预期显示的,那么修改样式即可。

解决方法

在外套一层div,然后通过div的class xxx-el-select-select 在使用::v-deep 修改样式。

<style scoped lang='scss'>

.xxx-el-select {
    ::v-deep .el-select-dropdown__item {
        margin-bottom: 8px;
        height: auto;
        line-height: 20px !important;
    }
}



</style>

修改后的效果

filter-method 自定义搜索方法,使用示例(全部模糊搜索)

示例

测试代码

前端

<el-select
                v-model='t_value'
                multiple
                filterable
                @focus='()=>{this.filterOptions=this.options}'
                :filter-method='filterSelectMethod'
                default-first-option
                placeholder='请选择文章标签'>
                <el-option
                    v-for='item in filterOptions'
                    :key='item.value'
                    :label='item.label'
                    :value='item.value'>
                    <span style='float: left'>{{ item.label }}</span>
                    <span style='float: right; color: #8492a6; font-size: 13px'>{{ item.value }}</span>
                </el-option>
            </el-select>

@focus='()=>{this.filterOptions=this.options}'

是为了测试阶段的初始化搜索的列表

data()

// 测试代码-s
            t_value: '',
            options: [
                {
                    value: '网页',
                    label: 'HTML'
                }, {
                    value: '样式',
                    label: 'CSS'
                }, {
                    value: '代码',
                    label: 'JavaScript'
                }

            ],
            filterOptions: []
            // 测试代码-e

func

// 测试代码-s
        filterSelectMethod(queryValue) {
            if (!this.filterOptions.length) {
                // 先拷贝一份 后续基于这里搜索
                this.filterOptions = this.options;
            }
            if (!queryValue) {//搜索框没传值就重新赋值
                this.filterOptions = this.options;
                return;
            }

            this.filterOptions = [];
            this.options.length &&
            this.options.forEach((item) => {
                if (item.value.indexOf(queryValue) !== -1 || item.label.indexOf(queryValue) !== -1) {
                    this.filterOptions.push(item);//把匹配到的数据push
                }
            });

        }
        // 测试代码-e

element el-select multiple 封装后/多选不能回显、select多选回显之后不能正常编辑,清除 

笔者出现此错误时的使用的双向绑定方案为computed   

根据笔者的反复测试,确定更换数据的双向绑定方案为watch 实现即可解决无法编辑的问题,

实例代码,labelOptions 数据部分自行输入测试数据

<template>
    <el-select
        v-bind="$attrs"
        v-model='select_value'
        collapse-tags
        multiple
        placeholder='请选择'
        clearable>
        <el-option
            v-for='item in labelOptions'
            :key='item.id'
            :label='item.name'
            :value='item.id'>
        </el-option>
    </el-select>
</template>

<script>
import { interface_labels } from '@/api/api';

export default {
    name: 'SelectInterfaceLabels',
    inheritAttrs : false,
    props: {
        // 接受外部传入的初始选中值
        value: {
            type: Array,
            default: () => [],
            required: true
        }
    },

    data() {
        return {
            select_value: this.value,
            labelOptions: []
        };
    },
    mounted() {
    },
    watch: {
        value(newValue) {
            this.select_value = newValue;
        },
        select_value(newValue) {
            this.$emit('input', newValue);
        }
    },
    methods: {

    },




};
</script>

但是其实问题的关键在于值的双向绑定无法从子组件同步到父组件,笔者通过给父组件的中绑定值的根对象显式声明此值后修复了此问题

例如原本你绑定饿的是

obj.xxx     其实xxx在obj中没有显式的书写出来,需要你先在对象中书写一个默认值。

即从

export default {
    name: '12',
    data() {
        return { 
           obj :{
               
           }
        };
    },
};

改为

export default {
    name: '12',
    data() {
        return { 
           obj :{
               xxx: null,
           }
        };
    },
};

6. 循环嵌套层级太深,视图不更新?

看到网上有些人说数据更新的层级太深,导致数据不更新或者更新缓慢从而导致试图不更新?

由于我没有遇到过这种情况,在我试图重现这种场景的情况下,发现并没有上述情况的发生,所以对于这一点不进行过多描述(如果有人在真实场景下遇到这种情况留个言吧)。

针对上述情况有人给出的解决方案是使用强制更新:

如果你发现你自己需要在 Vue 中做一次强制更新,99.9% 的情况,是你在某个地方做错了事。
vm.$forceUpdate()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Franciz小测测

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值