使用场景
地址区域选择
简单使用
安装依赖
npm install naive-ui -D
按需引入之-手动引入
import {NCascader,CascaderOption
} from 'naive-ui'
使用
<n-cascader:value="regionValue":options="regionOptions":multiple="false"placeholder="所在地区"remoteclearablecheck-strategy="child"@load="handleLoad"
/>
增加操作
这里我们是要对收货地址进行一个增加操作。 我们这里只针对所在地址进行说明。
获取region
这里需要通过接口提前请求
const regionOptions = ref([])
// 获取区域列表
const getRegionList = async () => {// 获取region的接口const res = await findBaseRegion()regionOptions.value = res.map((item: CascaderOption) => {return {label: item.regionName,value: item.id,depth: 1,isLeaf: false}});
}
onMounted(() => {getRegionList()
})
接口返回的数据如下:
{"code": 200,"message": "成功","data": [{ "id": 1, "regionName": "华北" },{ "id": 2, "regionName": "华东" },{ "id": 3, "regionName": "东北" },{ "id": 4, "regionName": "华中" },{ "id": 5, "regionName": "华南" },{ "id": 6, "regionName": "西南" },{ "id": 7, "regionName": "西北" }],"ok": true
}
这个数据需要进行格式转换,处理成下面的格式:
[{label: '华北',value: 1, depth: 1,isLeaf: false},...
]
属性说明
属性 | 描述 |
---|---|
label | 标题 |
value | 值 |
depth | 深度,根据depth来判断处在同一级的元素 |
isLeaf | 是否是最后一层,如果为true,后面的数据不再展开 |
我们使用上面处理好的数据,赋值给regionOptions
即可进行渲染。
获取province
接下来我们需要在选择完毕region
以后,根据对应的value去接口请求对应的province
的数据,然后展示出来。
这里涉及到一个异步请求数据的过程,我们这样做
<n-cascader:value="regionValue":options="regionOptions"@load="handleLoad"
/>
绑定load
事件,在load
事件中,接收option
参数
const handleLoad = (option: CascaderOption) => {return new Promise<void>(async (resolve, reject) => {const list = await getProvinceList(option.value as number); if (list.length > 0) {option.children = list;resolve()} else {reject()}})
}
option.value
即为我们选中的value
值,根据这个值去请求getProvinceList
这个接口,最后拿到 provinceList
赋值给option。children
。注意这里的return new Promise
,返回的一定得是一个Promise
,而且必须要resolve
orreject
才能请求成功,不然有个菊花会一直在那爱的魔力转圈圈。
在请求接口的时候,同样的也需要把返回的数据处理成符合规范的数据格式,代码如下:
const getProvinceList = async (id: number) => {const res = await findBaseProvinceByRegionId(id as number)const list:CascaderOption[]= [];for(let i = 0; i < res.length; i ++) {list.push({label: res[i].name,value: `${id}-${res[i].id}`,depth: 2,isLeaf: true})}return list;
}
注意:
value: ${id}-${res[i].id}
,写成这样的原因是它的value值的规则限制是x、x-y、x-y-z这种,比如1,1-2,1-2-3,不知道能不能看懂,看不懂自己实践一下。- depth的值变成了2
- isLeaf: true,表示是最后一层了。
最后通过绑定的value
值,在发生了value
值变化的时候,我们就可以实时拿到他的值了。在所有的数据添加完毕,提交数据的时候,还需要对value值进行处理,因为我们选择完地址以后,发现它的value值是1-1,1-2,1-3
这样的,-
前面的的表示regionId
,-
后面的表示provinceId
,后端需要的是分开传,不是1-1,1-2,1-3
这样的,所以得拆开一下,我也是吐了。我们这里简单的split
一下就行了。
const addstr = regionValue.value.split('-');
modal.value.regionId = addstr[0];
modal.value.provinceId = addstr[1];
添加操作到此为止。
修改操作
这里我们是要对收货地址进行过一个修改操作。修改的话就需要数据回显。我们需要拿到regionList
和对应的privinceList
的数据。
获取regionList
还是和之前一样,没有变化。当我们点击修改
按钮的时候,拿到对应的reginId
去请求privinceList
的数据,代码如下:
// 更新地址
const handleUpdateAdd = (item: any) => {showModal.value = true;editType.value = 'update';regionOptions.value.map(async (n: CascaderOption) => {if (n?.value === item.regionId) {// 根据相同的value值,触发接口请求,处理好的数据,赋值给children即可n.children = await getProvinceList(item.regionId)// 更新绑定的vaue值的格式,跟上面讲的格式一样regionValue.value = `${item.regionId}-${item.provinceId}` as any}})// 对表单默认值覆盖modal.value = {...item}
}
如上代码所示,回显的时候赋值一下value
和children
的值就能正常显示了,必须按照数据格式的要求来。
使用总结
上面啰里八嗦的一大堆,其实是我搞了好半天才摸索出来的,看着其实也没啥难点,只有一点,当初搞崩溃了,就是value
的值怎么触发它都不变化,最后看了一下它这个值的规则,吐血了直接,官方文档也没有说明,只是看它示例中写的1-1, 1-1-1
这样的。一直以为就是选择哪个值它就是那个值,没想它的是根据父级-子级
这样子来的。
最后
最近找到一个VUE的文档,它将VUE的各个知识点进行了总结,整理成了《Vue 开发必须知道的36个技巧》。内容比较详实,对各个知识点的讲解也十分到位。
有需要的小伙伴,可以点击下方卡片领取,无偿分享