自定义数字键盘组件化方案

实现场景:点击输入框,弹出自定义数字键盘,输入数字后点击确定,输入框中显示对应数字。如果输入框中有值,则默认带到小键盘中。

其中:数字键盘为子组件。输入框公用该子组件。

效果图如下:

难点:

1、props传入数字键盘组件中的值,无法直接修改。需要通过计算属性进行修改。

2、公用键盘时,保证符合预期,数字不会错乱。使用v-for,巧用name属性,通过点击时更改传入的参数,达到目的。

下面时完整代码:

index.vue

<template>
    <view class="content">
        <image class="logo" src="/static/logo.png"></image>
        <view v-for="(value,name) in numValuelist" :key="name">
            <view class="text-area" v-if="name==‘X‘">
                默认正:<input  :value="value"  @click="showKeyPad(name,‘0‘)">
            </view>
            <view class="text-area" v-if="name==‘Y‘">
                默认负:<input  :value="value" @click="showKeyPad(name,‘1‘)">
            </view>
        </view>
        <NumKeypad :enteringIsShow="enteringIsShow" :inputname="inputname"  fontSize="20px" :isminus="isminus"  :passNum="numValue"  @NumValue="GetNumValue"></NumKeypad>
    </view>
</template>

<script>
    import NumKeypad from "../Keypad/NumKeypad.vue";
    export default {
        data() {
            return {
                title: ‘Hello‘,
                enteringIsShow:false,//控制键盘显示隐藏
                inputname:‘‘,
                isminus:‘0‘,//是否为负数 1为负数
                numValue:‘‘,
                numValuelist:{"X": "","Y": ""},
            }
        },
        onLoad() {

        },
        components:{
            NumKeypad
        },
        methods: {
            GetNumValue(value,inputname) {
                this.numValuelist[this.inputname]=value;
                this.enteringIsShow=false;
            },
            showKeyPad(v,i,t){
                this.enteringIsShow=true;
                this.inputname=v;
                this.numValue=this.numValuelist[this.inputname];
                this.isminus=i;
            },
        }
    }
</script>

<style>
    .content {
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
    }

    .logo {
        height: 200rpx;
        width: 200rpx;
        margin-top: 200rpx;
        margin-left: auto;
        margin-right: auto;
        margin-bottom: 50rpx;
    }

    .text-area {
        display: flex;
        justify-content: center;
    }

    .title {
        font-size: 36rpx;
        color: #8f8f94;
    }
</style>

NumKeyPad.vue

<template>
    <view v-if="enteringIsShow">
        <!--  v-if="enteringIsShow" -->
        <view class="con-backdrop">
            <view class="view-backdrop uni-ellipsis">{{ChangeNum}}</view>
            <view class="btnBox">
                <view class="btn-backdrop" @tap="Compute(‘1‘)">1</view>
                <view class="btn-backdrop" @tap="Compute(‘2‘)">2</view>
                <view class="btn-backdrop" @tap="Compute(‘3‘)">3</view>

                <view class="btn-backdrop" @tap="Compute(‘clear‘)">清空</view>
                <view class="btn-backdrop" @tap="Compute(‘4‘)">4</view>
                <view class="btn-backdrop" @tap="Compute(‘5‘)">5</view>
                <view class="btn-backdrop" @tap="Compute(‘6‘)">6</view>

                <view class="btn-backdrop" @tap="Compute(‘delete‘)">退格</view>
                <view class="btn-backdrop" @tap="Compute(‘7‘)">7</view>
                <view class="btn-backdrop" @tap="Compute(‘8‘)">8</view>
                <view class="btn-backdrop" @tap="Compute(‘9‘)">9</view>

                <view class="btn-backdrop" @tap="Compute(‘.‘)">.</view>
                <view class="btn-backdrop" @tap="Compute(‘-‘)">-</view>
                <view class="btn-backdrop" @tap="Compute(‘0‘)">0</view>
                <view class="btn-backdrop" @tap="Compute(‘+‘)">+</view>

                <view class="btn-backdrop color-blue" @tap="Compute(‘ok‘)">确认</view>
            </view>
        </view>
    </view>
