uniapp踩坑之项目:uniapp数字键盘组件—APP端

news/2024/7/10 22:34:47 标签: uni-app, es6, vue.js, 前端, javascript

//在components文件夹创建digitKeyboard文件夹,再创建digitKeyboard.vue

<!-- 数字键盘 -->
<template>
    <view class="digit-keyboard">
        <view class="digit-keyboard_bg" @tap="hide"></view>
        <view class="digit-keyboard_area">
            <!-- <view class="input-area">
                <view class="item">{{label}}:</view>
                <view class="item">
                    <input :placeholder="inputVal" v-model="val" class="input" @input="input" disabled />
                </view>
                <view class="item">
                    <button type="primary" size="mini" @tap="confirm">确定</button>
                </view>
            </view> -->
            <view class="number-area">
                <view class="item" @tap="modifyNum(1)">1</view>
                <view class="item" @tap="modifyNum(2)">2</view>
                <view class="item" @tap="modifyNum(3)">3</view>
                <view class="item" @tap="modifyNum('del')">
                    <icon type="cancel" size="20" />
                </view>
                <view class="item" @tap="modifyNum(4)">4</view>
                <view class="item" @tap="modifyNum(5)">5</view>
                <view class="item" @tap="modifyNum(6)">6</view>
                <view class="item" @tap="modifyNum('add')">加1</view>
                <view class="item" @tap="modifyNum(7)">7</view>
                <view class="item" @tap="modifyNum(8)">8</view>
                <view class="item" @tap="modifyNum(9)">9</view>
                <view class="item" style="background-color:#2278FA;color: #ffffff;" @tap="confirm">确定</view>
                <view class="item" @tap="modifyNum('-')">-</view>
                <view class="item" @tap="modifyNum(0)">0</view>
                <view class="item" @tap="modifyNum('.')">.</view>
                <view class="item" @tap="modifyNum('clear')">清除</view>
            </view>
        </view>
    </view>
</template>

<script>
import NP from '../../utils/numberPrecision'
export default {
    props: {
        inputVal: {
            type: [String],
            default: ''
        },
        label: {
            type: String,
            default: '现金'
        },

    },
    data() {
        return {
            val: ''
        };
    },
    created() {

    },
    methods: {
        input() {
            // this.$emit('cancel');
            let val = this.val;
            console.log(val);
            this.$emit('inputFocus', val);
        },
        //隐藏
        hide() {
            this.$emit('cancel');
        },
        confirm() {
            let val = this.val;
            let valNew = val.slice(-1);
            if (valNew == '.') {
                val = val.slice(0, -1);
            }
            this.$emit('confirm', val);
        },
        modifyNum(sign) {

            let {
                val
            } = this;
            //删除
            if (sign == 'del') {
                if (val.length > 0) {
                    let valNew = val.slice(0, -1);
                    if (valNew.length == 0) {
                        val = '';
                    } else {
                        val = valNew;
                    }
                }
            } else if (sign == 'add') { //加1
                val = NP.plus(Number(val), 1) + '';
            } else if (sign == 'minus') { //减1
                val = NP.minus(Number(val), 1) + '';
            } else if (sign == 'clear') { //清除
                val = '';
            } else if (sign == '-') { //代表负数
                if (val.indexOf('-') == -1) {
                    val = '-' + val;
                }
            } else if (sign == '.') { //点符号
                if (val.indexOf('.') == -1 && val.length > 0) {
                    val = val + '.';
                }
            } else {
                if ((val == '0' && sign == '0') || (val == '-0' && sign == '0') || (val == '0' && sign != '.') || (val == '-0' && sign != '.')) {
                    return;
                }
                val = val + sign;
            }
            //小数点大于3位不赋值
            let arr = val.split('.');
            if (arr.length == 2 && arr[1].length > 3) {
                return;
            }
            this.$emit('inputFocus', val);
            this.val = val;
        }
    }
}
</script>


<style lang="scss" scoped>
.digit-keyboard {
    position: fixed;
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
    z-index: 999;
}

