Naive UI 选择器 Select 的:render-label 怎么使用(Vue3 + TS)

项目场景:

在Naive UI 的 选择器 Select组件中 ,如何实现下面的效果 ,在下拉列表中,左边展示色块,右边展示文字。

Naive UI 的官网中提到过这个实现方法,有一个render-label的api,即: 选项标签渲染函数,
但是我个人感觉官网的写法比较晦涩难懂,下面我展示一下比较容易理解的写法

官网:[https://www.naiveui.com/zh-CN/os-theme/components/select#max-tag-count.vue]
例如:项目场景:示例:通过蓝牙芯片(HC-05)与手机 APP 通信,每隔 5s 传输一批传感器数据(不是很大)

解决方案:

1、vue代码

<template>

 <n-select class="flex-1" :to="false" clearable filterable v-model:value="rank" :options="ranks" 
 label-field="name" value-field="name" placeholder="等级选择" :render-label="renderLabel">
 </n-select>
 
</template>

2、js代码

import { NSelect, type SelectOption } from 'naive-ui';//引入模块

const rank = ref<string | null>()
const ranks = ref<any[]>([
		 {name: 'AA', color: '#2892C6'}{name: 'BB', color: '#8DB8A4'}{name: 'CC', color: '#D7E37D'}{name: 'DD', color: '#FCCF50'}
		 ])
/**
* renderLabel函数 
*/

//定义了一个名为 renderLabel 的常量函数,
//该函数接受一个类型为 SelectOption 的参数 option。
//SelectOption 类型应该是一个接口或类型别名,定义了选项对象的结构。
//函数返回一个 VNodeChild 类型的值,这是 Vue 中用来表示虚拟节点(VNode)的类型。
const renderLabel = (option: SelectOption): VNodeChild => {
//在函数内部,首先检查 option 对象的 type 属性是否等于字符串 'group'。如果是,那么函数会返回一个虚拟节点,该节点是一个 <span> 元素,其文本内容是 option.name 属性值后跟字符串 (Cool!)。
//这一步的目的是为了处理特定类型的选项,即当选项的类型是 'group' 时,执行特定的渲染逻辑。
    if (option.type === 'group') {
        return h('span', `${option.name}(Cool!)`);
    }
  // //这里就是我们创建的色块 用来显示色块的 ,你可以使用 h 函数来创建虚拟节点
  //如果 option 不是分组类型,函数会创建一个名为 colorBlock 的虚拟节点,这是一个 <span> 元素,
  //用于显示颜色块。h 函数是 Vue 提供的用于创建虚拟节点的函数。
  //这个 <span> 元素有一个类名 color-block 和一系列内联样式,包括背景颜色 backgroundColor,它是从 option.color 属性获取的。
    const colorBlock = h('span', {
        class: 'color-block',
        style: {
            backgroundColor: option.color,
            display: 'inline-block',
            width: '16px',
            height: '16px',
            lineHeight: '16px',
            marginRight: '8px',
            verticalAlign: 'middle'
        }
    });
    //这里就是我们创建的文本标签 用来显示文字的
    //接下来,创建一个名为 name 的虚拟节点,它也是一个 <span> 元素,用于显示选项的名称。这里使用类型断言 as string 来确保 option.name 是一个字符串类型,
    //这里as string 来确保 option.name 是一个字符串类型的原因主要是在某些情况下,即使变量实际上是字符串类型,TypeScript 编译器可能也无法推断出正确的类型。这可能是因为类型推断的逻辑不够复杂,无法处理特定的代码模式,其次是避免运行时错误 
    const name = h('span', option.name as string);
    // 返回包含颜色块和标签的数组
    return [colorBlock, name];
};


好的,下面是一个简单的示例代码: 首先,需要安装 Naive UI 组件库和相关依赖: ``` npm install naive-ui -S npm install @vue/composition-api -S ``` 然后,创建一个名为 `ProvinceCityArea.vue` 的组件,代码如下: ```vue <template> <n-tree :data="data" v-model:value="selected" :accordion="false" :is-item-active="isItemActive" :render-label="renderLabel" /> </template> <script lang="ts"> import { defineComponent, ref } from '@vue/composition-api' import { NTree } from 'naive-ui' import { City, getProvinces } from '@/utils/city' export default defineComponent({ name: 'ProvinceCityArea', components: { NTree }, setup() { const data = ref<Array<any>>([]) const selected = ref<string[]>([]) const isItemActive = (item: any) => { return selected.value.includes(item.code) } const renderLabel = (item: any) => { return `${item.name} (${item.code})` } const loadData = () => { const provinces = getProvinces() data.value = provinces.map((province: any) => { const cities = City[province.code] || [] return { name: province.name, code: province.code, children: cities.map((city: any) => { const areas = City[city.code] || [] return { name: city.name, code: city.code, children: areas.map((area: any) => { return { name: area.name, code: area.code } }) } }) } }) } loadData() return { data, selected, isItemActive, renderLabel } } }) </script> ``` 上面代码中,我们通过 `n-tree` 组件来渲染省市区选择树。 `data` 是用于存储树形结构数据的数组,`selected` 用于存储当前选中的结点的 `code` 值。 `isItemActive` 方法用于判断某个结点是否被选中,通过判断 `selected` 数组中是否包含该结点的 `code` 值来实现。 `renderLabel` 方法用于渲染结点标签,这里我们展示的是结点的名称和 `code` 值。 `loadData` 方法用于加载数据,我们通过 `getProvinces` 方法来获取所有的省份数据,然后逐个遍历并构造树形结构数据。 在 `ProvinceCityArea.vue` 组件中引入 `City` 和 `getProvinces` 方法是因为我们需要用到这些数据来构造树形数据。 最后,我们在需要使用省市区选择树的地方,像使用其他组件一样使用 `ProvinceCityArea` 组件即可。 ```vue <template> <province-city-area /> </template> <script lang="ts"> import { defineComponent } from '@vue/composition-api' import ProvinceCityArea from '@/components/ProvinceCityArea.vue' export default defineComponent({ name: 'App', components: { ProvinceCityArea } }) </script> ``` 以上就是使用 Naive UI 组件库中的 `n-tree` 组件生成一个省市区选择树的示例代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值