UNPKG

nutui-taro-upgrade

Version:

@nutui/nutui-taro 对京东风格组件库的taro4 版本支持

580 lines (579 loc) 19.8 kB
var __defProp = Object.defineProperty; var __defProps = Object.defineProperties; var __getOwnPropDescs = Object.getOwnPropertyDescriptors; var __getOwnPropSymbols = Object.getOwnPropertySymbols; var __hasOwnProp = Object.prototype.hasOwnProperty; var __propIsEnum = Object.prototype.propertyIsEnumerable; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp.call(b, prop)) __defNormalProp(a, prop, b[prop]); if (__getOwnPropSymbols) for (var prop of __getOwnPropSymbols(b)) { if (__propIsEnum.call(b, prop)) __defNormalProp(a, prop, b[prop]); } return a; }; var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); import { getCurrentInstance, reactive, watch, nextTick, onMounted, onUnmounted, toRefs, openBlock, createElementBlock, Fragment, normalizeStyle, renderList, createTextVNode, createCommentVNode, toDisplayString } from "vue"; import { c as createComponent } from "../component-669c158a.js"; import { _ as _export_sfc } from "../_plugin-vue_export-helper-cc2b3d55.js"; function useExtend(apis) { const instance = getCurrentInstance(); if (instance) { Object.assign(instance.proxy, apis); } } const { create } = createComponent("countup"); const _sfc_main = create({ props: { initNum: { type: Number, default: 0 }, endNum: { type: Number, default: 0 }, speed: { type: Number, default: 1 }, toFixed: { type: Number, default: 0 }, during: { type: Number, default: 1e3 }, startFlag: { type: Boolean, default: true }, // 数字滚动 numWidth: { type: Number, default: 20 }, numHeight: { type: Number, default: 20 }, scrolling: { type: Boolean, default: false }, // 自定义图片 customBgImg: { type: String, default: "" }, customSpacNum: { type: Number, default: 0 }, customChangeNum: { type: Number, default: 1 }, // 抽奖 type: { type: String, default: "" }, machineNum: { type: Number, default: 3 }, machinePrizeNum: { type: Number, default: 0 }, machinePrizeLevel: { type: Number, default: 0 }, machineTrunMore: { type: Number, default: 0 } }, components: {}, emits: ["click", "scrollEnd"], setup(props, { emit }) { const data = reactive({ valFlag: false, current: 0, sortFlag: "add", initDigit1: 0, initDigit2: 0, to0_10: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0], to10_0: [0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1], timer: null, totalCount: 0, // 正整数 pointNum: 0, // 小数位 numberVal: 0, // 数字 num_total_len: 0, // 数字长度 relNum: 0, // 去除小数点 customNumber: 1, prizeLevelTrun: 0, prizeY: [], prizeYPrev: [], // machineTransition: 'none', finshMachine: 0, notPrize: [], typeMachine: "" }); const { startFlag, scrolling, customBgImg, type } = reactive(props); watch( () => props.customChangeNum, () => { clearIntervalTime(); countGo(0); } ); watch( () => props.machinePrizeLevel, (count) => { data.prizeLevelTrun = count; } ); watch( () => props.initNum, (count) => { data.current = count; data.valFlag = false; valChange(); } ); watch( () => props.endNum, () => { data.current = props.initNum; data.valFlag = false; valChange(); } ); const valChange = () => { if (data.valFlag) { return false; } if (startFlag) { if (scrolling || customBgImg) { if (type != "machine") { countGo(); } } else { countChange(); setTimeout(() => { data.valFlag = true; }, 300); } } }; const clearIntervalTime = () => { clearInterval(Number(data.timer)); data.timer = null; }; const calculation = (num1, num2, type2) => { const num1Digits = (num1.toString().split(".")[1] || "").length; const num2Digits = (num2.toString().split(".")[1] || "").length; const baseNum = Math.pow(10, Math.max(num1Digits, num2Digits)); if (type2 == "-") { const n = Number((num1 * baseNum - num2 * baseNum).toFixed(0)); return n / baseNum; } else { const m = Number((num1 * baseNum + num2 * baseNum).toFixed(0)); return m / baseNum; } }; const topNumber = (index) => { let { num_total_len, pointNum, initDigit1, initDigit2, sortFlag } = data; let idx1 = sortFlag == "add" || sortFlag == "equal" ? String(initDigit2)[index - (num_total_len - pointNum)] : 10 - Number(String(initDigit2)[index - (num_total_len - pointNum)]); let idx2 = sortFlag == "add" || sortFlag == "equal" ? String(initDigit1)[index] : 10 - Number(String(initDigit1)[index]); let num = index > num_total_len - pointNum - 1 ? -idx1 * 100 + "%" : index <= String(initDigit1).length - 1 ? -idx2 * 100 + "%" : 0; if (num == "-1000%") { num = 0; } return num; }; const turnNumber = (index) => { let { num_total_len, pointNum, initDigit1, initDigit2 } = data; let idx1 = String(initDigit2)[index - (num_total_len - pointNum)]; let num = index > num_total_len - pointNum - 1 ? idx1 ? idx1 : 0 : index <= String(initDigit1).length - 1 ? String(initDigit1)[index] : 0; return num; }; const countChange = () => { let { endNum, initNum, speed, toFixed } = props; let countTimer = setInterval(() => { if (initNum > endNum) { if (data.current <= endNum || data.current <= speed) { data.current = Number(endNum.toFixed(toFixed)); clearInterval(countTimer); emit("scrollEnd"); data.valFlag = false; } else { data.current = Number((parseFloat(String(data.current)) - parseFloat(String(speed))).toFixed(toFixed)); } } else { if (data.current >= endNum) { data.current = Number(endNum.toFixed(toFixed)); clearInterval(countTimer); emit("scrollEnd"); data.valFlag = false; } else { data.current = Number((parseFloat(String(data.current)) + parseFloat(String(speed))).toFixed(toFixed)); } } }, props.during); }; const countGo = (flag) => { let { initNum, endNum, toFixed, customBgImg: customBgImg2 } = props; if (customBgImg2) { initNum = props.customChangeNum; } let startNumber1, startNumber2, endNumber1, endNumber2; if (initNum != 0) { if (toFixed != 0) { initNum = Number(initNum.toFixed(toFixed)); } if (String(initNum).indexOf(".") > -1) { startNumber1 = String(initNum).split(".")[0].length; startNumber2 = String(initNum).split(".")[1].length; } else { startNumber1 = String(initNum).length; startNumber2 = 0; } } else { startNumber1 = 1; startNumber2 = 0; } if (endNum != 0) { if (toFixed != 0) { endNum = Number(endNum.toFixed(toFixed)); } if (String(endNum).indexOf(".") > -1) { endNumber1 = String(endNum).split(".")[0].length; endNumber2 = String(endNum).split(".")[1].length; } else { endNumber1 = String(endNum).length; endNumber2 = 0; } } else { endNumber1 = 1; endNumber2 = 0; } let len1 = startNumber1 >= endNumber1 ? startNumber1 : endNumber1; let len2 = startNumber2 >= endNumber2 ? startNumber2 : endNumber2; data.num_total_len = len1 + len2; data.pointNum = len2; if (initNum > endNum) { data.sortFlag = "reduce"; data.to0_10 = [0, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]; data.totalCount = calculation(initNum, endNum, "-"); data.numberVal = Number(String(initNum)); } else if (initNum < endNum) { data.sortFlag = "add"; data.to0_10 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0]; data.totalCount = calculation(endNum, initNum, "-"); data.numberVal = Number(String(endNum)); } else { data.sortFlag = "equal"; } var unit = 1; for (let i = 0; i < data.pointNum; i++) { unit *= 10; } var rel_big = data.numberVal * unit; data.relNum = rel_big; if (toFixed != 0) { data.pointNum = String(data.numberVal).split(".")[1] ? String(data.numberVal).split(".")[1].length : 0; data.num_total_len = String(rel_big).length; } if (String(initNum).indexOf(".") > -1) { let n = String(initNum).split("."); data.initDigit1 = Number(n[0]); data.initDigit2 = Number(n[1]); } else { data.initDigit1 = initNum; data.initDigit2 = 0; } if (scrolling && !customBgImg2) { nextTick(() => { if (data.sortFlag == "equal") { return false; } let refsDom = document.getElementsByClassName("nut-countup__number-item"); let element = refsDom[data.num_total_len - 1]; runTurn(element); }); } else { if (flag !== 0) { imgNumberScroll(); } } }; const runTurn = (el) => { clearIntervalTime(); var m = 1; if (data.pointNum != 0) { m = 1 / Math.pow(10, data.pointNum); } data.timer = setInterval(() => { runStep(el); data.totalCount = calculation(data.totalCount, m, "-"); if (data.totalCount <= 0) { clearIntervalTime(); emit("scrollEnd"); data.valFlag = false; } }, props.during); }; const runStep = (el) => { let currentTurn = el.style.all; let turningNum; if (data.sortFlag == "add") { turningNum = parseInt(String(currentTurn)) + 1; } else { turningNum = parseInt(String(currentTurn)) - 1 >= 0 ? parseInt(String(currentTurn)) - 1 : 9; } el.style.all = String(turningNum); if (el.style.transition == "none" || turningNum == 1 || !el.style.transition) { el.style.transition = `all linear ${props.during}ms`; } if (turningNum == 10 || data.sortFlag == "reduce" && turningNum == 0) { var timeOut = null; el.style.top = `-${data.sortFlag == "add" ? turningNum * 100 : (10 - turningNum) * 100}%`; el.style.all = "0"; timeOut = setTimeout(() => { timeOut && clearTimeout(timeOut); el.style.transition = "none"; el.style.top = "0"; if (turningNum == 10) { if (el.previousSibling) { runStep(el.previousSibling); } } }, 0.975 * props.during); } else { el.style.top = `-${data.sortFlag == "add" ? turningNum * 100 : (10 - turningNum) * 100}%`; } if (el.style.top == "-100%" && data.sortFlag == "reduce") { runStep(el.previousSibling); } }; const imgNumberScroll = () => { nextTick(() => { let f = document.getElementsByClassName("nut-countup__numberimg")[0]; f.addEventListener("webkitTransitionEnd", () => { emit("scrollEnd"); data.valFlag = false; }); }); }; const generateRandom = () => { data.notPrize = []; while (data.notPrize.length < 3) { var rand = Math.floor(Math.random() * props.machinePrizeNum + 1); if (data.notPrize.indexOf(rand) == -1) { data.notPrize.push(rand); } } }; const machineLuck = () => { const machineTrunMoreNum = props.machineTrunMore < 0 ? 0 : props.machineTrunMore; let distance = props.numHeight * props.machinePrizeNum; if (data.prizeLevelTrun < 0) { generateRandom(); } for (let i = 0; i < props.machineNum; i++) { setTimeout(() => { let turn = distance * (i + 1 + parseFloat(String(machineTrunMoreNum))); if (data.prizeYPrev.length != 0) { data.prizeY[i] = data.prizeYPrev[i]; } let local = data.prizeYPrev[i] ? data.prizeYPrev[i] : 0; let newLocation = turn + local + (props.machinePrizeNum - data.prizeLevelTrun + 1) * props.numHeight + (distance - local); if (data.prizeLevelTrun < 0) { newLocation += props.numHeight * data.notPrize[i]; } scrollTime( i, // parseFloat((this.machinePrizeNum-(this.prizeLevelTrun-1))*this.numHeight + turn + local), newLocation, local ); }, 500 * i); } }; useExtend({ machineLuck }); const scrollTime = (index, total, num) => { let t = setInterval(() => { if (num <= total) { num += 10; data.prizeY[index] = parseFloat(String(num)); } else { clearInterval(t); t = null; data.finshMachine += 1; data.prizeY[index] = total; if (data.finshMachine == props.machineNum) { let distance = props.numHeight * props.machinePrizeNum; data.prizeYPrev = []; let prevAry = JSON.parse(JSON.stringify(data.prizeY)); prevAry.forEach((item) => { let n = item; while (n > distance) { n -= distance; } data.prizeYPrev.push(n); }); setTimeout(() => { data.finshMachine = 0; if (data.prizeLevelTrun < 0) { emit("scrollEnd", false); data.valFlag = false; } else { emit("scrollEnd", true); data.valFlag = false; } }, 130); } } }, 30); }; onMounted(() => { data.current = props.initNum; nextTick(() => { valChange(); }); }); onUnmounted(() => { clearIntervalTime(); data.timer = null; }); return __spreadProps(__spreadValues(__spreadValues({}, toRefs(data)), toRefs(reactive(props))), { topNumber, turnNumber }); } }); const _hoisted_1 = { class: "nut-countup" }; const _hoisted_2 = ["turn-number"]; function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { return openBlock(), createElementBlock("view", _hoisted_1, [ _ctx.customBgImg != "" ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [ _ctx.type == "machine" ? (openBlock(), createElementBlock("view", { key: 0, class: "nut-countup__machine", style: normalizeStyle({ height: _ctx.numHeight + "px" }) }, [ (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.machineNum, (val, index) => { return openBlock(), createElementBlock("view", { key: "mImg" + index, class: "nut-countup__machine-item", style: normalizeStyle({ width: _ctx.numWidth + "px", height: _ctx.numHeight + "px", background: "url(" + _ctx.customBgImg + ") ", backgroundPosition: "0 " + _ctx.prizeY[index] + "px" }) }, null, 4); }), 128)) ], 4)) : (openBlock(), createElementBlock("view", { key: 1, class: "nut-countup__numberimg", style: normalizeStyle({ height: _ctx.numHeight + "px" }) }, [ (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.num_total_len, (val, index) => { return openBlock(), createElementBlock("view", { key: "cImg" + index, class: "nut-countup__numberimg__item", style: normalizeStyle({ width: _ctx.numWidth + "px", height: _ctx.numHeight + "px", left: _ctx.numWidth * (index > _ctx.num_total_len - _ctx.pointNum - 1 ? index == _ctx.num_total_len - _ctx.pointNum ? index * 1.5 : index * 1.3 : index) + "px", backgroundImage: "url(" + _ctx.customBgImg + ")", backgroundPosition: "0 " + -(+String(_ctx.relNum)[index] * _ctx.numHeight + _ctx.customSpacNum * +String(_ctx.relNum)[index]) + "px", transition: "all linear " + _ctx.during / 10 + "ms" }) }, null, 4); }), 128)), _cache[0] || (_cache[0] = createTextVNode()), _ctx.pointNum > 0 ? (openBlock(), createElementBlock("view", { key: 0, class: "nut-countup-pointstyl", style: normalizeStyle({ width: _ctx.numWidth / 2 + "px", bottom: 0, left: _ctx.numWidth * (_ctx.num_total_len - _ctx.pointNum) * 1.1 + "px", fontSize: "30px" }) }, "\n .\n ", 4)) : createCommentVNode("", true) ], 4)) ], 64)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [ _ctx.scrolling ? (openBlock(), createElementBlock("view", { key: 0, class: "nut-countup__number", style: normalizeStyle({ width: _ctx.numWidth * _ctx.num_total_len + _ctx.numWidth / 3 + "px", height: _ctx.numHeight + "px", lineHeight: _ctx.numHeight + "px" }) }, [ (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.num_total_len, (val, index) => { return openBlock(), createElementBlock("view", { ref_for: true, ref: "nut-countup__number-item", key: val, class: "nut-countup__number-item", style: normalizeStyle({ all: _ctx.turnNumber(index), top: _ctx.topNumber(index), left: _ctx.numWidth * (index > _ctx.num_total_len - _ctx.pointNum - 1 ? index * 1.1 : index) + "px" }), "turn-number": _ctx.turnNumber(index) }, [ (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.to0_10, (item, idx) => { return openBlock(), createElementBlock("view", { key: "dote" + idx, class: "nut-countup__number-item__span", style: normalizeStyle({ width: _ctx.numWidth + "px", height: _ctx.numHeight + "px", lineHeight: _ctx.numHeight + "px" }) }, toDisplayString(item), 5); }), 128)) ], 12, _hoisted_2); }), 128)), _cache[1] || (_cache[1] = createTextVNode()), _ctx.pointNum > 0 ? (openBlock(), createElementBlock("view", { key: 0, class: "nut-countup-pointstyl", style: normalizeStyle({ width: _ctx.numWidth / 3 + "px", height: _ctx.numHeight + "px", lineHeight: _ctx.numHeight + "px", top: 0, left: _ctx.numWidth * (_ctx.num_total_len - _ctx.pointNum) + "px" }) }, "\n .\n ", 4)) : createCommentVNode("", true) ], 4)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [ createTextVNode(toDisplayString(_ctx.current), 1) ], 64)) ], 64)) ]); } const index_taro = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render]]); export { index_taro as default };