123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- import baseComponent from '../helpers/baseComponent'
- import classNames from '../helpers/classNames'
- const defaults = {
- prefixCls: 'wux-keyboard',
- className: '',
- titleText: '安全键盘',
- cancelText: '取消',
- inputText: '输入数字密码',
- showCancel: true,
- disorder: false,
- password: true,
- maxlength: 6,
- onChange(value) {},
- callback(value) {},
- // onClose(value) {},
- }
- /**
- * 给指一位数组随机生成二维数组
- *
- * @param {boolean} [isRandom=false] 是否随机
- * @param {array} [arr=[1, 2, 3, 4, 5, 6, 7, 8, 9, 0]] 默认数组
- * @returns
- */
- const upsetNums = (isRandom = false, arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]) => {
- if (isRandom) {
- const floor = Math.floor
- const random = Math.random
- const len = arr.length
- let i, j, temp, n = floor(len / 2) + 1
- while (n--) {
- i = floor(random() * len)
- j = floor(random() * len)
- if (i !== j) {
- temp = arr[i]
- arr[i] = arr[j]
- arr[j] = temp
- }
- }
- }
- let nums = []
- for (let i = 0; i < 4; i++) {
- nums.push(arr.slice(i * 3, (i + 1) * 3))
- }
- return nums
- }
- baseComponent({
- useFunc: true,
- data: defaults,
- computed: {
- classes() {
- const { prefixCls } = this.data
- const wrap = classNames(prefixCls)
- const hd = `${prefixCls}__hd`
- const bd = `${prefixCls}__bd`
- const label = `${prefixCls}__label`
- const password = `${prefixCls}__password`
- const input = `${prefixCls}__input`
- const ft = `${prefixCls}__ft`
- const title = `${prefixCls}__title`
- const numbers = `${prefixCls}__numbers`
- const number = `${prefixCls}__number`
- const text = `${prefixCls}__text`
- const hover = `${prefixCls}__text--hover`
- return {
- wrap,
- hd,
- bd,
- label,
- password,
- input,
- ft,
- title,
- numbers,
- number,
- text,
- hover,
- }
- },
- },
- methods: {
- /**
- * 隐藏
- */
- hide() {
- this.$$setData({ in: false })
- },
- /**
- * 上拉键盘组件
- * @param {Object} opts 配置项
- * @param {String} opts.className 自定义类名
- * @param {String} opts.titleText 标题
- * @param {String} opts.cancelText 取消按钮的文字
- * @param {String} opts.inputText 提示文本
- * @param {Boolean} opts.showCancel 是否显示取消按钮
- * @param {Boolean} opts.disorder 是否打乱键盘
- * @param {Boolean} opts.password 是否密码类型
- * @param {Number} opts.maxlength 最大输入长度,设置为 -1 的时候不限制最大长度
- * @param {Function} opts.onChange change 事件触发的回调函数
- * @param {Function} opts.callback 输入完成后的回调函数
- * @param {Function} opts.onClose 输入完成后的回调函数,优先级高于 callback
- */
- show(opts = {}) {
- const nums = upsetNums(opts.disorder)
- const maxlength = opts.maxlength <= 0 ? -1 : opts.maxlength
- const keys = maxlength !== -1 ? [...new Array(maxlength || defaults.maxlength)].map(() => 1) : []
- const options = this.$$mergeOptionsAndBindMethods(Object.assign({ nums, keys, value: '' }, defaults, opts))
- this.$$setData({ in: true, ...options })
- return this.hide.bind(this)
- },
- /**
- * 增加
- */
- increase(e) {
- const dataset = e.currentTarget.dataset
- const nextValue = String(dataset.value)
- const { value, maxlength } = this.data
- if (value.length >= maxlength && maxlength !== -1) return
- this.updateValue(value + nextValue)
- },
- /**
- * 减少
- */
- decrease(e) {
- const { value } = this.data
- if (value.length === 0) return
- this.updateValue(value.substr(0, value.length - 1))
- },
- /**
- * 更新
- */
- updateValue(value = '') {
- this.$$setData({ value })
- // onChange
- if (typeof this.fns.onChange === 'function') {
- this.fns.onChange.call(this, value)
- }
- // onClose
- if (value.length === this.data.maxlength) {
- const preCloseCallback = this.fns.onClose || this.fns.callback
- const performCloseDialog = () => this.hide()
- if (preCloseCallback && typeof preCloseCallback === 'function') {
- const preCloseCallbackResult = preCloseCallback.call(this, value)
- if (typeof preCloseCallbackResult === 'object') {
- if (preCloseCallbackResult.closePromise) {
- preCloseCallbackResult.closePromise.then(performCloseDialog, performCloseDialog)
- } else {
- preCloseCallbackResult.then(performCloseDialog, performCloseDialog)
- }
- } else if (preCloseCallbackResult !== false) {
- performCloseDialog()
- }
- } else {
- performCloseDialog()
- }
- }
- },
- },
- })
|