【问题标题】:How to set chip color individually如何单独设置芯片颜色
【发布时间】:2019-03-11 01:43:30
【问题描述】:

我创建了一个仅接受有效电子邮件地址的输入字段,并将每个地址放入一个芯片中。如果它看到无效的电子邮件,则该输入的芯片颜色设置为红色。但是,当它看到无效的电子邮件时,所有筹码都会变成红色(见下图)。如何仅将无效电子邮件芯片的颜色设置为红色?

这是我的代码:

模板:

<template>
<v-combobox v-model="chips"
            label="Emails"
            chips
            clearable
            solo
            :rules="emailRules"
            multiple>
    <template v-slot:selection="data">
        <v-chip :selected="data.selected"
                close
                :color="color"
                @input="remove(data.item)">
            <strong>{{ data.item }}</strong>&nbsp;
        </v-chip>
    </template>
</v-combobox>

脚本:

<script>
export default {
    data() {
        return {
            color: '',
            value: false,
            chips: [],
            emailRules: [
                v => {
                    if (!v || v.length < 1)
                        return 'Input is required';
                    else if (v.length > 0) {
                        for (let i = 0; i < v.length; i++) {
                            if (!(/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,24}))$/.test(v[i]))) {
                                this.color = "red";
                                return 'Invalid email';
                            } else {
                                this.color = "gray";
                            }
                        }
                    }
                    else return true;
                }
            ]
        }
    },

    methods: {
        remove(item) {
            this.chips.splice(this.chips.indexOf(item), 1)
            this.chips = [...this.chips]
        }
    }
}

我是 VueJS 的新手,所以我真的不知道这里的东西是如何工作的,而且我在网上没有看到任何可以帮助我的东西。无论如何,谢谢!

【问题讨论】:

    标签: vue.js vuetify.js


    【解决方案1】:

    您需要为每个项目设置颜色,而不是全局颜色。您可以尝试使用方法:

    <v-combobox v-model="chips"
                label="Emails"
                chips
                clearable
                solo
                :rules="emailRules"
                multiple>
        <template v-slot:selection="data">
            <v-chip :selected="data.selected"
                    close
                    :color="getColor(data.item)"
                    @input="remove(data.item)">
                <strong>{{ data.item }}</strong>&nbsp;
            </v-chip>
        </template>
    </v-combobox>
    

    然后定义方法getColor

    methods: {
        getColor (v) {
    
                if (!(/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,24}))$/.test(v))) {
                    return "red";
                } else {
                    return "gray";
                }
         }
    
    }
    

    【讨论】:

    • 您好!谢谢回答!您的代码不起作用,因为v 返回了芯片属性,如果输入v.length,它返回芯片内的字符数,因此它将检查电子邮件地址的每个字符。但是,你的回答帮助我得到了正确的答案——如果你在你的答案中删除外部 if-else 语句和 for 循环,我会接受:D。如果您删除它们,它会完美运行,只留下if (!(/^((.... this.color = "gray"; 非常感谢!你救了我!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2021-12-17
    • 2015-07-13
    • 2019-04-22
    • 2023-04-08
    • 2021-10-21
    相关资源
    最近更新 更多