start

  • 最近遇到一个需求,给一个移动端项目加一点小功能。
  • 移动端 UI 组件库使用的是 cube-ui。
  • 但是基础的 cube-ui 不太满足我的需求…
  • 重点是记录一下我的思路,其次才是实现的代码。

1. 需求

需要点击按钮弹出一个弹出框,然后再弹出框中可以输入内容,点击确定的时候,调用接口保存。

原生的 cube-ui 仅支持一个输入框,而且这个输入框类型不可控

我接到的需求呢,是支持多个输入框,且输入框类型还不一样。

基础cube-ui的prompt弹出框效果如下图:

2. 寻找解决方案

cube-ui是支持插槽的,具体的代码中createElement这个函数结构有点类似于h函数。

通过这个插槽插入文字图片什么的还是可以的。

我如果通过这个函数,向对话框中,插入几个input框。第一有点麻烦。第二可操作性有点低。

基础cube-ui的弹出框-插槽 代码以及效果如下图:

3. 最终的解决方案

正当我思索的时候,我突发奇想,先看看它的对话框源码是怎么写的。

cube-ui的dialog源码

看了一眼他的源码之后,我有解决方案了。他的源码无非就是一个vue组件。我直接cv一套出来,自己加一些自己的额外定制化配置,这样不就可以符合我的需求了?

4.结果

自定义的 基于 cube-ui的一个对话框