</template>

<script>
    export default {
        data (){
            return {
                entering:‘‘,
                isFirstRender:true
            }
        },
        props:{
            enteringIsShow:{
                type: Boolean,
                default: false
            },
            fontSize: {
                type: String,
                default: "20px"
            },
            isminus: {
                type: String,
                default: "0"
            },
            inputname:{
                type: String,
                default: ""
            },
            passNum:{
                type: String,
                default: ""
            }
        },
        computed: {
            ChangeNum () {
                this.isFirstRender?this.entering=this.passNum:null
                return this.entering
            }
        },
        methods: {
            Compute(e) {
                this.isFirstRender=false
                if (e == ‘ok‘) {
                    //确认
                    if ((this.entering.length == 1 && (this.entering[0] == ‘+‘ || this.entering[0] == ‘-‘))||this.entering.substring(this.entering.length-1)==".") {

                        return
                    }
                    this.$emit(‘NumValue‘, this.entering,this.inputname);
                    this.isFirstRender = true;
                } else if (e == ‘delete‘) {
                    //退格
                    this.entering = this.entering.substring(0, this.entering.length - 1);
                } else if (e == ‘+‘ || e == ‘-‘) {
                    //正负号
                    this.entering[0] != ‘+‘ && this.entering[0] != ‘-‘ ? this.entering = e + this.entering : this.entering = this.entering.substr(0, 0) + e + this.entering.substr(1)
                } else if (e == ‘.‘) {
                    //小数点
                    let temBoolean = true;
                    for (let i = 0; i < this.entering.length; i++) {
                        this.entering[i] == ‘.‘ ? temBoolean = false : null
                    }
                    this.entering.length == 0 || (this.entering.length == 1 && this.entering[0] == ‘+‘) || (this.entering.length == 1 && this.entering[0] == ‘-‘) ? temBoolean = false : null,
                    temBoolean ? this.entering += e : null
                }else if (e == ‘clear‘) {
                    //清空
                    this.entering = ‘‘
                }else {
                     //数字
                     if(e=="0"&&this.entering.length==0)//首位是0
                     {
                         this.entering= this.entering+"0.";
                     }
                     else{
                         this.entering += e;
                     }

                    if(this.isminus==‘1‘&&this.entering[0]!="+"&&this.entering[0]!="-"){//默认是负数
                        this.entering="-"+this.entering;
                    }
                }

            },
        }
    }
</script>

<style>
/* 数字键盘弹出 */
.backdrop {
    width:100%;
    height: 100%;
    background: #333;
    opacity: 0.5;
    z-index: 998;
}

.delete {
    width: 100%;
    height: 120px;
    line-height: 120px;
    text-align: center;
    position: absolute;
    top: 100%;
}

.delete image {
    width: 40px;
    height: 40px;
    vertical-align: middle;
}

.con-backdrop {
    width:100%;
    height: 305px;
    position: fixed;
    bottom: 0;
    left: 0;
    margin: auto;
    z-index: 999;
    background: #f7f7f7;
    border-radius: 6px;
}

.btnBox {
    padding: 0 15px;
    display: flex;
    justify-content: space-between;
    flex-wrap: wrap;
}

.btn-backdrop {
    width: 23%;
    height: 50px;
    line-height: 50px;
    text-align: center;
    font-size: 20px;
    background: #fff;
    margin-bottom: 10px;
    border-radius: 6px;
    border: solid 1px #eee;
    cursor: pointer;
}

.btn-backdrop:hover {
    background: #efefef;
}

.view-backdrop {
    width: 90%;
    height: 40px;
    line-height: 40px;
    text-align: right;
    font-size: 25px;
    padding: 5px 15px;
}
.color-blue{
    color: #fff;
    background: #0078ff;
}
/* 文本溢出隐藏 */
.uni-ellipsis {overflow: hidden; white-space: nowrap; text-overflow: ellipsis;}
</style>