.digit-keyboard_bg {
    width: 100%;
    height: 100%;
    background: rgba($color: #000000, $alpha: 0.5);
}

.digit-keyboard_area {
    position: absolute;
    bottom: 0;
    left: 0;
    width: 100%;
    background: #efefef;
    padding-bottom: 20upx;
}

.input-area {
    display: flex;
    align-items: center;
    padding: 10upx;
    background: #ffffff;

    .item {
        font-size: 28upx;

        &:nth-of-type(2) {
            flex: 1 0 auto;
            padding-right: 10upx;
        }

        &:nth-of-type(3) {
            font-size: 0;
        }
    }

    .input {
        background: #eeeeee;
        text-indent: 10upx;
        font-size: 28upx;
        height: 60upx;
    }
}

.number-area {
    display: flex;
    justify-content: space-around;
    flex-wrap: wrap;
    text-align: center;

    .item {
        margin-top: 20upx;
        flex: 0 0 22%;
        background: #ffffff;
        line-height: 80upx;
        font-size: 30upx;
        font-weight: bold;
    }
}
</style>

//main.js全局引入

// 数字键盘组件 在项目里main.js中配置如下代码

javascript">import digitKeyboard from './components/digitKeyboard/digitKeyboard.vue'
Vue.component('digitKeyboard', digitKeyboard)

 //单页面使用

javascript">//html
<input 
class="content-input" 
@click="clickInput" 
@input="input" 
v-model="inputValue" />
  <!-- 数字键盘 -->
<view>
<digitKeyboard 
v-if="isShowKeyboardWindow" 
@inputFocus="inputKeyboard" 
:inputVal="inputVal" 
:label="label" 
@cancel="isShowKeyboardWindow = false" 
@confirm="keyboardConfirm" />
</view>

//data
// 数字键盘 
inputVal: '',
label: '现金支付',
isShowKeyboardWindow: false,//是否显示键盘窗口

//js
// 数字键盘
inputKeyboard(e) {
    // console.log(e, '00000000000')
     this.inputValue = e //输入框双向绑定

     if (e) {
                this.isChecked1 = false
                this.isChecked2 = false
                this.isChecked3 = false
                this.isChecked4 = false
                this.isChecked5 = false
                this.isChecked6 = false
            }

        },

keyboardConfirm(val) {
            console.log(val)
            this.inputValue = val
            this.isShowKeyboardWindow = false

            this.isChecked1 = false;
            this.isChecked2 = false;
            this.isChecked3 = false;
            this.isChecked4 = false;
            this.isChecked5 = false;
            this.isChecked6 = false;
        },
// 输入框点击事件
clickInput() {
            this.isShowKeyboardWindow = true // 数字键盘组件显示
        },
//充值按钮
recharge: function (e) {
  // 进行判断
         if (this.inputValue !== '' || null || undefined) {// 为数字
                // 可调用支付接口
                // #ifdef APP-PLUS
                if (this.spaceCheck) {
                    this.commitDialog()
                } else {
                    // this.cancelDialog()
                }
                this.$refs.popupRef.show();
                // #endif
            }
            // 进行判断
            if (
               (this.inputValue == '' || null || undefined) 
                && this.current_tag == '' &&
                this.isChecked1 == false &&
                this.isChecked2 == false &&
                this.isChecked3 == false &&
                this.isChecked4 == false &&
                this.isChecked5 == false &&
                this.isChecked6 == false
            ) { // 为空
                // console.log(33333333);
                uni.showToast({
                    title: '请选择数值或输入内容!',
                    duration: 2000,
                    icon: 'none',
                });
                return false

            }
            else if (
                (this.inputValue == '' || null || undefined) && 
                this.current_tag &&
                this.isChecked1 == false &&
                this.isChecked2 == false &&
                this.isChecked3 == false &&
                this.isChecked4 == false &&
                this.isChecked5 == false &&
                this.isChecked6 == false
            ) {
                uni.showToast({
                    title: '请选择数值或输入内容!',
                    duration: 2000,
                    icon: 'none',
                });
                return false
            }


            if (this.current_tag || this.isChecked2 == true) {// 进行判断
                // 可调用支付接口
                // #ifdef APP-PLUS
                if (this.spaceCheck) {
                    this.commitDialog()
                } else {
                    // this.cancelDialog()
                }
                this.$refs.popupRef.show();
                // #endif
            }                    
        }

上一篇文章, 

vue2踩坑之项目:Swiper轮播图使用_意初的博客-CSDN博客文章浏览阅读456次。首先安装swiper插件,解决方法:npm 版本太高,切换一下就好了,引入Swiper,mounted里面调用https://blog.csdn.net/weixin_43928112/article/details/133681437


http://www.niftyadmin.cn/n/5150372.html

相关文章

大厂的 Git 代码管理规范是怎样的?

分支命名 master 分支 master 为主分支&#xff0c;也是用于部署生产环境的分支&#xff0c;需要确保 master 分支稳定性。master 分支一般由 release 以及 hotfix 分支合并&#xff0c;任何时间都不能直接修改代码。 develop 分支 develop 为开发环境分支&#xff0c;始终…

AI 引擎系列 4 - 首次运行 AI 引擎编译器和 x86simulator(2022.1 更新)

AI 引擎系列 4 - 首次运行 AI 引擎编译器和 x86simulator&#xff08;2022.1 更新&#xff09; 简介 在 AI 引擎系列的前 3 篇博文中&#xff0c;我们探讨了 AI 引擎应用所需的不同文件。在本篇中&#xff0c;我们将为 X86 目标运行 AI 引擎编译器&#xff0c;观察它生成的不…

AC修炼计划(AtCoder Regular Contest 163)

传送门&#xff1a;AtCoder Regular Contest 163 - AtCoder 第一题我们只需要将字符串分成两段&#xff0c;如果存在前面一段比后面一段大就成立。 #include<bits/stdc.h> #define int long long using namespace std; typedef long long ll; typedef pair<int,int&g…

《实战:如何搭建一个完整的 Vue2.0 项目》- 7、Vue2.x 项目 webpack 4 升级 5(半自动升级)

1.自动升级 先全局安装升级插件 npm i npm-check npm-check-updates -g检查依赖 npm-check更新检查后的依赖并展示版本号&#xff0c;此时 package.json还没有更新 npm-check-updates升级 package.json&#xff0c;下图显示更新版本&#xff0c;此时 package.json文件已变更…

现在学Web前端还是网络安全比较好?

前言 网络安全和web前端现在都是当今IT技术行业里的热门岗位&#xff0c;任意一个选择一个认真学习掌握了其中主要的内容和知识都能找到一份不错的工作&#xff0c;但很多准备入行的人却不知道应该怎选择哪一个&#xff0c;今天就来简要的给大家介绍分析一下。 为什么选择学习…

Java类加载机制(类加载器,双亲委派模型,热部署示例)

Java类加载机制 类加载器类加载器的执行流程类加载器的种类加载器之间的关系ClassLoader 的主要方法Class.forName()与ClassLoader.loadClass()区别 双亲委派模型双亲委派 类加载流程优缺点 热部署简单示例 类加载器 类加载器的执行流程 类加载器的种类 AppClassLoader 应用类…

问chatgpt最近生活的困难

你知道吗&#xff0c;因为我做的所有的事情没有任何目的性&#xff0c;所以曾经过的很好&#xff0c;这种很好是一种逃避式的好&#xff0c;怎么说呢&#xff1f;遇到困难了&#xff0c;那就不做了&#xff0c;换下一个项目。比如打游戏&#xff0c;如果我这局玩王者荣耀&#…

【数据结构】深入浅出理解快速排序背后的原理 以及 版本优化【万字详解】(C语言实现)

快速排序 快速排序递归实现前言&#xff08;一&#xff09;算法运行图例&#xff08;二&#xff09;算法核心思路&#xff08;三&#xff09;算法实现步骤&#xff08;1&#xff09;单趟&#xff08;2&#xff09;多趟 &#xff08;四&#xff09;码源详解 递归实现&#xff08…