【问题标题】:Custom Icon for Select Drop Down based on value reactjs基于值reactjs的Select Drop Down的自定义图标
【发布时间】:2020-03-05 21:59:45
【问题描述】:

我是react 的新手。我正在使用ANT JS 库。在这里,我使用的是Ant js Select

这是我的select 代码,看起来像这样

<div>
    <Form.Item label="Choose  Configuration" >
        {getFieldDecorator('select', {
            valuePropName: 'option',
            rules: [{ required: true }],
            onChange: (value) => { this.onConfigNameChange(value) },
             />

        })(
            <Select  mode="single" placeholder="Please select Configuration"  >
                {
                    this.state.dbConfigList.map((dbConfig) => (
                        <Option value={JSON.stringify(dbConfig)}>{dbConfig.name}</Option>
                    ))
                }
            </Select>
        )}
    </Form.Item>
</div >

在 dbConfigList 中,我有一个看起来像这样的对象。

(4) [{…}, {…}, {…}, {…}]
0: {id: 1, name: "first config", data: "{"host":"localhost","type":"elastic"}"}
1: {id: 2, name: "second config", data: "{"host":"129.242.3.3","type":"mysql"}"}
2: {id: 3, name: "third config", data: "{"host":"192.168.12.1","type":"mongo"}"}
3: {id: 4, name: "fourth config", data: "{"host":"localhost","type":"mysql"}"}

我将在下拉select 选项中显示name,如上面的代码所示。基于name,我想从对象中的data中取出type。接下来,我想根据类型将icon显示到带有name的选择下拉列表中。

这是我尝试过的,

<Select  mode="single" placeholder="Please select Configuration"  >
    {
        this.state.dbConfigList.map((dbConfig) => (
            <Option value={JSON.stringify(dbConfig)}><Icon icon="database" iconSize={20} color="violet" />{dbConfig.name}</Option>
        ))
    }
</Select>

我在选项中传递了icon。它显示如下图,

我不想要相同的颜色。我想根据类型制作图标颜色。 比如green 对应mysqlviolet 对应elasticgrey 对应mongo。我不知道如何使它成为可能。那么如何在选择中为值制作自定义图标。我搜索了堆栈溢出,但找不到任何答案。帮我解决一些问题。

所需输出:

【问题讨论】:

    标签: html css reactjs react-native select


    【解决方案1】:

    您可以将颜色作为属性包含在 dbConfigList 中的对象中:就像您拥有主机和类型添加颜色一样。 然后在您的选择代码中,您可以这样:

    <Select  mode="single" placeholder="Please select Configuration"  >
    {
        this.state.dbConfigList.map((dbConfig) => (
            <Option value={JSON.stringify(dbConfig)}><Icon icon="database" iconSize={20} color={dbConfig.color} />{dbConfig.name}</Option>
        ))
    }
    

    【讨论】:

    • 感谢您的回复。我在数据中添加了颜色。 data 是字符串的形式。如何 JSON 解析 data 并从中获取颜色。
    • 您能发布新的 dbConfig 列表吗?
    • (4) [{…}, {…}, {…}, {…}] 0: {id: 1, name: "first config", data: "{"host":"localhost","type":"elastic", "color":"blue"}"} 1: {id: 2, name: "second config", data: "{"host":"129.242.3.3","type":"mysql","color":"green"}"} 2: {id: 3, name: "third config", data: "{"host":"192.168.12.1","type":"mongo","color":"grey"}"} 3: {id: 4, name: "fourth config", data: "{"host":"localhost","type":"mysql","color":"green"}"}
    • 这里的数据是字符串的形式
    • dbConfig[0].data.color 应该返回蓝色。尝试在您的控制台上显示它以确保您能够首先获得颜色属性。另外,我认为它已经是一个字符串,所以不需要转换。诀窍是确保您实际上获得了颜色值
    【解决方案2】:

    你可以像这样定义颜色图:

       const colorMap = {
          mysql : "green",
          elastic : "violet",
          mongo:"grey"
    }
    

    并使用它:

    <Select  mode="single" placeholder="Please select Configuration"  >
        {
            this.state.dbConfigList.map((dbConfig) => {
                var dbData = JSON.parse(dbConfig.data);
                return (
                <Option value={JSON.stringify(dbConfig)}>
                    <Icon ... color={colorMap[dbData.type] || "red"} />{dbConfig.name}
                </Option>)
            })
        }
    </Select>
    

    【讨论】:

    • 谢谢.. 但是data 是字符串形式的。如何 JSON 解析数据并从中获取类型。
    • JSON.parse(dbConfig)有问题吗?
    • @Auticcat,我无法从数据中获取类型。dbConfig.data.type。它是空的。
    • @Kiddy 您可以使用var dbData = JSON.parse(dbConfig.data) 并使用dbData.type 访问类型
    • @tunapq,但是将 JSON.parse 放在哪里。如果我创建了一个新的 dbdata,那么如何将其映射到选择。我使用 dbconfig 列表映射选择。如何在其中使用dbdata
    猜你喜欢
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 2022-01-25
    • 1970-01-01
    相关资源
    最近更新 更多