Commit 93e6a26508abe0226b9c435225e0e6bae99b4e8d
1 parent
fa7712dcc0
Exists in
master
首页懒加载
Showing
6 changed files
with
201 additions
and
30 deletions
Show diff stats
src/components/EasyLoadimage/EasyLoadimage.vue
... | ... | @@ -0,0 +1,170 @@ |
1 | +<template> | |
2 | + <view class="easy-loadimage" :id="uid"> | |
3 | + <image class="origin-img" :src="imageSrc?imageSrc:defaultImg" :mode="mode" | |
4 | + v-if="loadImg&&!isLoadError" | |
5 | + v-show="showImg" | |
6 | + :class="{'no-transition':!openTransition,'show-transition':showTransition&&openTransition}" | |
7 | + @load="handleImgLoad" | |
8 | + @error="handleImgError"> | |
9 | + </image> | |
10 | + <view class="loadfail-img" v-else-if="isLoadError"></view> | |
11 | + <view :class="['loading-img',loadingMode]" v-show="!showImg&&!isLoadError"></view> | |
12 | + | |
13 | + </view> | |
14 | +</template> | |
15 | +<script> | |
16 | +// 生成全局唯一id | |
17 | +function generateUUID() { | |
18 | + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { | |
19 | + let r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8); | |
20 | + return v.toString(16); | |
21 | + }) | |
22 | +} | |
23 | +export default{ | |
24 | + props:{ | |
25 | + imageSrc:{ | |
26 | + type: String, | |
27 | + }, | |
28 | + mode:{ | |
29 | + type: String, | |
30 | + }, | |
31 | + scrollTop:{ | |
32 | + type: Number, | |
33 | + }, | |
34 | + loadingMode:{ | |
35 | + type: String, | |
36 | + default:'looming-gray' | |
37 | + }, | |
38 | + openTransition:{ | |
39 | + type: Boolean, | |
40 | + default:true, | |
41 | + }, | |
42 | + viewHeight:{ | |
43 | + type:Number, | |
44 | + default() { | |
45 | + return uni.getSystemInfoSync().windowHeight; | |
46 | + } | |
47 | + } | |
48 | + }, | |
49 | + watch:{ | |
50 | + scrollTop(val){ | |
51 | + this.onScroll(val) | |
52 | + } | |
53 | + }, | |
54 | + data(){ | |
55 | + return { | |
56 | + uid:'', | |
57 | + loadImg:false, | |
58 | + showImg:false, | |
59 | + isLoadError:false, | |
60 | + showTransition:false | |
61 | + } | |
62 | + }, | |
63 | + methods:{ | |
64 | + init(){ | |
65 | + this.uid = 'uid-' + generateUUID(); | |
66 | + this.$nextTick(this.onScroll) | |
67 | + }, | |
68 | + handleImgLoad(e){ | |
69 | + // console.log('success'); | |
70 | + this.showImg = true; | |
71 | + // this.$nextTick(function(){ | |
72 | + // this.showTransition = true | |
73 | + // }) | |
74 | + setTimeout(()=>{ | |
75 | + this.showTransition = true | |
76 | + },50) | |
77 | + }, | |
78 | + handleImgError(e){ | |
79 | + // console.log('fail'); | |
80 | + this.isLoadError = true; | |
81 | + }, | |
82 | + onScroll(scrollTop){ | |
83 | + // 加载ing时才执行滚动监听判断是否可加载 | |
84 | + if(this.loadImg || this.isLoadError) return; | |
85 | + const id = this.uid | |
86 | + const query = uni.createSelectorQuery().in(this); | |
87 | + query.select('#'+id).boundingClientRect(data => { | |
88 | + if(!data) return; | |
89 | + if(data.top - this.viewHeight<0){ | |
90 | + this.loadImg = true; | |
91 | + } | |
92 | + }).exec() | |
93 | + }, | |
94 | + }, | |
95 | + mounted() { | |
96 | + this.init() | |
97 | + } | |
98 | +} | |
99 | +</script> | |
100 | + | |
101 | +<style scoped> | |
102 | + /* 官方优化图片tips */ | |
103 | + image{ | |
104 | + will-change: transform | |
105 | + } | |
106 | + /* 渐变过渡效果处理 */ | |
107 | + image.origin-img{ | |
108 | + width: 100%; | |
109 | + height: 100%; | |
110 | + opacity: 0.3; | |
111 | + } | |
112 | + image.origin-img.show-transition{ | |
113 | + transition: opacity 1.2s; | |
114 | + opacity: 1; | |
115 | + } | |
116 | + image.origin-img.no-transition{ | |
117 | + opacity: 1; | |
118 | + } | |
119 | + /* 加载失败、加载中的占位图样式控制 */ | |
120 | + .loadfail-img{ | |
121 | + height: 100%; | |
122 | + background: url('~@/static/easy-loadimage/loadfail.png') no-repeat center; | |
123 | + background-size: 50%; | |
124 | + } | |
125 | + .loading-img{ | |
126 | + height: 100%; | |
127 | + } | |
128 | + /* 转圈 */ | |
129 | + .spin-circle{ | |
130 | + background: url('~@/static/easy-loadimage/loading.gif') no-repeat center; | |
131 | + background-size: 100rpx; | |
132 | + } | |
133 | + /* 动态灰色若隐若现 */ | |
134 | + .looming-gray{ | |
135 | + animation: looming-gray 1s infinite linear; | |
136 | + background-color: #e3e3e3; | |
137 | + } | |
138 | + @keyframes looming-gray{ | |
139 | + 0% {background-color:#e3e3e3aa;} | |
140 | + 50% {background-color:#e3e3e3;} | |
141 | + 100% {background-color:#e3e3e3aa;} | |
142 | + } | |
143 | + /* 骨架屏1 */ | |
144 | + .skeleton-1{ | |
145 | + background-color: #e3e3e3; | |
146 | + background-image: linear-gradient(100deg, rgba(255, 255, 255, 0), rgba(255, 255, 255, 0.2) 50%, rgba(255, 255, 255, 0) 80%); | |
147 | + background-size: 100rpx 100%; | |
148 | + background-repeat: repeat-y; | |
149 | + background-position:0 0; | |
150 | + animation: skeleton-1 .6s infinite; | |
151 | + } | |
152 | + @keyframes skeleton-1 { | |
153 | + to { | |
154 | + background-position: 200% 0; | |
155 | + } | |
156 | + } | |
157 | + /* 骨架屏2 */ | |
158 | + .skeleton-2{ | |
159 | + background-image: linear-gradient(-90deg, #fefefe 0%, #e6e6e6 50%,#fefefe 100%); | |
160 | + background-size: 400% 400%; | |
161 | + background-position:0 0; | |
162 | + animation: skeleton-2 1.2s ease-in-out infinite; | |
163 | + } | |
164 | + @keyframes skeleton-2{ | |
165 | + to { | |
166 | + background-position: -135% 0; | |
167 | + } | |
168 | + } | |
169 | +</style> | |
170 | + | ... | ... |
src/pages/cart/cart.vue
... | ... | @@ -8,7 +8,7 @@ |
8 | 8 | <view class="cardHeader"> |
9 | 9 | <view |
10 | 10 | v-bind:class="pIsoPen? 'partentChecked' : 'partentCheck'" |
11 | - @tap="pChange(pIsoPen)" | |
11 | + @touchstart="pChange(pIsoPen)" | |
12 | 12 | > |
13 | 13 | <span class="correct"></span> |
14 | 14 | </view> |
... | ... | @@ -21,12 +21,12 @@ |
21 | 21 | <view |
22 | 22 | class="cardBody" |
23 | 23 | v-for="(item,index) in cartList" |
24 | - :key="item.cart_id" | |
24 | + :key="index" | |
25 | 25 | @longpress="delCart(item.cart_id,index)" |
26 | 26 | > |
27 | 27 | <view |
28 | 28 | v-bind:class="childIsOpen[index]? 'partentChecked':'partentCheck'" |
29 | - @tap="Change(childIsOpen[index],index)" | |
29 | + @touchstart="Change(childIsOpen[index],index)" | |
30 | 30 | > |
31 | 31 | <span class="correct"></span> |
32 | 32 | </view> |
... | ... | @@ -47,11 +47,10 @@ |
47 | 47 | @tap="toGoods(item.pid,item.sk_id)" |
48 | 48 | >{{item.p_name}}</view> |
49 | 49 | <!-- <view class="describ"> --> |
50 | - <uni-collapse accordion="true"> | |
50 | + <uni-collapse accordion="true" style="justify-content: space-around;width: 196px;"> | |
51 | 51 | <uni-collapse-item |
52 | 52 | showAnimation='true' |
53 | - :title="item.tag.prod_tag_fun[0].label+'/'+item.tag.prod_tag_fun[1].label+'/'+item.tag.prod_tag_fun[2].label+'...' || '暂无'" | |
54 | - > | |
53 | + :title="item.tag.prod_tag_fun[0].label&&item.tag.prod_tag_fun[1].label?item.tag.prod_tag_fun[0].label+'/'+item.tag.prod_tag_fun[1].label+'...':'暂无数据'"> | |
55 | 54 | <text class="describ"> |
56 | 55 | <block |
57 | 56 | v-for="tag in item.tag.prod_tag_fun" |
... | ... | @@ -127,6 +126,7 @@ export default { |
127 | 126 | |
128 | 127 | cartList() { |
129 | 128 | // console.log('cart-list', this.$store.state.cart.cartList); |
129 | + this.totalPrice=0 | |
130 | 130 | return this.$store.state.cart.cartList |
131 | 131 | }, |
132 | 132 | childIsOpen() { |
... | ... | @@ -268,24 +268,24 @@ export default { |
268 | 268 | // console.log('delcart------>cart_id',cart_id) |
269 | 269 | // console.log('cartlist====>delcart',this.$store.state.cart.cartList) |
270 | 270 | // console.log('delcart======>index',index) |
271 | - const uid = this.$store.state.user.userInfo.uid | |
272 | - const openid = this.$store.state.user.userInfo.openid | |
273 | - uni.showModal({ | |
274 | - title: '是否删除该商品', | |
275 | - // content: '是否删除该商品', | |
276 | - success: function (res) { | |
277 | - if (res.confirm) { | |
278 | - // this.$store.state.cart.cartList.splice(index,1) | |
279 | - store.dispatch('cart/delCart', { | |
280 | - uid: uid, | |
281 | - openid: openid, | |
282 | - cart_id: cart_id, // 要修改的购物车id | |
283 | - arg: index, // 由于action 传参是能接收两参数,因此将index放入对象 | |
284 | - }) | |
285 | - console.log('用户点击确定') | |
286 | - } | |
287 | - }, | |
288 | - }) | |
271 | + uni.showModal({ | |
272 | + title: '是否删除该商品', | |
273 | + // content: '是否删除该商品', | |
274 | + success: function (res) { | |
275 | + if (res.confirm) { | |
276 | + if (this.childIsOpen[index]) { | |
277 | + this.totalPrice = this.totalPrice - (this.$store.state.cart.cartList[index].nowPrice*this.$store.state.cart.cartList[index].num) | |
278 | + } | |
279 | + console.log('index===>',index) | |
280 | + store.dispatch('cart/delCart', { | |
281 | + uid: this.$store.state.user.userInfo.uid, | |
282 | + openid: this.$store.state.user.userInfo.openid, | |
283 | + cart_id: cart_id, // 要修改的购物车id | |
284 | + arg: index, // 由于action 传参是能接收两参数,因此将index放入对象 | |
285 | + }) | |
286 | + } | |
287 | + }.bind(this), | |
288 | + }) | |
289 | 289 | }, |
290 | 290 | }, |
291 | 291 | } |
... | ... | @@ -308,14 +308,14 @@ export default { |
308 | 308 | border-radius: 22px; |
309 | 309 | border: 1px solid #cfcfcf; |
310 | 310 | background-color: #ffffff; |
311 | - margin: 6px; | |
311 | + margin: 24rpx 12rpx 24rpx 24rpx; | |
312 | 312 | } |
313 | 313 | .partentChecked { |
314 | 314 | width: 18px; |
315 | 315 | height: 18px; |
316 | 316 | border-radius: 22px; |
317 | 317 | background-color: #ff6b4a; |
318 | - margin: 6px; | |
318 | + margin: 24rpx 12rpx 24rpx 24rpx; | |
319 | 319 | .correct { |
320 | 320 | display: inline-block; |
321 | 321 | position: relative; | ... | ... |
src/static/easy-loadimage/loadfail.png
3.42 KB
src/static/easy-loadimage/loading.gif
16.9 KB
src/store/modules/index.js
... | ... | @@ -9,7 +9,7 @@ |
9 | 9 | |
10 | 10 | const state = { |
11 | 11 | categoryList: [], |
12 | - list: [], | |
12 | + list: [] | |
13 | 13 | }; |
14 | 14 | |
15 | 15 | const mutations = { |
... | ... | @@ -18,7 +18,7 @@ const mutations = { |
18 | 18 | }, |
19 | 19 | CATEGORY: (state, categoryList) => { |
20 | 20 | state.categoryList = categoryList; |
21 | - }, | |
21 | + } | |
22 | 22 | }; |
23 | 23 | |
24 | 24 | const actions = { |
... | ... | @@ -84,7 +84,7 @@ const actions = { |
84 | 84 | console.log("complete status === > ", res); |
85 | 85 | }, |
86 | 86 | }) |
87 | - } | |
87 | + }, | |
88 | 88 | }; |
89 | 89 | |
90 | 90 | export default { | ... | ... |
src/store/modules/userRecommand.js
... | ... | @@ -23,7 +23,8 @@ const actions = { |
23 | 23 | url: recommandList, |
24 | 24 | data: param, |
25 | 25 | success: (res) => { |
26 | - console.log(res.data.data) | |
26 | + console.log('ReccomandList请求结果',res.data) | |
27 | + // console.log(res.data.data) | |
27 | 28 | // const Res={...res.data.data.list,...data.data.list} |
28 | 29 | const data = res.data.data |
29 | 30 | for (let index = 0; index < data.length; index++) { | ... | ... |