From bc4a424be2538da44593e69644d7edf6e1a37eee Mon Sep 17 00:00:00 2001 From: June <1601745371@qq.com> Date: Sun, 15 Aug 2021 23:09:24 +0800 Subject: [PATCH] =?UTF-8?q?fixed:=E5=AE=8C=E5=96=84=E6=98=9F=E8=AF=84?= =?UTF-8?q?=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/rate/index.vue | 126 ++++++++++++++-------------------- subPages/comments/comment.vue | 47 ++++++++++--- utils/common.js | 36 +++++++++- utils/vue_extend.js | 2 + 4 files changed, 129 insertions(+), 82 deletions(-) diff --git a/components/rate/index.vue b/components/rate/index.vue index 986d432..adfe9b1 100644 --- a/components/rate/index.vue +++ b/components/rate/index.vue @@ -2,22 +2,24 @@ <view class="rate-wrap"> <view class="rate_icon" - :style="{ 'margin-right': marginNumber + 'px' }" v-for="(star, index) in stars" + :style="{ 'margin-right': marginNumber + 'px' }" :key="index" - @touchstart.stop="touchstart" + @touchstart="touchstart($event, index + 1)" @touchmove.stop="touchmove" - @mousedown.stop="mousedown" - @mousemove.stop="mousemove" - @mouseleave="mouseleave" > <text class="start" + :style="starSize" /> - <view class="rate_icon-on" :style="{ width: star.activeWitch}"> + <view + class="rate_icon-on" + :style="{ width: star.activeWitch}" + > <text class="start_fill" + :style="starSize" /> </view> </view> @@ -25,22 +27,11 @@ </template> <script> - /** - * @param {Number} size æ˜Ÿæ˜Ÿçš„å¤§å° - * @param {Number} value/v-model 当å‰è¯„分 - * @param {Number} max 最大评分评分数é‡ï¼Œç›®å‰ä¸€åˆ†ä¸€é¢—星 - * @param {Number} margin 星星的间è·ï¼Œå•ä½ px - * @param {Boolean} disabled = [true|false] 是å¦ä¸ºç¦ç”¨çжæ€ï¼Œé»˜è®¤ä¸º false - * @param {Boolean} readonly = [true|false] 是å¦ä¸ºåªè¯»çжæ€ï¼Œé»˜è®¤ä¸º false - * @param {Boolean} allowHalf = [true|false] 是å¦å®žçŽ°åŠæ˜Ÿï¼Œé»˜è®¤ä¸º false - * @param {Boolean} touchable = [true|false] æ˜¯å¦æ”¯æŒæ»‘动手势,默认为 true - * @event {Function} change Rate çš„ value æ”¹å˜æ—¶è§¦å‘事件,e={value:Number} - */ - + import { throttle } from '@/utils/common.js' export default { name: "Rate", props: { - size: { + size: { // px type: [Number, String], default: 17 }, @@ -55,37 +46,34 @@ default: 5 }, margin: { - // æ˜Ÿæ˜Ÿçš„é—´è· + // æ˜Ÿæ˜Ÿçš„é—´è· px type: [Number, String], default: 0 }, disabled: { // 是å¦å¯ç‚¹å‡» - type: [Boolean, String], + type: Boolean, default: false }, readonly: { // 是å¦åªè¯» - type: [Boolean, String], + type: Boolean, default: false }, allowHalf: { // æ˜¯å¦æ˜¾ç¤ºåŠæ˜Ÿ - type: [Boolean, String], + type: Boolean, default: true }, touchable: { // æ˜¯å¦æ”¯æŒæ»‘动手势 - type: [Boolean, String], + type: Boolean, default: true } }, data() { return { - valueSync: "", - userMouseFristMove: true, - userRated: false, - userLastRate: 1 + valueSync: '' }; }, watch: { @@ -102,15 +90,15 @@ for (let i = 0; i < this.max; i++) { if (floorValue > i) { starList.push({ - activeWitch: "100%" + activeWitch: '100%' }); } else if (ceilValue - 1 === i) { starList.push({ - activeWitch: (value - floorValue) * 100 + "%" + activeWitch: (value - floorValue) * 100 + '%' }); } else { starList.push({ - activeWitch: "0" + activeWitch: '0' }) } } @@ -119,12 +107,16 @@ marginNumber() { return Number(this.margin) + }, + + starSize() { + const size = this.size + return `width: ${size}px;height: ${size}px;` } }, created() { this.valueSync = Number(this.value) this._rateBoxLeft = 0 - this._oldValue = null }, mounted() { setTimeout(() => { @@ -132,20 +124,23 @@ }, 100) }, methods: { - touchstart(e) { - if (this.readonly || this.disabled) return - const { clientX } = e.changedTouches[0] - this._getRateCount(clientX) + touchstart(e, idx) { + if (this.readonly || this.disabled || !this.touchable) return + if(this.valueSync === 1) { + this.valueSync = 0 + } else { + this.valueSync = idx + } + this._onChange() }, - touchmove(e) { + + touchmove: throttle(function (e) { if (this.readonly || this.disabled || !this.touchable) return const { clientX } = e.changedTouches[0] this._getRateCount(clientX) - }, + }, 200), - /** - * èŽ·å–æ˜Ÿæ˜Ÿä¸ªæ•° - */ + // èŽ·å–æ˜Ÿæ˜Ÿä¸ªæ•° _getRateCount(clientX) { this._getSize() const size = Number(this.size) @@ -154,16 +149,17 @@ } // move星星的è·ç¦» const rateMoveRange = clientX - this._rateBoxLeft - let index = parseInt(rateMoveRange / (size + this.marginNumber)) + const marginNumber = this.marginNumber + let index = parseInt(rateMoveRange / (size + marginNumber)) index = index < 0 ? 0 : index; index = index > this.max ? this.max : index; - const range = parseInt(rateMoveRange - (size + this.marginNumber) * index); - console.log(range) - let value = 0; - if (this._oldValue === index) return; - this._oldValue = index; + // 移入星星的è·ç¦» + const range = parseInt(rateMoveRange - (size + marginNumber) * index) + let value = 0 if (this.allowHalf) { - if (range > (size / 2)) { + if(range <= 0 && index === 0) { + value = 0 + } else if (range > (size / 2)) { value = index + 1 } else { value = index + 0.5 @@ -171,32 +167,28 @@ } else { value = index + 1 } - value = Math.max(0.5, Math.min(value, this.max)) - console.log(value) + value = Math.max(0, Math.min(value, this.max)) this.valueSync = value this._onChange() }, - /** - * 触å‘动æ€ä¿®æ”¹ - */ + // 触å‘动æ€ä¿®æ”¹ _onChange() { - this.$emit("update:modelValue", this.valueSync); + this.$emit("update:value", this.valueSync); this.$emit("change", { value: this.valueSync }); }, - /** - * èŽ·å–æ˜Ÿæ˜Ÿè·ç¦»å±å¹•左侧è·ç¦» - */ + + //èŽ·å–æ˜Ÿæ˜Ÿè·ç¦»å±å¹•左侧è·ç¦» _getSize() { uni.createSelectorQuery() .in(this) .select('.rate-wrap') .boundingClientRect() - .exec(ret => { - if (ret) { - this._rateBoxLeft = ret[0].left + .exec(res => { + if (res) { + this._rateBoxLeft = res[0].left } }) } @@ -229,26 +221,14 @@ .start { display: inline-block; - width: 34rpx; - height: 34rpx; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAABECAMAAAAPzWOAAAAApVBMVEUAAAD/Zhr/byr/Zhr/jlj/eCb/Zhv/aBz/Zhr/Zxv/Zhr/Zhr/Zxr/Zxv/Zhr/Zhr/Zxr/Zxv/aBv/aRz/Zxr/Zxv/aBv/aBv/Zxz/ax7/Zhr/Zhr/Zhv/Zhr/Zxr/Zxv/Zxz/ax7/aiH/ah//Zxr/Zxr/Zxr/Zxv/Zxv/Zx3/aBz/Zxr/Zxv/Zhv/Zxv/Zxv/aB3/Zhr/Zxv/Zhv/Zxv/Zxr/ZhqOyFXpAAAANnRSTlMA+wzxAgaNO/az4+msSuzYt3BPLMGAZ0AkGdPFvKViVTUfExCYk4Z4X0Ux3J6CfFgpznLKa7mhqILLAAACjElEQVRYw+2W2XqqMBSF2cwzgoJWFGvV43isU9f7P1o/9StoxSTE264bwR3/bJM9KX9qLGvYj5yR/hLDxEWO+gIjBqXtXuZhKM94sxGcP3sali/8Gf/6MEf+giPt65MaYvmaI1dXOnKMDxsrRSld6UpB/sGpXrYYSDmi4b16m2iwZB2plMq4MqkckXflP1qML4QdsRhnJOrI4OGQmroSEKya69oKA4xd4hNmj4YF0FmsOFVB7wXx7GtNAMisq0OFDQBeZzMftWtYk5HpRISLaN1K209SMvb7Nq5yO9NsfGvMNAAgdzCNg56hsDXuZj87klktjoHBPNkZSgPp4+XJJwxLNCFTpPROSMqYcBRJpWXsOEikix+8EhLIQj5KiImZLGRRls02qCvHGHtYVNlmS1F67s2V6BvYSylGfhv9U9iND3fnonOfQTNQw3tuexioD52KRk0YqxAto6a602eDgA/hGLUhTAtRhqXBr8/XOZAJM4bPpqeDIMWyS0aNTiBLIOs8bFhT3BQDkQZ71Jk9i0jlQvq8MSNEjwvRMOYt+OBCXM5GbwgVrlqcSrgUmc1MTjs9iBS5gjMbb3ASyBv0mfajyDikgphxYmOi8LXGjlV44SoCcsAqPQm+xAbLlGGdwxSBfMJnWIcofh9iMZvGb7/LKyJmar3fI7bXwWV6jzGIjKcMnaDero09IE8PDsE271IqwooRAOENsXCB/JL0Ox/Qtjf8FrrPIWSXbo4iYB+UDaIFeHFpPLIqyv6nPwd7YH3XQawccAv9erBkG6y704LzDzqAm1WhXYGj0ZmxhslOQPT9PhAejLo9IsD1c0LOrqFxCMBLnyzSiwgAmbw6bFiJpbN6cLJUlT9x9Q2wO0gQqPtdlQAAAABJRU5ErkJggg==); background-position: 0 0; background-repeat: no-repeat; background-size: 100% 100%; } -.start_fill_half { - display: inline-block; - width: 34rpx; - height: 34rpx; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAABECAMAAAAPzWOAAAAAqFBMVEUAAAD2kYn/Zhr/Zhv/Zhv/Zhr/Zhv/Zhv/eiH/Zxv/aB3/aR3/ay3/l2n/Zxr/Zxr/aBr/Zxz/Zhv/Zhr/Zhr/Zhr/Zxv/Zxr/aiL/ah//Zhr/Zhr/Zhv/Zxv/Zhv/Zxv/aBz/ahz/ah7/ayH/fTT/Zxv/Zxv/aBv/Zxr/Zxz/bCH/cyb/Zxr/Zxr/Zxr/Zhv/Zxz/Zxr/Zhr/Zhr/Zhz/aBz/Zxv/ZhrAwdp6AAAAN3RSTlMAGfzujfLbswdyPSsLArh+TET66OPFpIc4IPbr0peCeDIaEg8Evp5nXyQWDcGtqW5ZVdbLZFHJ+Q6zgQAAAkxJREFUWMPt1tuSojAQBuAMR1EURUBAHNDxfNbR/d//zbZW2cQRCSHezn9JFV81JN3V5De10wzOhnlqv2UMcIu5ecM4AEC4GCKQN8YxAHyQlY6eNKLhjpAUvqyxjv8j9hA9+UJyhKTYShaiM2Sjoil5vAwhDmYyxkR/RL7kShmAItKlTHSG5KWEtZFPMCR/0KlrfKkMoaWFkoUwhAzqltJVishEhSMMNFrXvYsiQpbAdplVTIXpqnsYdYy8iCJCLjoA9Lfz9NqyX/zHk2bSt0sRsrZ2SYx7vNloMX40FjpoShCWqLfQzPPtgxWtQR9bgCDC0o56h72CgNJuPYQldNGld0IWIQ69O6Y8Mkb/fWRNEU0eWdIB0ZJGoj6WtNskkciDyc58LoWsPPhfhGUkgbT62NqEiCkfpcbsuQu1mkg2RKdRnO61kEyFyQwWpwYSqthNyaukwkhTxz43CrEEkWaMoM3ZjESQ9RBz3hY3EkEG+OYZZKIIIEnVxqMKICqi9xEPK64xhgDSQZeL9EQQDSkXsUSQZcVuPBdBQiRc5FsEseFOeYgughADLY4RQQgxceIgXTFkgE8OkoohR+w4SPAKCazx83iFwUESvIwy+sk0FKVRarTdIuA7lqkg1ibkIWdk5ctrkbgt9Ks9oDv2Q/dwhoH9NE0S2mhZBxha9Bv+oCl4YY3jj7nqA96lff+xStwoR46M8BbT50uUAMbpn2FAq27AvPRCjgbg7XwFvs2fBSqAvrMpWZcvBgBXs6uW8vDa5M3yrNvbkN9U5i8qUQdciqz2fwAAAABJRU5ErkJggg==); - background-position: 0 0; - background-repeat: no-repeat; - background-size: 100% 100%; -} + .start_fill { display: inline-block; - width: 34rpx; - height: 34rpx; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAABECAMAAAAPzWOAAAAAmVBMVEUAAAD/Zxr/Zhr/Zhr/cC7/dCX/Zhv/Zxv/aBz/Zhv/Zxr/Zhr/Zxr/Zxr/Zhv/Zxz/Zxz/Zhr/Zhv/Zxr/Zhr/Zxr/aBr/aB3/aRz/aBv/ahr/aB3/Zxr/Zxv/aBv/Zxv/aB//aCD/Zhr/Zxr/Zxr/Zxv/Zxv/ZiL/aB//aCL/Zhv/Zhv/Zxr/cRz/Zhr/Zxr/aBv/aR7/Zhprn+e+AAAAMnRSTlMA/PbrBQnaQTb68OaimmxRLN++spRgTEY7MCYii3VmXCgg49XOyKoeGA62qFYSf35xETz/Gz4AAAG8SURBVFjD7dbbcoIwEIDhTSgnAUE5CHi2Wu253fd/uLaOpiCYLGGmvfG/FT92lhkI3Pqf1sm99ez0M5wBfsfSPoY5wmO87IF84KnnHoN4Z4SttJEhivweg4hYqT9I71HuNlWETbWQBdYKtAYZ1RG27jGIKOgxiMjdd0ZSbJR0NfZeE3HzbsbjFlsyVvRtlNnMwNZ48FKYin9PJ8PkyWIozxsH8zBqscxsFlsudmk0TtLXqhFZqJWRVda4Qc14IZA5avcgkFgf8QTypI8YAnnTR2KBHAxdg+UgsrkmMoRK9kDLWECtXENhafOr29lYQqPC6Gi8QEtRJ8UNobWVRzd4BlcqN2RjAlebjoiGDZLWpL0wG6QtKchM9ZbmBKQARRYBeVQhlKWsFcYBCWUKxKYgc+URi5CvQAIKslUgOwrC7+TIACmVUmOPpEIpMqEh71JkTv14yvJpyL0U2eJF7sNwETS2zaSPh19c7B8P468zjvUiifGJtWJx7SFxsdpEgpgMfxs7tTenX/0tB0ljPLdr3CyK8Zwh3UnBT+sPoSXnfI8lSMstRLRSuJK9+5ljqTwKO6EDklahbcKtv+kLjzJulSJV8MoAAAAASUVORK5CYII=); background-position: 0 0; background-repeat: no-repeat; diff --git a/subPages/comments/comment.vue b/subPages/comments/comment.vue index 5976d3d..c00ebec 100644 --- a/subPages/comments/comment.vue +++ b/subPages/comments/comment.vue @@ -16,7 +16,7 @@ <view class="w-100 my-4 flex j-star a-center"> <view class="font-32 font-bold mr-2">商å“评分</view> <rate - :value="1.3" + :value.sync="form.v1" size="17" margin="15" /> @@ -27,16 +27,17 @@ class="input-area font-24" placeholder-class="icon-edit" placeholder="说说您的使用感å—,为更多å°ä¼™ä¼´è´ä¹°æä¾›å‚考~" + maxlength="10" v-model="form.val" /> <view class="w-100 flex j-between a-end"> <viwe class="flex j-start a-center"> - <view class="flex flex-column j-center a-center mr-2"> + <view class="flex flex-column j-center a-center mr-2" @click="handlePhoto"> <image class="icon" src="/static/images/common/icon-img.png" mode="aspectFit" /> <text>æ·»åŠ å›¾ç‰‡</text> </view> - <view class="flex flex-column j-center a-center"> + <view class="flex flex-column j-center a-center" @click="handleVideo"> <image class="icon" src="/static/images/common/icon-video.png" mode="aspectFit" /> <text>æ·»åŠ è§†é¢‘</text> </view> @@ -58,7 +59,7 @@ <view class="w-100 my-4 flex j-star a-center"> <view class="font-2 mr-2">商å“评分</view> <rate - :value="1.3" + :value.sync="form.v2" size="17" margin="15" /> @@ -67,7 +68,7 @@ <view class="w-100 my-4 flex j-star a-center"> <view class="font-28 mr-2">商å“评分</view> <rate - :value="1.3" + :value.sync="form.v3" size="17" margin="15" /> @@ -76,7 +77,7 @@ <view class="w-100 my-4 flex j-star a-center"> <view class="font-28 mr-2">商å“评分</view> <rate - :value="1.3" + :value.sync="form.v4" size="17" margin="15" /> @@ -85,7 +86,7 @@ <view class="descColor font-24">满æ„请给5星哦~</view> </view> - <view class="submit font-32 text-center">æäº¤</view> + <view class="submit font-32 text-center" @click="handleSubmit">æäº¤</view> </view> </template> @@ -98,6 +99,10 @@ data() { return { form: { + v1: 0, + v2: 0, + v3: 0, + v4: 0, val: '' } } @@ -105,7 +110,33 @@ computed: { words() { - return this.form.val.trim().length + return this.form.val.length + } + }, + + methods: { + async handlePhoto() { + try{ + const a = await this.$cWx('chooseImage', {count: 5}) + console.log(a) + }catch(e){ + console.log(e) + this.$toast({title: '程åºé”™è¯¯'}) + } + }, + + async handleVideo() { + try{ + const a = await this.$cWx('chooseVideo', {count: 5}) + console.log(a) + }catch(e){ + console.log(e) + this.$toast({title: '程åºé”™è¯¯'}) + } + }, + + handleSubmit() { + console.log(this.form) } } } diff --git a/utils/common.js b/utils/common.js index 935253d..1aef705 100644 --- a/utils/common.js +++ b/utils/common.js @@ -1,4 +1,4 @@ -import { isFunction } from "@/utils/types.js" +import { isFunction, isObeject } from "@/utils/types.js" import Toast from "@/lib/toast/index.js" import store from "@/store/index.js" /** @@ -103,4 +103,38 @@ export function getURLwithArgs(){ } urlWithArgs = urlWithArgs.substring(0, urlWithArgs.length-1) return urlWithArgs +} + +/** + * @desc 微信接å£promise + * @param { String } wxapi * + * @param { Object } ops 接å£çš„é…ç½® + * @param { Object } cops 自定义的é…ç½® + */ +export function cWx(wxapi, ops = {}, cops = {}) { + if(!isObeject(ops) || !isObeject(cops)) throw new Error('é…置必须是对象') + if(cops.loading) { + wx.showLoading({ + mask: true + }) + } + return new Promise((resolve, reject) => { + wx[wxapi]({ + ...ops, + success: res => { + cops.scb && typeof cops.scb === 'function' && cops.scb() + resolve({status: true, data: res, msg: 'success'}) + }, + fail: err => { + cops.fcb && typeof cops.fcb === 'function' && cops.fcb() + reject({status: true, data: null, msg: err}) + }, + complete: () => { + cops.ccb && typeof cops.ccb === 'function' && cops.ccb() + if(cops.loading) { + wx.hideLoading() + } + } + }) + }) } \ No newline at end of file diff --git a/utils/vue_extend.js b/utils/vue_extend.js index 4597f61..883a7c1 100644 --- a/utils/vue_extend.js +++ b/utils/vue_extend.js @@ -5,12 +5,14 @@ import Modal from '@/lib/modal/index.js' import { checkLogin } from '@/utils/modules/login.js' import globalMixins from '@/mixins/globalMixins.js' import dayjs from 'dayjs' +import { cWx } from '@/utils/common.js' Vue.prototype.$getStorage = getStorage Vue.prototype.$setStorage = setStorage Vue.prototype.$toast = Toast Vue.prototype.$modal = Modal Vue.prototype.$checkLogin = checkLogin +Vue.prototype.$cWx = cWx Vue.filter('parseTime', timestamp => { if (!~~timestamp) return '——' -- 2.24.1