原文地址:https://www.cnblogs.com/liangtao999/p/12695194.html

时间: 2024-08-27 18:52:51

自定义数字键盘组件化方案的相关文章

iOS 组件化方案

概述 近一年iOS业界讨论组件化方案甚多,大体来说有3种. Protocol注册方案 URL注册方案 Target-Action runtime调用方案 URL注册方案据我了解很多大公司都在采用,蘑菇街 App 的组件化之路(http://limboy.me/tech/2016/03/10/mgj-components.html)蘑菇街的Limboy在这篇博客中做了很详尽的阐述 Target-Action runtime调用方案Casa在 iOS应用架构谈 组件化方案(http://casatw

一个高仿闲鱼键自定义数字键盘特效

博客地址: http://www.jianshu.com/p/be68facfc4b8 仿造android端闲鱼发布选择价格数字键盘,自定义数字键盘 public class MyKeyBoardView extends KeyboardView { private Context mContext; private Keyboard mKeyBoard; public MyKeyBoardView(Context context, AttributeSet attrs) { super(con

Android 自定义数字键盘

业务需求自定义数字键盘,写了一个demo 主要代码: import android.app.Activity; import android.content.Context; import android.graphics.drawable.ColorDrawable; import android.util.DisplayMetrics; import android.view.View; import android.view.WindowManager; import android.vi

Android组件化方案

1为什么要项目组件化 2如何组件化 3组件化实施流程 1组件模式和集成模式的转换 2组件之间AndroidManifest合并问题 3全局Context的获取及组件数据初始化 4library依赖问题 5组件之间调用和通信 6组件之间资源名冲突 4组件化项目的工程类型 1app壳工程 2功能组件和Common组件 2业务组件和Main组件 5组件化项目的混淆方案 6工程的buildgradle和gradleproperties文件 1组件化工程的buildgradle文件 2组件化工程的grad

iOS开发之自定义表情键盘(组件封装与自动布局)

下面的东西是编写自定义的表情键盘,话不多说,开门见山吧!下面主要用到的知识有MVC, iOS开发中的自动布局,自定义组件的封装与使用,Block回调,CoreData的使用.有的小伙伴可能会问写一个自定义表情键盘肿么这么麻烦?下面将会介绍我们如何用上面提到的东西来定义我们的表情键盘的.下面的内容会比较多,这篇博文还是比较有料的. 还是那句话写技术博客是少不了代码的,下面会结合代码来回顾一下iOS的知识,本篇博文中用到的知识点在前面的博客中都能找到相应的内容,本篇算是一个小小的功能整合.先来张图看

iOS自定义数字键盘

自定义键盘实际就是设置UITextField的inputView属性,首先我们要做的是自定义一个UIView,实现键盘的样式. 自定义View代码如下: 1 #import <UIKit/UIKit.h> 2 //创建自定义键盘协议 3 @protocol My_KeyBoardDelegate <NSObject> 4 //创建协议方法 5 @required//必须执行的方法 6 - (void)numberKeyBoard:(NSInteger) number; 7 - (v

CSS的组件化方案:OOCSS + BEM

CSS由于缺少命名空间,所有的class都是全局的,所以大团队项目如果没有良好的命名规范,会容易失控. 举例实现以下效果: 通过 class + tag .pageButtons { display: flex; justify-content: center; } .pageButtons button{ width: 80px; height: 30px; margin: 5px; border-radius: 4px; border: none; font-size:13px; curso

GridLayout自定义数字键盘(两个EditText)

功能说明: 适用于两个EditText输入框,并控制输入字符的长度,点击键盘中的"确定"按钮完成输入,点击"前一项"光标跳到前一个EditText 运行效果图如下: 布局文件 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/androi

html5自定义数字键盘

原理:使用div模拟输入框,避免手机原生键盘弹出,键盘使用div模拟,点击事件使用js控制,光标闪烁使用css模拟,具体代码如下: 1 <!doctype html> 2 <html lang="zh"> 3 <head> 4 <meta charset="UTF-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge,ch