<template><transition name="cube-dialog-fade"><cube-popupref="selfPopup"type="self-dialog":z-index="zIndex":mask="true":center="true"@mask-click="maskClick"@click.stop="say()"><div class="self-dialog-main cube-dialog-main" @click.stop="say()"><!-- <span v-show="showClose" class="cube-dialog-close"><i class="cubeic-close"></i></span> --><div :class="containerClass"><h2 v-if="title || $slots.title" class="cube-dialog-title"><slot name="title"><p class="cube-dialog-title-def">{{ title }}</p></slot></h2><div class="cube-dialog-content"><slot name="content"><div v-if="promptList && promptList.length > 0" class="cube-dialog-content-def"><div v-for="(item, index) in promptList" :key="index"><div>{{ item.label }}</div><div v-if="item.type === 'text' || item.type === 'number'"><cube-inputv-model="item.value":type="item.type":placeholder="item.placeholder"/></div><div v-if="item.type === 'select'"><cube-inputv-model="item.value":type="item.type":placeholder="item.placeholder":readonly="true"@focus="showPicker(item, index)"/></div></div></div></slot></div><div class="cube-dialog-btns" :class="{ 'border-right-1px': isConfirm || isPrompt }"><slot name="btns"><av-if="isConfirm || isPrompt":href="cancelBtn.href"class="cube-dialog-btn border-top-1px":class="{'cube-dialog-btn_highlight': cancelBtn.active,'cube-dialog-btn_disabled': cancelBtn.disabled}"@click="cancel">{{ cancelBtn.text }}</a><a:href="confirmBtn.href"class="cube-dialog-btn border-top-1px":class="{'cube-dialog-btn_highlight': confirmBtn.active,'cube-dialog-btn_disabled': confirmBtn.disabled}"@click="confirm">{{ confirmBtn.text }}</a></slot></div></div></div></cube-popup></transition>
</template><script>
export default {props: {zIndex: {type: Number,default: 100},type: {require: true,type: String,default: 'prompt'},title: {type: String,default: ''},promptList: {type: Array,default() {return []}},cancelBtn: {type: Object,default() {return {href: 'javascript:;',active: false,disabled: false,text: '关闭'}}},confirmBtn: {type: Object,default() {return {href: 'javascript:;',active: true,disabled: false,text: '确认'}}}},data() {return {}},computed: {containerClass() {return `cube-dialog-${this.type}`},isPrompt() {return this.type === 'prompt'},isConfirm() {return this.type === 'confirm'}},methods: {show() {this.$refs.selfPopup.show()},hide() {this.$refs.selfPopup.hide()},maskClick(e) {this.maskClosable && this.cancel(e)},confirm(e) {if (this.confirmBtn.disabled) {return}this.$emit('EVENT_CONFIRM', e, this.promptValue)},cancel(e) {if (this.cancelBtn.disabled) {return}this.$refs.selfPopup.hide()this.$emit('EVENT_CANCEL', e)},close(e) {this.$refs.selfPopup.hide()this.$emit('EVENT_CLOSE', e)},showPicker(item, index) {this.picker = this.$createPicker({title: item.label,data: [item.column],onSelect: (value, i, text) => {this.promptList[index].value = text[0]this.promptList[index].key = value[0]}// onCancel: this.cancelHandle})this.picker.show()},say() {}}
}
</script><style>
.self-dialog-main .cube-input {border: 0.071429rem solid #ebebeb !important;
}
.self-dialog-main .cube-input-field {padding: 0.714286rem !important;
}
</style>

主要差异

主要差异就是对cube-dialog-content的内容进行了扩展,支持传入配置文件进行扩展。其次就是做了一下样式兼容以及点击事件的处理。

演示一下传入的 额外配置文件

 [{type: 'number',value: '',require: true,label: '数量',placeholder: '数量',rules: {positiveInteger: true // 正整数}},{type: 'select',value: '',key: '',label: '原因',require: true,placeholder: '请选择原因',column: [{ text: '破损', value: 'A' },{ text: '丢失', value: 'B' },{ text: '其他', value: 'C' }]},{type: 'text',value: '',label: '其他',placeholder: '请输入'}]

end

  • 当然可能目前认知有限,这个可能不是最优解。
  • 但是这也是一个可以借鉴的思路,基于原本的ui组件,二次创作,满足定制化需求,也不是不可以。
  • 其实我更想说的一个想法是什么,不要仅限于去使用ui框架。总是cv毫无成长。多尝试阅读源码,阅读源码不是目的,学会探究问题的本质才是终点。
  • 加油 互勉。

自定义 cube-ui 弹出框dialog支持多个且多种类型的input框相关推荐

  1. Android自定义底部弹出窗-dialog(2种实现分析+源码)

    Android自定义底部弹出窗-dialog(2种实现分析+源码) 上线项目功能抽取,在项目开发中,我们会在许多地方会用到底部自定义弹窗,比如设置:个人账户退出,切换,照片的拍照或者相册的调出,或者一 ...

  2. element-UI 弹出组件dialog的遮罩层在弹出层的上面 - 解决篇

    element-UI 弹出组件的遮罩层在弹出层dialog模态框的上面? bug演示: 代码逻辑调整之后,页面就正常了(代码和效果图 · 见下文): 解决办法: 将dialog组件剪贴到最父级div元 ...

  3. element ui 弹出网页 像layui弹出url一样 iframe element ui 弹出层嵌入网页

    element ui 弹出层嵌入网页 <template><div id="app"><img src="./assets/logo.png ...

  4. ios点击大头针气泡不弹出_百度地图使用(二)自定义大头针和弹出气泡

    百度地图使用(二)自定义大头针和弹出气泡 (2014-08-19 10:37:09) 标签: 时尚 分类: IOS http://www.aichengxu.com/article/系统优化/1149 ...

  5. element ui 弹出组件的遮罩层在弹出层的上面的解决方法

    element ui 弹出组件的遮罩层在弹出层的上面的解决方法 参考文章: (1)element ui 弹出组件的遮罩层在弹出层的上面的解决方法 (2)https://www.cnblogs.com/ ...

  6. 安卓开发弹窗activity风格_安卓两种底部弹出窗dialog实现方式

    [实例简介]安卓两种底部弹出窗dialog实现方式,一种是列表弹窗实现,2是灵活底部弹窗,传入布局以及控件id [实例截图] [核心代码] package com.kx.kxbottomdialog; ...

  7. 征服number类型的input框

    在移动端H5页面开发中,有时候会有一些数值输入方面的需求.如果需要让用户比较方便地输入小数.负数,最简单的方式是使用number类型的input框,输入时软键盘会切换为数字键盘方便输入(ios是带数字 ...

  8. php和jquery ui弹出框,JavaScript_jQuery弹出框代码封装DialogHelper,看了jQueryUI Dialog的例子,效果 - phpStudy...

    jQuery弹出框代码封装DialogHelper 看了jQueryUI Dialog的例子,效果还不错,就是用起来有点儿别扭,写出的代码有点拧巴,需要再封装一下!于是就有了下面这个简单的Dialog ...

  9. jquery控件-实现自定义样式的弹出窗口和确认框

    在前不久分享了一个基于wpf的自定义弹出框:[wpf控件-自定义美化版MessageBox弹出框控件(扁平化.多样式动画效果)].今天跟大家分享一个jquery的自定义插件:MBox. 啥也不说,先上 ...

最新文章

  1. java date只保留年月日_Java日期时间API系列14-----Jdk8中日期API类,日期计算1,获取年月日时分秒等...
  2. 2019小程序没必要做了_2019微信小程序的发展前景怎么样?有必要开发微信小程序吗?...
  3. Python运维-获取当前操作系统的各种信息
  4. 两年了,你还是那个你 | 今日最佳
  5. mpvue v-html解决方案,mpvue开发小程序所遇问题及h5转化方案
  6. html日期只显示7天,vue+elementui 只能选7天内的日期
  7. RANSAC与圆柱拟合
  8. sql server 高可用故障转移(6)
  9. css3制作俩面翻转盒子效果
  10. wamp修改默认80端口
  11. android生命周期_Android片段生命周期
  12. 每天一道剑指offer-二进制中1的个数
  13. python能开发手机app吗_python开发手机app和java相比,缺点是什么?
  14. 不积跬步无以至千里(C语言笔记)
  15. 最常见的开源游戏引擎
  16. 《论文写作》心得体会
  17. 青龙面板运行·小米改步
  18. 链塔智库|区块链产业要闻及动态周报(2021年8月第4周)
  19. 在Vue中调用微信的扫描二维码功能
  20. 为什么打不开计算机音乐模式,电脑中酷狗音乐无法打开的解决方法

热门文章

  1. 哪种蓝牙耳机最好?最具人气的十大蓝牙耳机品牌
  2. python暴打“冠状病毒”小游戏
  3. 逐浪帅宋-一款极具匠心打造的斜体汉字
  4. pytorch - directml 中查看设备支持情况
  5. 极坐标积分 matlab,matlab有关的极坐标与球面坐标计算三重积分0.ppt
  6. Ant design vue动态主题切换的坑与一般性方法
  7. win10系统cmd命令失效解决办法
  8. LPS保护功能的实现
  9. oracle中rowid列,Oracle中的rowid
  10. 【Unity3D】固定管线着色器二