Commit 289f85d9e9fc921a9742aee91883d046633c6feb
1 parent
c41ff77d35
Exists in
master
提交
Showing
202 changed files
with
5636 additions
and
13545 deletions
Show diff stats
Too many changes.
To preserve performance only 100 of 202 files displayed.
App.vue
1 | <script> | File was deleted | |
2 | export default { | ||
3 | onLaunch: function() { | ||
4 | console.log('App Launch') | ||
5 | }, | ||
6 | onShow: function() { | ||
7 | console.log('App Show') | ||
8 | }, | ||
9 | onHide: function() { | ||
10 | console.log('App Hide') | ||
11 | } | ||
12 | } | ||
13 | </script> | ||
14 | |||
15 | <style> | ||
16 | /*每个页面公共css */ | ||
17 | </style> | ||
18 | 1 | <script> |
common/data.js
1 | // 数据格式,数据中只需要包含以下字段和数据格式,可以添加字段,比如id等等,不影响组件显示, | File was deleted | |
2 | // 组件的返回结果是有菜单数组下标形式返回, | ||
3 | // 如果传入数据中有value,也会返回value,开发者可根据返回的下标获取所选中的菜单 | ||
4 | /* | ||
5 | [ | ||
6 | { | ||
7 | "name":"", //字符串类型 选填项 菜单名称,如不填,则取第一个子菜单的name值,filter和radio类型则将设置为"筛选" | ||
8 | "type":"" //字符串类型 必填项 可取值 hierarchy/filter/radio hierarchy单/多层级菜单(最多三级); filter筛选多选菜单; radio筛选单选菜单 | ||
9 | "submenu":[ //对象数组类型 必填项 子菜单数据 | ||
10 | { | ||
11 | "name":"", //字符串类型 必填项 菜单名称 | ||
12 | "value":"", //字符串类型 选填项 自定义内容,比如id等等,如果填写了,confirm返回的结果中将返回对应选中的value,若菜单无value字段则返回null,filter类型此字段无效果 | ||
13 | "submenu":[ //对象数组类型 必填项 子菜单数据 | ||
14 | { | ||
15 | "name":"", //字符串类型 必填项 菜单名称 | ||
16 | "value":"", //字符串类型 选填项 自定义内容,比如id等等,如果填写了,confirm返回的结果中将返回对应选中的value,若菜单无value字段则返回null | ||
17 | "submenu":[ //对象数组类型 必填项 子菜单数据 filter类型无效 | ||
18 | { | ||
19 | "name":"", //字符串类型 必填项 菜单名称 hierarchy类型层级最多到此 | ||
20 | "value":"", //字符串类型 选填项 自定义内容,比如id等等,如果填写了,confirm返回的结果中将返回对应选中的value,若菜单无value字段则返回null | ||
21 | } | ||
22 | ] | ||
23 | } | ||
24 | ] | ||
25 | } | ||
26 | ] | ||
27 | } | ||
28 | ] | ||
29 | */ | ||
30 | |||
31 | //0.0.4版本起 返回结果将有两部分组成: | ||
32 | /* | ||
33 | { | ||
34 | index:[], //旧版本的下标数组形式 | ||
35 | value:[] //菜单中的valve,结构和下标结果数组一样,只是把下标替换成了value而已 | ||
36 | } | ||
37 | */ | ||
38 | // 以下演示数据中,我故意把value设置成跟name一样,只是为了方便演示,使示例更加易懂,实际使用时候value应该是一个标识,给后台识别所用的. | ||
39 | // 数据较长,请仔细查看。 | ||
40 | export default [ | ||
41 | { | ||
42 | "name":'综合', | ||
43 | "type": 'filter', | ||
44 | "submenu": [{ | ||
45 | "submenu": [ | ||
46 | |||
47 | ] | ||
48 | }, | ||
49 | ], | ||
50 | }, | ||
51 | { | ||
52 | name:'品牌', | ||
53 | "type": 'filter', | ||
54 | "submenu": [{ | ||
55 | "name": '品牌', | ||
56 | "value": "品牌", | ||
57 | "submenu": [{ | ||
58 | "name": "帕森", | ||
59 | "value": "帕森", | ||
60 | }, | ||
61 | { | ||
62 | "name": "海伦凯勒", | ||
63 | "value": "海伦凯勒", | ||
64 | }, | ||
65 | ] | ||
66 | }, | ||
67 | ] | ||
68 | }, | ||
69 | { | ||
70 | "name":'功能', | ||
71 | "type": 'filter', | ||
72 | "submenu": [{ | ||
73 | "name": "智能排序", | ||
74 | "value": "智能排序" | ||
75 | }, | ||
76 | { | ||
77 | "name": "离我最近", | ||
78 | "value": "离我最近" | ||
79 | }, | ||
80 | { | ||
81 | "name": "人均从高到低", | ||
82 | "value": "人均从高到低" | ||
83 | }, | ||
84 | { | ||
85 | "name": "人均从低到高", | ||
86 | "value": "人均从低到高" | ||
87 | } | ||
88 | ] | ||
89 | }, | ||
90 | { | ||
91 | "name":'材质', | ||
92 | "type": 'filter', | ||
93 | "submenu": [{ | ||
94 | "submenu": [{ | ||
95 | "name": "满减活动", | ||
96 | "value": "满减活动" | ||
97 | }, | ||
98 | { | ||
99 | "name": "打折优惠", | ||
100 | "value": "打折优惠" | ||
101 | }, | ||
102 | { | ||
103 | "name": "会员专享", | ||
104 | "value": "会员专享" | ||
105 | } | ||
106 | ] | ||
107 | } | ||
108 | ] | ||
109 | }, | ||
110 | { | ||
111 | "name":'折扣', | ||
112 | "type": 'filter', | ||
113 | "submenu": [{ | ||
114 | "name": "折扣(多选)", | ||
115 | "submenu": [{ | ||
116 | "name": "满减活动", | ||
117 | "value": "满减活动" | ||
118 | }, | ||
119 | { | ||
120 | "name": "打折优惠", | ||
121 | "value": "打折优惠" | ||
122 | }, | ||
123 | { | ||
124 | "name": "会员专享", | ||
125 | "value": "会员专享" | ||
126 | } | ||
127 | ] | ||
128 | } | ||
129 | ] | ||
130 | } | ||
131 | ] | ||
132 | |||
133 | 1 | // 数据格式,数据中只需要包含以下字段和数据格式,可以添加字段,比如id等等,不影响组件显示, |
components/HM-filterDropdown/HM-filterDropdown.vue
1 | <template> | File was deleted | |
2 | <view class="HMfilterDropdown" @touchmove.stop.prevent="discard" @tap.stop="discard"> | ||
3 | <view class="nav"> | ||
4 | <block v-for="(item,index) in menu" :key="index"> | ||
5 | <view class="first-menu" :class="{'on':showPage==index}" @tap="togglePage(index)"> | ||
6 | <text class="name">{{item.name}}</text> | ||
7 | <text class="iconfont triangle" :style="'transform:rotate('+triangleDeg[index]+'deg);'"></text> | ||
8 | </view> | ||
9 | </block> | ||
10 | </view> | ||
11 | <view class="mask" :class="{'show':isShowMask,'hide':maskVisibility!=true}" @tap="togglePage(showPage)"></view> | ||
12 | <block v-for="(page,page_index) in subData" :key="page_index"> | ||
13 | <view class="sub-menu-class" :class="{'show':showPage==page_index,'hide':pageState[page_index]!=true}"> | ||
14 | <block v-if="page.type=='hierarchy'&& page.submenu.length>0"> | ||
15 | <scroll-view class="sub-menu-list" :class="[activeMenuArr[page_index].length>1?'first':'alone']" | ||
16 | :scroll-y="true" :scroll-into-view="'first_id'+firstScrollInto"> | ||
17 | <block v-for="(sub,index) in page.submenu" :key="index"> | ||
18 | <view class="sub-menu" :id="'first_id'+index" :class="{'on':activeMenuArr[page_index][0]==index}" @tap="selectHierarchyMenu(page_index,index,null,null)"> | ||
19 | <view class="menu-name"> | ||
20 | <text>{{sub.name}}</text> | ||
21 | <text class="iconfont selected"></text> | ||
22 | </view> | ||
23 | </view> | ||
24 | </block> | ||
25 | </scroll-view> | ||
26 | <block v-for="(sub,index) in page.submenu" :key="index"> | ||
27 | <scroll-view class="sub-menu-list not-first" :scroll-y="true" v-if="activeMenuArr[page_index][0]==index&&sub.submenu.length>0" | ||
28 | :scroll-into-view="'second_id'+secondScrollInto"> | ||
29 | <block v-for="(sub_second,second_index) in sub.submenu" :key="second_index"> | ||
30 | <view class="sub-menu" :id="'second_id'+second_index" :class="{'on':activeMenuArr[page_index][1]==second_index}"> | ||
31 | <view class="menu-name" @tap="selectHierarchyMenu(page_index,activeMenuArr[page_index][0],second_index,null)"> | ||
32 | <text>{{sub_second.name}}</text> | ||
33 | <text class="iconfont selected"></text> | ||
34 | </view> | ||
35 | <view class="more-sub-menu" v-if="sub_second.submenu&&sub.submenu.length>0&&sub_second.submenu.length>0"> | ||
36 | <block v-for="(sub2,sub2_index) in sub_second.submenu" :key="sub2_index"> | ||
37 | <text v-if="sub_second.showAllSub || (sub2_index<8)" :class="{'on':activeMenuArr[page_index][1]==second_index&&activeMenuArr[page_index][2]==sub2_index}" | ||
38 | @tap="selectHierarchyMenu(page_index,activeMenuArr[page_index][0],second_index,sub2_index)">{{sub2.name}}</text> | ||
39 | <text v-if="sub_second.showAllSub!=true && sub2_index==8 && sub_second.submenu.length>9" @tap="showMoreSub(second_index)">更多<text | ||
40 | class="iconfont triangle"></text></text> | ||
41 | </block> | ||
42 | </view> | ||
43 | </view> | ||
44 | </block> | ||
45 | </scroll-view> | ||
46 | </block> | ||
47 | </block> | ||
48 | <block v-if="page.type=='filter'"> | ||
49 | <view class="filter"> | ||
50 | <scroll-view class="menu-box" :scroll-y="true"> | ||
51 | <view class="box" v-for="(box,box_index) in page.submenu" :key="box_index"> | ||
52 | <view class="title">{{box.name}}</view> | ||
53 | <view class="labels"> | ||
54 | <view v-for="(label,label_index) in box.submenu" :key="label_index" @tap="selectFilterLabel(page_index,box_index,label_index)" | ||
55 | :class="{'on':label.selected}">{{label.name}}</view> | ||
56 | </view> | ||
57 | </view> | ||
58 | </scroll-view> | ||
59 | <view class="btn-box"> | ||
60 | <view class="reset" @tap="resetFilterData(page_index)">重置</view> | ||
61 | <view class="submit" @tap="setFilterData(page_index)">确定</view> | ||
62 | </view> | ||
63 | </view> | ||
64 | </block> | ||
65 | <block v-if="page.type=='radio'"> | ||
66 | <view class="filter"> | ||
67 | <scroll-view class="menu-box" :scroll-y="true"> | ||
68 | <view class="box" v-for="(box,box_index) in page.submenu" :key="box_index"> | ||
69 | <view class="title">{{box.name}}</view> | ||
70 | <view class="labels"> | ||
71 | <view v-for="(label,label_index) in box.submenu" :key="label_index" @tap="selectRadioLabel(page_index,box_index,label_index)" | ||
72 | :class="{'on':label.selected}">{{label.name}}</view> | ||
73 | </view> | ||
74 | </view> | ||
75 | </scroll-view> | ||
76 | <view class="btn-box"> | ||
77 | <view class="reset" @tap="resetFilterData(page_index)">重置</view> | ||
78 | <view class="submit" @tap="setFilterData(page_index)">确定</view> | ||
79 | </view> | ||
80 | </view> | ||
81 | </block> | ||
82 | </view> | ||
83 | </block> | ||
84 | </view> | ||
85 | </template> | ||
86 | <script> | ||
87 | export default { | ||
88 | data() { | ||
89 | return { | ||
90 | subData: [], //菜单数据 | ||
91 | menu: [], //顶部横条数据 | ||
92 | showPage: -1, //菜单页面显示/隐藏动画控制 | ||
93 | pageState: [], //页面的状态 | ||
94 | activeMenuArr: [], //UI状态 | ||
95 | shadowActiveMenuArr: [], //记录选中 | ||
96 | defaultActive:[], | ||
97 | triangleDeg: [], //小三角形的翻转动画控制 | ||
98 | isShowMask: false, //遮罩层显示/隐藏动画控制 | ||
99 | maskVisibility: false, //遮罩层显示/隐藏状态 | ||
100 | //滚动区域定位 | ||
101 | firstScrollInto: 0, | ||
102 | secondScrollInto: 0, | ||
103 | componentTop:0 ,//组件top | ||
104 | isReadNewSelect:false | ||
105 | } | ||
106 | }, | ||
107 | props: { | ||
108 | filterData: { | ||
109 | value: Array, | ||
110 | default: [] | ||
111 | }, | ||
112 | defaultSelected:{ | ||
113 | value: Array, | ||
114 | default: [] | ||
115 | }, | ||
116 | updateMenuName:{ | ||
117 | value: Boolean, | ||
118 | default: true | ||
119 | }, | ||
120 | dataFormat:{ | ||
121 | value: String, | ||
122 | default: 'Array' | ||
123 | } | ||
124 | }, | ||
125 | watch: { | ||
126 | filterData: { | ||
127 | handler() { | ||
128 | this.initMenu(); //filterData重新赋值初始化菜单 | ||
129 | }, | ||
130 | immediate: true | ||
131 | }, | ||
132 | defaultSelected(newVal) { | ||
133 | if(newVal.length==0){ | ||
134 | return; | ||
135 | } | ||
136 | this.defaultActive = JSON.parse(JSON.stringify(newVal)); | ||
137 | this.activeMenuArr = JSON.parse(JSON.stringify(newVal)); | ||
138 | this.shadowActiveMenuArr = JSON.parse(JSON.stringify(newVal)); | ||
139 | if(this.updateMenuName){ | ||
140 | this.setMenuName(); | ||
141 | } | ||
142 | } | ||
143 | }, | ||
144 | methods: { | ||
145 | initMenu() { | ||
146 | let tmpMenuActiveArr=[]; | ||
147 | let tmpMenu=[]; | ||
148 | for (let i = 0; i < this.filterData.length; i++) { | ||
149 | let tmpitem = this.filterData[i]; | ||
150 | tmpMenu.push({ | ||
151 | //如果没有设置name,则取第一个菜单作为menu.name,filter类型则将"筛选"作为menu.name | ||
152 | name: tmpitem.name || (tmpitem.type == "filter" ? "筛选" : tmpitem.submenu[0].name), | ||
153 | type: tmpitem.type | ||
154 | }); | ||
155 | //初始化选中项数组-ui状态 | ||
156 | tmpMenuActiveArr.push(this.processActive(tmpitem)); | ||
157 | //初始化角度数组 | ||
158 | this.triangleDeg.push(0); | ||
159 | //初始化控制显示状态数组 | ||
160 | this.pageState.push(false); | ||
161 | //递归处理子菜单数据 | ||
162 | tmpitem = this.processSubMenu(tmpitem); | ||
163 | this.filterData[i] = tmpitem; | ||
164 | } | ||
165 | this.menu = tmpMenu; | ||
166 | //初始化选中项数组 | ||
167 | tmpMenuActiveArr = this.defaultActive.length>0?this.defaultActive:this.activeMenuArr.length>0?this.activeMenuArr:tmpMenuActiveArr; | ||
168 | this.defaultActive = []; | ||
169 | this.activeMenuArr = JSON.parse(JSON.stringify(tmpMenuActiveArr)); | ||
170 | this.shadowActiveMenuArr = JSON.parse(JSON.stringify(tmpMenuActiveArr)); | ||
171 | //加载菜单数据 | ||
172 | this.subData = this.filterData; | ||
173 | //设定顶部菜单名字 | ||
174 | if(this.updateMenuName){ | ||
175 | this.setMenuName(); | ||
176 | } | ||
177 | }, | ||
178 | setMenuName(){ | ||
179 | for(var i=0;i<this.activeMenuArr.length;i++){ | ||
180 | let row = this.activeMenuArr[i]; | ||
181 | if (typeof(row[0]) != 'object'){ | ||
182 | var tmpsub = false; | ||
183 | if(row.length>0 && row[0]!=null){ | ||
184 | tmpsub = this.subData[i].submenu[row[0]]; | ||
185 | if(row.length>1 && row[1]!=null){ | ||
186 | tmpsub = tmpsub.submenu[row[1]]; | ||
187 | if(row.length>2 && row[2]!=null){ | ||
188 | tmpsub = tmpsub.submenu[row[2]]; | ||
189 | } | ||
190 | } | ||
191 | }else{ | ||
192 | tmpsub = false; | ||
193 | } | ||
194 | if(tmpsub){ | ||
195 | this.menu[i].name = tmpsub.name; | ||
196 | } | ||
197 | } | ||
198 | } | ||
199 | }, | ||
200 | //展开更多 | ||
201 | showMoreSub(index) { | ||
202 | this.subData[this.showPage].submenu[this.activeMenuArr[this.showPage][0]].submenu[index].showAllSub = true; | ||
203 | this.$forceUpdate(); | ||
204 | }, | ||
205 | //选中 | ||
206 | selectHierarchyMenu(page_index, level1_index, level2_index, level3_index) { | ||
207 | //读取记录 | ||
208 | if (level1_index != null && level2_index == null && level3_index == null && this.shadowActiveMenuArr[page_index][0] == | ||
209 | level1_index) { | ||
210 | this.activeMenuArr.splice(page_index, 1, JSON.parse(JSON.stringify(this.shadowActiveMenuArr[page_index]))); | ||
211 | } else { | ||
212 | this.activeMenuArr[page_index].splice(0, 1, level1_index); | ||
213 | (level2_index!=null||this.activeMenuArr[page_index].length>=2)&&this.activeMenuArr[page_index].splice(1, 1, level2_index) || this.activeMenuArr[page_index].splice(1, 1); | ||
214 | (level3_index!=null||this.activeMenuArr[page_index].length>=3)&&this.activeMenuArr[page_index].splice(2, 1, level3_index) || this.activeMenuArr[page_index].splice(2, 1); | ||
215 | } | ||
216 | //写入结果 | ||
217 | if (level3_index != null || level2_index != null || (level1_index != null && this.subData[page_index].submenu[level1_index].submenu.length == 0) | ||
218 | ) { | ||
219 | let sub = this.subData[page_index].submenu[level1_index].submenu[level2_index]; | ||
220 | if(this.updateMenuName){ | ||
221 | this.menu[page_index].name = (level3_index != null && sub.submenu[level3_index].name) || (level2_index != null && sub.name) || this.subData[page_index].submenu[level1_index].name; | ||
222 | } | ||
223 | this.shadowActiveMenuArr[page_index] = JSON.parse(JSON.stringify(this.activeMenuArr[page_index])); | ||
224 | this.togglePage(this.showPage); | ||
225 | } | ||
226 | }, | ||
227 | //写入结果,筛选 | ||
228 | setFilterData(page_index) { | ||
229 | this.shadowActiveMenuArr[page_index] = JSON.parse(JSON.stringify(this.activeMenuArr[page_index])); | ||
230 | this.togglePage(this.showPage); | ||
231 | }, | ||
232 | //重置结果和ui,筛选 | ||
233 | resetFilterData(page_index) { | ||
234 | let tmpArr = []; | ||
235 | let level = this.shadowActiveMenuArr[page_index].length; | ||
236 | while (level > 0) { | ||
237 | tmpArr.push([]); | ||
238 | let box = this.subData[page_index].submenu[level - 1].submenu; | ||
239 | for (let i = 0; i < box.length; i++) { | ||
240 | this.subData[page_index].submenu[level - 1].submenu[i].selected = false; | ||
241 | } | ||
242 | level--; | ||
243 | } | ||
244 | this.activeMenuArr[page_index] = JSON.parse(JSON.stringify(tmpArr)); | ||
245 | this.$forceUpdate(); | ||
246 | }, | ||
247 | //选中筛选类label-UI状态 | ||
248 | selectFilterLabel(page_index, box_index, label_index) { | ||
249 | let find_index = this.activeMenuArr[page_index][box_index].indexOf(label_index); | ||
250 | if (find_index > -1) { | ||
251 | this.activeMenuArr[page_index][box_index].splice(find_index, 1); | ||
252 | this.subData[page_index].submenu[box_index].submenu[label_index].selected = false; | ||
253 | } else { | ||
254 | this.activeMenuArr[page_index][box_index].push(label_index); | ||
255 | this.subData[page_index].submenu[box_index].submenu[label_index].selected = true; | ||
256 | } | ||
257 | this.$forceUpdate(); | ||
258 | }, | ||
259 | //选中单选类label-UI状态 | ||
260 | selectRadioLabel(page_index, box_index, label_index) { | ||
261 | |||
262 | let activeIndex = this.activeMenuArr[page_index][box_index][0]; | ||
263 | if(activeIndex == label_index){ | ||
264 | this.subData[page_index].submenu[box_index].submenu[activeIndex].selected = false; | ||
265 | this.activeMenuArr[page_index][box_index][0] = null; | ||
266 | }else{ | ||
267 | if(activeIndex!=null && activeIndex<this.subData[page_index].submenu[box_index].submenu.length){ | ||
268 | this.subData[page_index].submenu[box_index].submenu[activeIndex].selected = false; | ||
269 | } | ||
270 | |||
271 | this.subData[page_index].submenu[box_index].submenu[label_index].selected = true; | ||
272 | this.activeMenuArr[page_index][box_index][0] = label_index; | ||
273 | } | ||
274 | this.$forceUpdate(); | ||
275 | }, | ||
276 | //菜单开关 | ||
277 | togglePage(index) { | ||
278 | if (index == this.showPage) { | ||
279 | this.hidePageLayer(true); | ||
280 | this.hideMask(); | ||
281 | this.showPage = -1; | ||
282 | } else { | ||
283 | if (this.showPage > -1) { | ||
284 | this.hidePageLayer(false); | ||
285 | } | ||
286 | this.showPageLayer(index); | ||
287 | this.showMask(); | ||
288 | } | ||
289 | }, | ||
290 | //hide遮罩层 | ||
291 | hideMask() { | ||
292 | this.isShowMask = false; | ||
293 | setTimeout(() => { | ||
294 | this.maskVisibility = false; | ||
295 | }, 200); | ||
296 | }, | ||
297 | //show遮罩层 | ||
298 | showMask() { | ||
299 | this.maskVisibility = true; | ||
300 | this.$nextTick(() => { | ||
301 | setTimeout(() => { | ||
302 | this.isShowMask = true; | ||
303 | }, 0); | ||
304 | }) | ||
305 | }, | ||
306 | //hide菜单页 | ||
307 | hidePageLayer(isAnimation) { | ||
308 | this.triangleDeg[this.showPage] = 0; | ||
309 | let tmpIndex = this.showPage; | ||
310 | if (isAnimation) { | ||
311 | setTimeout(() => { | ||
312 | this.pageState.splice(tmpIndex, 1, false); | ||
313 | }, 200); | ||
314 | this.confirm(); | ||
315 | } else { | ||
316 | this.pageState.splice(tmpIndex, 1, false) | ||
317 | } | ||
318 | this.firstScrollInto = null; | ||
319 | this.secondScrollInto = null; | ||
320 | }, | ||
321 | confirm() { | ||
322 | let index = JSON.parse(JSON.stringify(this.shadowActiveMenuArr)); | ||
323 | let value = JSON.parse(JSON.stringify(this.shadowActiveMenuArr)); | ||
324 | |||
325 | //对结果做一下处理 | ||
326 | index.forEach((item, i) => { | ||
327 | if (typeof(item[0]) == 'object') { | ||
328 | //针对筛选结果过一个排序 | ||
329 | item.forEach((s, j) => { | ||
330 | if(s!=null){ | ||
331 | s.sort((val1, val2) => { | ||
332 | return val1 - val2; | ||
333 | }); | ||
334 | item[j] = s; | ||
335 | s.forEach((v, k) => { | ||
336 | value[i][j][k] = (v==null||v>=this.subData[i].submenu[j].submenu.length)?null:this.subData[i].submenu[j].submenu[v].value; | ||
337 | if(this.subData[i].type == 'radio' && value[i][j][k] == null){ | ||
338 | value[i][j] = []; | ||
339 | index[i][j] = []; | ||
340 | } | ||
341 | }); | ||
342 | } | ||
343 | }); | ||
344 | }else{ | ||
345 | let submenu = this.subData[i].submenu[item[0]]; | ||
346 | value[i][0] = submenu.value; | ||
347 | if(value[i].length>=2 && item[1]!=null){ | ||
348 | if(submenu.submenu.length>0){ | ||
349 | submenu = submenu.submenu[item[1]]; | ||
350 | value[i][1] = submenu.hasOwnProperty('value')?submenu.value:null; | ||
351 | }else{ | ||
352 | value[i][1] = null | ||
353 | } | ||
354 | if(value[i].length>=3 && item[2]!=null){ | ||
355 | if(submenu.submenu.length>0){ | ||
356 | submenu = submenu.submenu[item[2]]; | ||
357 | value[i][2] = submenu.hasOwnProperty('value')?submenu.value:null; | ||
358 | }else{ | ||
359 | value[i][2] = null; | ||
360 | } | ||
361 | } | ||
362 | } | ||
363 | } | ||
364 | index[i] = item; | ||
365 | |||
366 | }); | ||
367 | // 输出 | ||
368 | this.$emit('confirm', { | ||
369 | index: index, | ||
370 | value: value | ||
371 | }); | ||
372 | }, | ||
373 | //show菜单页 | ||
374 | showPageLayer(index) { | ||
375 | this.processPage(index); | ||
376 | this.pageState.splice(index, 1, true); | ||
377 | this.$nextTick(() => { | ||
378 | setTimeout(() => { | ||
379 | this.showPage = index; | ||
380 | }, 0); | ||
381 | }) | ||
382 | this.triangleDeg[index] = 180; | ||
383 | }, | ||
384 | reloadActiveMenuArr(){ | ||
385 | for (let i = 0; i < this.filterData.length; i++) { | ||
386 | let tmpitem = this.filterData[i]; | ||
387 | let tmpArr = this.processActive(tmpitem); | ||
388 | tmpitem = this.processSubMenu(tmpitem); | ||
389 | if(this.activeMenuArr[i].length!=tmpArr.length){ | ||
390 | this.filterData[i] = tmpitem; | ||
391 | this.activeMenuArr.splice(i, 1, JSON.parse(JSON.stringify(tmpArr))); | ||
392 | this.shadowActiveMenuArr.splice(i, 1, JSON.parse(JSON.stringify(tmpArr))); | ||
393 | } | ||
394 | } | ||
395 | this.subData = this.filterData; | ||
396 | this.$forceUpdate(); | ||
397 | }, | ||
398 | processPage(index) { | ||
399 | //check UI控制数组,结果数组,防止传入数据层级和UI控制数组不同步 | ||
400 | this.reloadActiveMenuArr(); | ||
401 | //重置UI控制数组 | ||
402 | this.activeMenuArr.splice(index, 1, JSON.parse(JSON.stringify(this.shadowActiveMenuArr[index]))); | ||
403 | if (this.menu[index].type == 'filter') { | ||
404 | //重载筛选页选中状态 | ||
405 | let level = this.shadowActiveMenuArr[index].length; | ||
406 | for (let i = 0; i < level; i++) { | ||
407 | let box = this.subData[index].submenu[i].submenu; | ||
408 | for (let j = 0; j < box.length; j++) { | ||
409 | if (this.shadowActiveMenuArr[index][i].indexOf(j) > -1) { | ||
410 | this.subData[index].submenu[i].submenu[j].selected = true; | ||
411 | } else { | ||
412 | this.subData[index].submenu[i].submenu[j].selected = false; | ||
413 | } | ||
414 | } | ||
415 | } | ||
416 | } else if (this.menu[index].type == 'hierarchy') { | ||
417 | this.$nextTick(() => { | ||
418 | setTimeout(() => { | ||
419 | //滚动到选中项 | ||
420 | this.firstScrollInto = parseInt(this.activeMenuArr[index][0]); | ||
421 | this.secondScrollInto = parseInt(this.activeMenuArr[index][1]); | ||
422 | }, 0); | ||
423 | }) | ||
424 | } else if (this.menu[index].type == 'radio') { | ||
425 | //重载筛选页选中状态 | ||
426 | let level = this.shadowActiveMenuArr[index].length; | ||
427 | for (let i = 0; i < level; i++) { | ||
428 | let box = this.subData[index].submenu[i].submenu; | ||
429 | for (let j = 0; j < box.length; j++) { | ||
430 | if (this.shadowActiveMenuArr[index][i].indexOf(j) > -1) { | ||
431 | this.subData[index].submenu[i].submenu[j].selected = true; | ||
432 | } else { | ||
433 | this.subData[index].submenu[i].submenu[j].selected = false; | ||
434 | } | ||
435 | } | ||
436 | } | ||
437 | } | ||
438 | }, | ||
439 | processActive(tmpitem) { | ||
440 | let tmpArr = [] | ||
441 | if (tmpitem.type == 'hierarchy'&&tmpitem.hasOwnProperty('submenu')&&tmpitem.submenu.length>0) { | ||
442 | let level = this.getMaxFloor(tmpitem.submenu); | ||
443 | while (level > 0) { | ||
444 | tmpArr.push(0); | ||
445 | level--; | ||
446 | } | ||
447 | } else if (tmpitem.type == 'filter') { | ||
448 | let level = tmpitem.submenu.length; | ||
449 | while (level > 0) { | ||
450 | tmpArr.push([]); | ||
451 | level--; | ||
452 | } | ||
453 | } else if (tmpitem.type == 'radio') { | ||
454 | let level = tmpitem.submenu.length; | ||
455 | while (level > 0) { | ||
456 | tmpArr.push([]); | ||
457 | level--; | ||
458 | } | ||
459 | } | ||
460 | return tmpArr; | ||
461 | }, | ||
462 | processSubMenu(menu) { | ||
463 | if (menu.hasOwnProperty('submenu') && menu.submenu.length > 0) { | ||
464 | for (let i = 0; i < menu.submenu.length; i++) { | ||
465 | menu.submenu[i] = this.processSubMenu(menu.submenu[i]); | ||
466 | } | ||
467 | } else { | ||
468 | menu.submenu = []; | ||
469 | } | ||
470 | return menu; | ||
471 | }, | ||
472 | //计算菜单层级 | ||
473 | getMaxFloor(treeData) { | ||
474 | let floor = 0 | ||
475 | let max = 0 | ||
476 | function each(data, floor) { | ||
477 | data.forEach(e => { | ||
478 | max = floor > max ? floor : max; | ||
479 | if (e.hasOwnProperty('submenu') && e.submenu.length > 0) { | ||
480 | each(e.submenu, floor + 1) | ||
481 | } | ||
482 | }) | ||
483 | } | ||
484 | each(treeData, 1) | ||
485 | return max; | ||
486 | }, | ||
487 | discard() { | ||
488 | |||
489 | } | ||
490 | } | ||
491 | } | ||
492 | </script> | ||
493 | <style lang="scss"> | ||
494 | .HMfilterDropdown { | ||
495 | flex-shrink: 0; | ||
496 | width: 100%; | ||
497 | height: 44px; | ||
498 | position: fixed; | ||
499 | z-index: 997; | ||
500 | flex-wrap: nowrap; | ||
501 | display: flex; | ||
502 | flex-direction: row; | ||
503 | top: var(--window-top); | ||
504 | left:0; | ||
505 | view { | ||
506 | display: flex; | ||
507 | flex-wrap: nowrap; | ||
508 | } | ||
509 | } | ||
510 | .region { | ||
511 | flex: 1; | ||
512 | height: 44px; | ||
513 | } | ||
514 | .nav { | ||
515 | width: 100%; | ||
516 | height: 44px; | ||
517 | border-bottom: solid 1rpx #eee; | ||
518 | z-index: 12; | ||
519 | background-color: #ffffff; | ||
520 | flex-direction: row; | ||
521 | .first-menu { | ||
522 | width: 100%; | ||
523 | font-size: 13px; | ||
524 | color: #757575; | ||
525 | flex-direction: row; | ||
526 | align-items: center; | ||
527 | justify-content: center; | ||
528 | transition: color .2s linear; | ||
529 | |||
530 | &.on { | ||
531 | color: #ec652b; | ||
532 | |||
533 | .iconfont { | ||
534 | color: #ec652b; | ||
535 | } | ||
536 | } | ||
537 | .name { | ||
538 | height: 20px; | ||
539 | text-align: center; | ||
540 | text-overflow: clip; | ||
541 | overflow: hidden; | ||
542 | } | ||
543 | .iconfont { | ||
544 | width: 13px; | ||
545 | height: 13px; | ||
546 | align-items: center; | ||
547 | justify-content: center; | ||
548 | transition: transform .2s linear, color .2s linear; | ||
549 | } | ||
550 | } | ||
551 | } | ||
552 | .sub-menu-class { | ||
553 | width: 100%; | ||
554 | position: absolute; | ||
555 | left: 0; | ||
556 | transform: translate3d(0, - 100%, 0); | ||
557 | max-height: 345px; | ||
558 | background-color: #ffffff; | ||
559 | z-index: 11; | ||
560 | box-shadow: 0 5px 5px rgba(0, 0, 0, .1); | ||
561 | overflow: hidden; | ||
562 | flex-direction: row; | ||
563 | transition: transform .15s linear; | ||
564 | &.hide { | ||
565 | display: none; | ||
566 | } | ||
567 | |||
568 | &.show { | ||
569 | transform: translate3d(0, calc(44px + 1rpx), 0); | ||
570 | } | ||
571 | } | ||
572 | .sub-menu-list { | ||
573 | width: 100%; | ||
574 | height: 345px; | ||
575 | flex-direction: column; | ||
576 | .sub-menu { | ||
577 | min-height: 44px; | ||
578 | font-size: 13px; | ||
579 | flex-direction: column; | ||
580 | padding-right: 15px; | ||
581 | >.menu-name { | ||
582 | height: 44px; | ||
583 | flex-direction: row; | ||
584 | align-items: center; | ||
585 | justify-content: space-between; | ||
586 | >.iconfont { | ||
587 | display: none; | ||
588 | font-size: 18px; | ||
589 | color: #ec652b; | ||
590 | } | ||
591 | } | ||
592 | } | ||
593 | &.first { | ||
594 | flex-shrink: 0; | ||
595 | width: 236rpx; | ||
596 | background-color: #f0f0f0; | ||
597 | .sub-menu { | ||
598 | padding-left: 15px; | ||
599 | |||
600 | &.on { | ||
601 | background-color: #fff; | ||
602 | } | ||
603 | } | ||
604 | } | ||
605 | &.alone { | ||
606 | max-height: 345px; | ||
607 | min-height: 170px; | ||
608 | height: auto; | ||
609 | .sub-menu { | ||
610 | min-height: calc(44px - 1rpx); | ||
611 | margin-left: 15px; | ||
612 | border-bottom: solid 1rpx #e5e5e5; | ||
613 | |||
614 | &.on { | ||
615 | color: #ec652b; | ||
616 | |||
617 | >.menu-name { | ||
618 | >.iconfont { | ||
619 | display: block; | ||
620 | } | ||
621 | } | ||
622 | } | ||
623 | } | ||
624 | } | ||
625 | &.not-first { | ||
626 | .sub-menu { | ||
627 | min-height: calc(44px - 1rpx); | ||
628 | margin-left: 15px; | ||
629 | border-bottom: solid 1rpx #e5e5e5; | ||
630 | >.menu-name { | ||
631 | height: calc(44px - 1rpx); | ||
632 | >.iconfont { | ||
633 | display: none; | ||
634 | font-size: 18px; | ||
635 | color: #ec652b; | ||
636 | } | ||
637 | } | ||
638 | &.on { | ||
639 | color: #ec652b; | ||
640 | >.menu-name { | ||
641 | >.iconfont { | ||
642 | display: block; | ||
643 | } | ||
644 | } | ||
645 | } | ||
646 | .more-sub-menu { | ||
647 | flex-direction: row; | ||
648 | flex-wrap: wrap; | ||
649 | padding-bottom: 9px; | ||
650 | >text { | ||
651 | height: 30px; | ||
652 | border-radius: 3px; | ||
653 | background-color: #f5f5f5; | ||
654 | color: #9b9b9b; | ||
655 | margin-bottom: 6px; | ||
656 | margin-right: 6px; | ||
657 | text-align: center; | ||
658 | line-height: 30px; | ||
659 | border: solid #f5f5f5 1rpx; | ||
660 | flex: 0 0 calc(33.33% - 6px); | ||
661 | overflow: hidden; | ||
662 | font-size: 12px; | ||
663 | &:nth-child(3n) { | ||
664 | margin-right: 0; | ||
665 | } | ||
666 | &.on { | ||
667 | border-color: #f6c8ac; | ||
668 | color: #ec652b; | ||
669 | } | ||
670 | .iconfont { | ||
671 | color: #9b9b9b; | ||
672 | } | ||
673 | } | ||
674 | } | ||
675 | } | ||
676 | } | ||
677 | } | ||
678 | .filter { | ||
679 | width: 100%; | ||
680 | height: 345px; | ||
681 | display: flex; | ||
682 | flex-direction: column; | ||
683 | justify-content: space-between; | ||
684 | align-items: center; | ||
685 | .menu-box { | ||
686 | width: 698rpx; | ||
687 | height: calc(345px - 75px); | ||
688 | flex-shrink: 1; | ||
689 | .box { | ||
690 | width: 100%; | ||
691 | margin-top: 16px; | ||
692 | flex-direction: column; | ||
693 | .title { | ||
694 | width: 100%; | ||
695 | font-size: 13px; | ||
696 | color: #888; | ||
697 | } | ||
698 | .labels { | ||
699 | flex-direction: row; | ||
700 | flex-wrap: wrap; | ||
701 | .on { | ||
702 | border-color: #ec652b; | ||
703 | background-color: #ec652b; | ||
704 | color: #fff; | ||
705 | } | ||
706 | >view { | ||
707 | width: 148rpx; | ||
708 | height: 30px; | ||
709 | border: solid 1rpx #adadad; | ||
710 | border-radius: 2px; | ||
711 | margin-right: 15px; | ||
712 | margin-top: 8px; | ||
713 | font-size: 12px; | ||
714 | flex-direction: row; | ||
715 | justify-content: center; | ||
716 | align-items: center; | ||
717 | &:nth-child(4n) { | ||
718 | margin-right: 0; | ||
719 | } | ||
720 | } | ||
721 | } | ||
722 | } | ||
723 | } | ||
724 | .btn-box { | ||
725 | flex-shrink: 0; | ||
726 | width: 698rpx; | ||
727 | height: 75px; | ||
728 | flex-direction: row !important; | ||
729 | align-items: center; | ||
730 | justify-content: space-between; | ||
731 | >view { | ||
732 | width: 320rpx; | ||
733 | height: 40px; | ||
734 | border-radius: 40px; | ||
735 | border: solid 1rpx #ec652b; | ||
736 | align-items: center; | ||
737 | justify-content: center; | ||
738 | } | ||
739 | .reset { | ||
740 | color: #ec652b; | ||
741 | } | ||
742 | .submit { | ||
743 | color: #fff; | ||
744 | background-color: #ec652b; | ||
745 | } | ||
746 | } | ||
747 | } | ||
748 | .mask { | ||
749 | z-index: 10; | ||
750 | position: fixed; | ||
751 | top: 0; | ||
752 | left: 0; | ||
753 | right: 0; | ||
754 | bottom: 0; | ||
755 | background-color: rgba(0, 0, 0, 0); | ||
756 | transition: background-color .15s linear; | ||
757 | &.show { | ||
758 | background-color: rgba(0, 0, 0, 0.5); | ||
759 | } | ||
760 | &.hide { | ||
761 | display: none; | ||
762 | } | ||
763 | } | ||
764 | /* 字体图标 */ | ||
765 | @font-face { | ||
766 | font-family: "HM-FD-font"; | ||
767 | src: url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAALAAAsAAAAABpQAAAJzAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDBgp4gQIBNgIkAwwLCAAEIAWEbQc5G8sFERWMIbIfCbbzqA4hp7InSBibVsYGb4J42o82b3e/nJlHMw/NHbGOlwKJRCRpwzPtpAECCOZubdqxjYpQLMlVg+70/08edrgQOtx2ukpVyApZn+dyehPoQObHo3O85rYx9vOjXoBxQIHugW2yIkqIW2QXcScu4jwE8CSWbKSmrqUHFwOaJoCsLM5P4haSGIxRcRHshrUGucLCVcfqI3AZfV/+USguKCwNmtsxVztDxU/n55C+3W0Z4QQpEOTNFqCBbMCAjDUWB9CIwWk87aa70cYgqLkyd3dEmm+18R8eKATEBrV7A5CulBT8dKiWOYZk412XNcDdKSEKSGODnyKIDl+dmVt9/Dx4pu/xyeutkMlHISGPTsPCnoTNP9nOT6wTtDdlO6dPr47efvj942lkYuQzrhMKEjq9N6y98P3340gmlJ/RStUD6F31CAEEPtUW94/7rf+7XgaAz57X0ZHXAGsFFwVgw38yALuMb0IBbVyNamFYEw4oKMDTj3AHRQP5Pt4dci9VwSVkRNQh5r7CLskZadhsWHhRDBsXczk8ZYk3ewnCxmQeQKa3BOHvA8XXO2j+vqRhf7CE+sPmn4anvoL29JLa4qqaUQkmoK+QG2osCckq7txi2leK86aIPyJ3eQZ8xytXYmyQ51jQndJAxIJlqiGSLsOqImiZCjTiZCJt6Lq26U2OoXqwUo0hRaAE0K5AziANy/uLVeXzWyjVqyjcoeupjxDr5MMDn8MDkLG9Aenu5ZrOSSoghAUsRmogkkahSoWAtnlUARnCkY3It0Iu7mWhdmd9Z/19BwBP6GidEi0G56opckXTGZVSPxgAAAA='); | ||
768 | } | ||
769 | .iconfont { | ||
770 | font-family: "HM-FD-font" !important; | ||
771 | font-size: 13px; | ||
772 | font-style: normal; | ||
773 | color: #757575; | ||
774 | &.triangle { | ||
775 | &:before { | ||
776 | content: "\e65a"; | ||
777 | } | ||
778 | } | ||
779 | &.selected { | ||
780 | &:before { | ||
781 | content: "\e607"; | ||
782 | } | ||
783 | } | ||
784 | } | ||
785 | </style> | ||
786 | 1 | <template> |
components/card.vue
1 | <template> | File was deleted | |
2 | <view> | ||
3 | |||
4 | </view> | ||
5 | </template> | ||
6 | |||
7 | <script> | ||
8 | export default { | ||
9 | data() { | ||
10 | return { | ||
11 | |||
12 | }; | ||
13 | } | ||
14 | } | ||
15 | </script> | ||
16 | |||
17 | <style lang="scss"> | ||
18 | |||
19 | </style> | ||
20 | 1 | <template> |
components/uni-drawer/uni-drawer.vue
1 | <template> | File was deleted | |
2 | <view v-if="visibleSync" :class="{ 'uni-drawer--visible': showDrawer }" class="uni-drawer" @touchmove.stop.prevent="clear"> | ||
3 | <view class="uni-drawer__mask" :class="{ 'uni-drawer__mask--visible': showDrawer && mask }" @tap="close('mask')" /> | ||
4 | <view class="uni-drawer__content" :class="{'uni-drawer--right': rightMode,'uni-drawer--left': !rightMode, 'uni-drawer__content--visible': showDrawer}" :style="{width:drawerWidth+'px'}"> | ||
5 | <slot /> | ||
6 | </view> | ||
7 | </view> | ||
8 | </template> | ||
9 | |||
10 | <script> | ||
11 | /** | ||
12 | * Drawer 抽屉 | ||
13 | * @description 抽屉侧滑菜单 | ||
14 | * @tutorial https://ext.dcloud.net.cn/plugin?id=26 | ||
15 | * @property {Boolean} mask = [true | false] 是否显示遮罩 | ||
16 | * @property {Boolean} maskClick = [true | false] 点击遮罩是否关闭 | ||
17 | * @property {Boolean} mode = [left | right] Drawer 滑出位置 | ||
18 | * @value left 从左侧滑出 | ||
19 | * @value right 从右侧侧滑出 | ||
20 | * @property {Number} width 抽屉的宽度 ,仅 vue 页面生效 | ||
21 | * @event {Function} close 组件关闭时触发事件 | ||
22 | */ | ||
23 | export default { | ||
24 | name: 'UniDrawer', | ||
25 | props: { | ||
26 | /** | ||
27 | * 显示模式(左、右),只在初始化生效 | ||
28 | */ | ||
29 | mode: { | ||
30 | type: String, | ||
31 | default: '' | ||
32 | }, | ||
33 | /** | ||
34 | * 蒙层显示状态 | ||
35 | */ | ||
36 | mask: { | ||
37 | type: Boolean, | ||
38 | default: true | ||
39 | }, | ||
40 | /** | ||
41 | * 遮罩是否可点击关闭 | ||
42 | */ | ||
43 | maskClick:{ | ||
44 | type: Boolean, | ||
45 | default: true | ||
46 | }, | ||
47 | /** | ||
48 | * 抽屉宽度 | ||
49 | */ | ||
50 | width: { | ||
51 | type: Number, | ||
52 | default: 220 | ||
53 | } | ||
54 | }, | ||
55 | data() { | ||
56 | return { | ||
57 | visibleSync: false, | ||
58 | showDrawer: false, | ||
59 | rightMode: false, | ||
60 | watchTimer: null, | ||
61 | drawerWidth: 220 | ||
62 | } | ||
63 | }, | ||
64 | created() { | ||
65 | // #ifndef APP-NVUE | ||
66 | this.drawerWidth = this.width | ||
67 | // #endif | ||
68 | this.rightMode = this.mode === 'right' | ||
69 | }, | ||
70 | methods: { | ||
71 | clear(){}, | ||
72 | close(type) { | ||
73 | // fixed by mehaotian 抽屉尚未完全关闭或遮罩禁止点击时不触发以下逻辑 | ||
74 | if((type === 'mask' && !this.maskClick) || !this.visibleSync) return | ||
75 | this._change('showDrawer', 'visibleSync', false) | ||
76 | }, | ||
77 | open() { | ||
78 | // fixed by mehaotian 处理重复点击打开的事件 | ||
79 | if(this.visibleSync) return | ||
80 | this._change('visibleSync', 'showDrawer', true) | ||
81 | }, | ||
82 | _change(param1, param2, status) { | ||
83 | this[param1] = status | ||
84 | if (this.watchTimer) { | ||
85 | clearTimeout(this.watchTimer) | ||
86 | } | ||
87 | this.watchTimer = setTimeout(() => { | ||
88 | this[param2] = status | ||
89 | this.$emit('change',status) | ||
90 | }, status ? 50 : 300) | ||
91 | } | ||
92 | } | ||
93 | } | ||
94 | </script> | ||
95 | |||
96 | <style lang="scss" scoped> | ||
97 | // 抽屉宽度 | ||
98 | $drawer-width: 220px; | ||
99 | |||
100 | .uni-drawer { | ||
101 | /* #ifndef APP-NVUE */ | ||
102 | display: block; | ||
103 | /* #endif */ | ||
104 | position: fixed; | ||
105 | top: 0; | ||
106 | left: 0; | ||
107 | right: 0; | ||
108 | bottom: 0; | ||
109 | overflow: hidden; | ||
110 | z-index: 999; | ||
111 | } | ||
112 | |||
113 | .uni-drawer__content { | ||
114 | /* #ifndef APP-NVUE */ | ||
115 | display: block; | ||
116 | /* #endif */ | ||
117 | position: absolute; | ||
118 | top: 0; | ||
119 | width: $drawer-width; | ||
120 | bottom: 0; | ||
121 | background-color: $uni-bg-color; | ||
122 | transition: transform 0.3s ease; | ||
123 | } | ||
124 | |||
125 | .uni-drawer--left { | ||
126 | left: 0; | ||
127 | /* #ifdef APP-NVUE */ | ||
128 | transform: translateX(-$drawer-width); | ||
129 | /* #endif */ | ||
130 | /* #ifndef APP-NVUE */ | ||
131 | transform: translateX(-100%); | ||
132 | /* #endif */ | ||
133 | } | ||
134 | |||
135 | .uni-drawer--right { | ||
136 | right: 0; | ||
137 | /* #ifdef APP-NVUE */ | ||
138 | transform: translateX($drawer-width); | ||
139 | /* #endif */ | ||
140 | /* #ifndef APP-NVUE */ | ||
141 | transform: translateX(100%); | ||
142 | /* #endif */ | ||
143 | } | ||
144 | |||
145 | .uni-drawer__content--visible { | ||
146 | transform: translateX(0px); | ||
147 | } | ||
148 | |||
149 | |||
150 | .uni-drawer__mask { | ||
151 | /* #ifndef APP-NVUE */ | ||
152 | display: block; | ||
153 | /* #endif */ | ||
154 | opacity: 0; | ||
155 | position: absolute; | ||
156 | top: 0; | ||
157 | left: 0; | ||
158 | bottom: 0; | ||
159 | right: 0; | ||
160 | background-color: $uni-bg-color-mask; | ||
161 | transition: opacity 0.3s; | ||
162 | } | ||
163 | |||
164 | .uni-drawer__mask--visible { | ||
165 | /* #ifndef APP-NVUE */ | ||
166 | display: block; | ||
167 | /* #endif */ | ||
168 | opacity: 1; | ||
169 | } | ||
170 | </style> | ||
171 | 1 | <template> |
main.js
1 | import Vue from 'vue' | File was deleted | |
2 | import App from './App' | ||
3 | |||
4 | Vue.config.productionTip = false | ||
5 | |||
6 | App.mpType = 'app' | ||
7 | |||
8 | const app = new Vue({ | ||
9 | ...App | ||
10 | }) | ||
11 | app.$mount() | ||
12 | 1 | import Vue from 'vue' |
manifest.json
1 | { | File was deleted | |
2 | "name" : "gulu-vue", | ||
3 | "appid" : "", | ||
4 | "description" : "", | ||
5 | "versionName" : "1.0.0", | ||
6 | "versionCode" : "100", | ||
7 | "transformPx" : false, | ||
8 | /* 5+App特有相关 */ | ||
9 | "app-plus" : { | ||
10 | "usingComponents" : true, | ||
11 | "nvueCompiler" : "uni-app", | ||
12 | "compilerVersion" : 3, | ||
13 | "splashscreen" : { | ||
14 | "alwaysShowBeforeRender" : true, | ||
15 | "waiting" : true, | ||
16 | "autoclose" : true, | ||
17 | "delay" : 0 | ||
18 | }, | ||
19 | /* 模块配置 */ | ||
20 | "modules" : {}, | ||
21 | /* 应用发布信息 */ | ||
22 | "distribute" : { | ||
23 | /* android打包配置 */ | ||
24 | "android" : { | ||
25 | "permissions" : [ | ||
26 | "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>", | ||
27 | "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>", | ||
28 | "<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>", | ||
29 | "<uses-permission android:name=\"android.permission.VIBRATE\"/>", | ||
30 | "<uses-permission android:name=\"android.permission.READ_LOGS\"/>", | ||
31 | "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>", | ||
32 | "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>", | ||
33 | "<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>", | ||
34 | "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>", | ||
35 | "<uses-permission android:name=\"android.permission.CAMERA\"/>", | ||
36 | "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>", | ||
37 | "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>", | ||
38 | "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>", | ||
39 | "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>", | ||
40 | "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>", | ||
41 | "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>", | ||
42 | "<uses-permission android:name=\"android.permission.CALL_PHONE\"/>", | ||
43 | "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>", | ||
44 | "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>", | ||
45 | "<uses-feature android:name=\"android.hardware.camera\"/>", | ||
46 | "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>", | ||
47 | "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>" | ||
48 | ] | ||
49 | }, | ||
50 | /* ios打包配置 */ | ||
51 | "ios" : {}, | ||
52 | /* SDK配置 */ | ||
53 | "sdkConfigs" : {} | ||
54 | } | ||
55 | }, | ||
56 | /* 快应用特有相关 */ | ||
57 | "quickapp" : {}, | ||
58 | /* 小程序特有相关 */ | ||
59 | "mp-weixin" : { | ||
60 | "appid" : "", | ||
61 | "setting" : { | ||
62 | "urlCheck" : false | ||
63 | }, | ||
64 | "usingComponents" : true | ||
65 | }, | ||
66 | "mp-alipay" : { | ||
67 | "usingComponents" : true | ||
68 | }, | ||
69 | "mp-baidu" : { | ||
70 | "usingComponents" : true | ||
71 | }, | ||
72 | "mp-toutiao" : { | ||
73 | "usingComponents" : true | ||
74 | } | ||
75 | } | ||
76 | 1 | { |
package.json
File was created | 1 | { | |
2 | "name": "gulu-vue", | ||
3 | "version": "0.1.0", | ||
4 | "private": true, | ||
5 | "scripts": { | ||
6 | "serve": "npm run dev:h5", | ||
7 | "build": "npm run build:h5", | ||
8 | "build:app-plus": "cross-env NODE_ENV=production UNI_PLATFORM=app-plus vue-cli-service uni-build", | ||
9 | "build:custom": "cross-env NODE_ENV=production uniapp-cli custom", | ||
10 | "build:h5": "cross-env NODE_ENV=production UNI_PLATFORM=h5 vue-cli-service uni-build", | ||
11 | "build:mp-alipay": "cross-env NODE_ENV=production UNI_PLATFORM=mp-alipay vue-cli-service uni-build", | ||
12 | "build:mp-baidu": "cross-env NODE_ENV=production UNI_PLATFORM=mp-baidu vue-cli-service uni-build", | ||
13 | "build:mp-qq": "cross-env NODE_ENV=production UNI_PLATFORM=mp-qq vue-cli-service uni-build", | ||
14 | "build:mp-toutiao": "cross-env NODE_ENV=production UNI_PLATFORM=mp-toutiao vue-cli-service uni-build", | ||
15 | "build:mp-weixin": "cross-env NODE_ENV=production UNI_PLATFORM=mp-weixin vue-cli-service uni-build", | ||
16 | "build:quickapp-light": "cross-env NODE_ENV=production UNI_PLATFORM=quickapp-light vue-cli-service uni-build", | ||
17 | "build:quickapp-vue": "cross-env NODE_ENV=production UNI_PLATFORM=quickapp-vue vue-cli-service uni-build", | ||
18 | "dev:app-plus": "cross-env NODE_ENV=development UNI_PLATFORM=app-plus vue-cli-service uni-build --watch", | ||
19 | "dev:custom": "cross-env NODE_ENV=development uniapp-cli custom", | ||
20 | "dev:h5": "cross-env NODE_ENV=development UNI_PLATFORM=h5 vue-cli-service uni-serve", | ||
21 | "dev:mp-alipay": "cross-env NODE_ENV=development UNI_PLATFORM=mp-alipay vue-cli-service uni-build --watch", | ||
22 | "dev:mp-baidu": "cross-env NODE_ENV=development UNI_PLATFORM=mp-baidu vue-cli-service uni-build --watch", | ||
23 | "dev:mp-qq": "cross-env NODE_ENV=development UNI_PLATFORM=mp-qq vue-cli-service uni-build --watch", | ||
24 | "dev:mp-toutiao": "cross-env NODE_ENV=development UNI_PLATFORM=mp-toutiao vue-cli-service uni-build --watch", | ||
25 | "dev:mp-weixin": "cross-env NODE_ENV=development UNI_PLATFORM=mp-weixin vue-cli-service uni-build --watch", | ||
26 | "dev:quickapp-light": "cross-env NODE_ENV=development UNI_PLATFORM=quickapp-light vue-cli-service uni-build --watch", | ||
27 | "dev:quickapp-vue": "cross-env NODE_ENV=development UNI_PLATFORM=quickapp-vue vue-cli-service uni-build --watch", | ||
28 | "info": "node node_modules/@dcloudio/vue-cli-plugin-uni/commands/info.js", | ||
29 | "serve:quickapp-vue": "node node_modules/@dcloudio/uni-quickapp-vue/bin/serve.js" | ||
30 | }, | ||
31 | "dependencies": { | ||
32 | "@dcloudio/uni-app-plus": "^2.0.0-26920200424005", | ||
33 | "@dcloudio/uni-h5": "^2.0.0-26920200424005", | ||
34 | "@dcloudio/uni-helper-json": "^1.0.5", | ||
35 | "@dcloudio/uni-mp-alipay": "^2.0.0-26920200424005", | ||
36 | "@dcloudio/uni-mp-baidu": "^2.0.0-26920200424005", | ||
37 | "@dcloudio/uni-mp-qq": "^2.0.0-26920200424005", | ||
38 | "@dcloudio/uni-mp-toutiao": "^2.0.0-26920200424005", | ||
39 | "@dcloudio/uni-mp-weixin": "^2.0.0-26920200424005", | ||
40 | "@dcloudio/uni-quickapp-light": "^2.0.0-26920200424005", | ||
41 | "@dcloudio/uni-quickapp-vue": "^2.0.0-26920200424005", | ||
42 | "@dcloudio/uni-stat": "^2.0.0-26920200424005", | ||
43 | "core-js": "^3.6.5", | ||
44 | "flyio": "^0.6.2", | ||
45 | "node-sass": "^4.14.0", | ||
46 | "regenerator-runtime": "^0.12.1", | ||
47 | "sass-loader": "^8.0.2", | ||
48 | "vue": "^2.6.11", | ||
49 | "vuex": "^3.0.1" | ||
50 | }, | ||
51 | "devDependencies": { | ||
52 | "@dcloudio/uni-cli-shared": "^2.0.0-26920200424005", | ||
53 | "@dcloudio/uni-migration": "^2.0.0-26920200424005", | ||
54 | "@dcloudio/uni-template-compiler": "^2.0.0-26920200424005", | ||
55 | "@dcloudio/vue-cli-plugin-hbuilderx": "^2.0.0-26920200424005", | ||
56 | "@dcloudio/vue-cli-plugin-uni": "^2.0.0-26920200424005", | ||
57 | "@dcloudio/vue-cli-plugin-uni-optimize": "^2.0.0-26920200424005", | ||
58 | "@dcloudio/webpack-uni-mp-loader": "^2.0.0-26920200424005", | ||
59 | "@dcloudio/webpack-uni-pages-loader": "^2.0.0-26920200424005", | ||
60 | "@types/html5plus": "*", | ||
61 | "@types/uni-app": "*", | ||
62 | "@vue/cli-plugin-babel": "~4.3.0", | ||
63 | "@vue/cli-service": "~4.3.0", | ||
64 | "babel-plugin-import": "^1.11.0", | ||
65 | "cross-env": "^7.0.2", | ||
66 | "mini-types": "*", | ||
67 | "miniprogram-api-typings": "^2.8.0-2", | ||
68 | "postcss-comment": "^2.0.0", | ||
69 | "vue-template-compiler": "^2.6.11" | ||
70 | }, | ||
71 | "browserslist": [ | ||
72 | "Android >= 4", | ||
73 | "ios >= 8" | ||
74 | ], | ||
75 | "uni-app": { | ||
76 | "scripts": {} | ||
77 | } | ||
78 | } | ||
79 |
pages.json
1 | { | File was deleted | |
2 | "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages | ||
3 | { | ||
4 | "path": "pages/index/index", | ||
5 | "style": { | ||
6 | "navigationBarTitleText": "商城一览" | ||
7 | } | ||
8 | }, | ||
9 | { | ||
10 | "path": "pages/cart/cart", | ||
11 | "style": { | ||
12 | "navigationBarTitleText": "购物车" | ||
13 | } | ||
14 | }, | ||
15 | { | ||
16 | "path": "pages/user/user", | ||
17 | "style": { | ||
18 | "navigationBarTitleText": "我的" | ||
19 | } | ||
20 | } | ||
21 | ], | ||
22 | "globalStyle": { | ||
23 | "navigationBarTextStyle": "black", | ||
24 | "navigationBarTitleText": "uni-app", | ||
25 | "navigationBarBackgroundColor": "#F8F8F8", | ||
26 | "backgroundColor": "#F8F8F8" | ||
27 | }, | ||
28 | "tabBar": { | ||
29 | "color": "#C0C4CC", | ||
30 | "selectedColor": "#fa436a", | ||
31 | "borderStyle": "black", | ||
32 | "backgroundColor": "#ffffff", | ||
33 | "list": [{ | ||
34 | "pagePath": "pages/index/index", | ||
35 | "iconPath": "static/tab-home.png", | ||
36 | "selectedIconPath": "static/tab-home-current.png", | ||
37 | "text": "首页" | ||
38 | }, | ||
39 | { | ||
40 | "pagePath": "pages/cart/cart", | ||
41 | "iconPath": "static/tab-cart.png", | ||
42 | "selectedIconPath": "static/tab-cart-current.png", | ||
43 | "text": "购物车" | ||
44 | }, | ||
45 | { | ||
46 | "pagePath": "pages/user/user", | ||
47 | "iconPath": "static/tab-my.png", | ||
48 | "selectedIconPath": "static/tab-my-current.png", | ||
49 | "text": "我的" | ||
50 | } | ||
51 | ] | ||
52 | } | ||
53 | } | ||
54 | 1 | { |
pages/cart/cart.vue
1 | <template> | File was deleted | |
2 | <view class="content"> | ||
3 | <image class="logo" src="/static/logo.png"></image> | ||
4 | <view class="text-area"> | ||
5 | <text class="title">{{title}}</text> | ||
6 | </view> | ||
7 | </view> | ||
8 | </template> | ||
9 | |||
10 | <script> | ||
11 | export default { | ||
12 | data() { | ||
13 | return { | ||
14 | title: 'Hello' | ||
15 | } | ||
16 | }, | ||
17 | onLoad() { | ||
18 | |||
19 | }, | ||
20 | methods: { | ||
21 | |||
22 | } | ||
23 | } | ||
24 | </script> | ||
25 | |||
26 | <style> | ||
27 | .content { | ||
28 | display: flex; | ||
29 | flex-direction: column; | ||
30 | align-items: center; | ||
31 | justify-content: center; | ||
32 | } | ||
33 | |||
34 | .logo { | ||
35 | height: 200rpx; | ||
36 | width: 200rpx; | ||
37 | margin-top: 200rpx; | ||
38 | margin-left: auto; | ||
39 | margin-right: auto; | ||
40 | margin-bottom: 50rpx; | ||
41 | } | ||
42 | |||
43 | .text-area { | ||
44 | display: flex; | ||
45 | justify-content: center; | ||
46 | } | ||
47 | |||
48 | .title { | ||
49 | font-size: 36rpx; | ||
50 | color: #8f8f94; | ||
51 | } | ||
52 | </style> | ||
53 | 1 | <template> |
pages/index/index.vue
1 | <template> | File was deleted | |
2 | <view class="content"> | ||
3 | <view class="header"> | ||
4 | <!-- 搜索--> | ||
5 | <view class="searchBar"> | ||
6 | <icon class="searchIcon" type="search" size="14"></icon> | ||
7 | <input class="searchIpt" placeholder="老花镜" confirm-type="search"/> | ||
8 | </view> | ||
9 | |||
10 | <!-- 筛选栏--> | ||
11 | <view class="screenBar"> | ||
12 | <view v-for="item in screenItems" :key="item.current" @click="onClickItem(item.current)" > | ||
13 | <view class="screenItem" v-bind:class="{ active: current === item.current }" v-if="item.current === 2" @click="dropDown"> | ||
14 | {{ item.text }}<icon type="info" size="14"></icon> | ||
15 | </view> | ||
16 | <view class="screenItem" v-bind:class="{ active: current === item.current }" v-if="item.current === 4" @click="showDrawer('showRight')"> | ||
17 | {{ item.text }}<icon type="info" size="14"></icon> | ||
18 | </view> | ||
19 | <view v-if="item.current !== 2&&item.current!==4"> | ||
20 | <view class="screenItem" v-bind:class="{ active: current === item.current }">{{ item.text }}</view> | ||
21 | </view> | ||
22 | </view> | ||
23 | </view> | ||
24 | </view> | ||
25 | <uni-drawer ref="showRight" mask="true" maskClick=true mode="right" :width="320" @change="change($event,'showRight')"> | ||
26 | <view class="close"> | ||
27 | <view @click="closeDrawer('showRight')"><text class="word-btn-white">关闭</text></view> | ||
28 | </view> | ||
29 | </uni-drawer> | ||
30 | |||
31 | |||
32 | |||
33 | <!-- 筛选菜单--> | ||
34 | <view class="content-wrap"> | ||
35 | <view> | ||
36 | <HMfilterDropdown :filterData="filterData" :defaultSelected ="filterDropdownValue" :updateMenuName="true" @confirm="confirm" dataFormat="Object"></HMfilterDropdown> | ||
37 | <!-- 占位 --> | ||
38 | <view class="place"></view> | ||
39 | <!-- 商品列表 --> | ||
40 | <view class="goods-list"> | ||
41 | <view class="product-list"> | ||
42 | <view class="product" v-for="(goods) in goodsList" :key="goods.goods_id" @tap="toGoods(goods)"> | ||
43 | <image mode="widthFix" :src="goods.img"></image> | ||
44 | <view class="name">{{goods.name}}</view> | ||
45 | <view class="info"> | ||
46 | <view class="price">{{goods.price}}</view> | ||
47 | <view class="slogan">{{goods.slogan}}</view> | ||
48 | </view> | ||
49 | </view> | ||
50 | </view> | ||
51 | <view class="loading-text">{{loadingText}}</view> | ||
52 | </view> | ||
53 | |||
54 | </view> | ||
55 | </view> | ||
56 | </view> | ||
57 | </template> | ||
58 | |||
59 | <script> | ||
60 | import uniDrawer from "@/components/uni-drawer/uni-drawer.vue"; | ||
61 | import HMfilterDropdown from "../../components/HM-filterDropdown/HM-filterDropdown.vue"; | ||
62 | import data from '@/common/data.js';//筛选菜单数据 | ||
63 | export default { | ||
64 | components: { | ||
65 | uniDrawer, | ||
66 | 'HMfilterDropdown':HMfilterDropdown | ||
67 | }, | ||
68 | data() { | ||
69 | return { | ||
70 | screenItems: [ | ||
71 | {current:0,text:'全部',hasIcon:false}, | ||
72 | {current:1,text:'销量',hasIcon:false}, | ||
73 | {current:2,text:'价格',hasIcon:true}, | ||
74 | {current:3,text:'折扣',hasIcon:false}, | ||
75 | {current:4,text:'筛选',hasIcon:true}, | ||
76 | ], | ||
77 | current: 0, | ||
78 | showRight: false, | ||
79 | indexArr:'', | ||
80 | valueArr:'', | ||
81 | //商品数据 | ||
82 | goodsList:[ | ||
83 | { goods_id: 0, img: '/static/img/goods/p1.jpg', name: '商品名称', price: '¥168', slogan:'1235人付款' }, | ||
84 | { goods_id: 1, img: '/static/img/goods/p2.jpg', name: '商品名称', price: '¥168', slogan:'1235人付款' }, | ||
85 | { goods_id: 2, img: '/static/img/goods/p3.jpg', name: '商品名称', price: '¥168', slogan:'1235人付款' }, | ||
86 | { goods_id: 3, img: '/static/img/goods/p4.jpg', name: '商品名称', price: '¥168', slogan:'1235人付款' }, | ||
87 | { goods_id: 4, img: '/static/img/goods/p5.jpg', name: '商品名称', price: '¥168', slogan:'1235人付款' }, | ||
88 | { goods_id: 5, img: '/static/img/goods/p6.jpg', name: '商品名称', price: '¥168', slogan:'1235人付款' }, | ||
89 | { goods_id: 6, img: '/static/img/goods/p7.jpg', name: '商品名称', price: '¥168', slogan:'1235人付款' }, | ||
90 | { goods_id: 7, img: '/static/img/goods/p8.jpg', name: '商品名称', price: '¥168', slogan:'1235人付款' }, | ||
91 | { goods_id: 8, img: '/static/img/goods/p9.jpg', name: '商品名称', price: '¥168', slogan:'1235人付款' }, | ||
92 | { goods_id: 9, img: '/static/img/goods/p10.jpg', name: '商品名称', price: '¥168', slogan:'1235人付款' } | ||
93 | ], | ||
94 | loadingText:"正在加载...", | ||
95 | filterDropdownValue:[], | ||
96 | filterData:[] | ||
97 | } | ||
98 | }, | ||
99 | filters: { | ||
100 | outData(value) { | ||
101 | return JSON.stringify(value); | ||
102 | } | ||
103 | }, | ||
104 | onLoad: function () { | ||
105 | //定时器模拟ajax异步请求数据 | ||
106 | setTimeout(()=>{ | ||
107 | //传入defaultSelected的结构不能错,错了就报错运行异常。 不选中的项目传入null | ||
108 | this.filterDropdownValue = [ | ||
109 | [1,1,0], //第0个菜单选中 一级菜单的第1项,二级菜单的第1项,三级菜单的第3项 | ||
110 | [null,null], //第1个菜单选中 都不选中 | ||
111 | [1], //第2个菜单选中 一级菜单的第1项 | ||
112 | [[0],[1,2,7],[1,0]], //筛选菜单选中 第一个筛选的第0项,第二个筛选的第1,2,7项,第三个筛选的第1,0项 | ||
113 | [[0],[1],[1]], //单选菜单选中 第一个筛选的第0项,第二个筛选的第1项,第三个筛选的第1项 | ||
114 | ]; | ||
115 | this.filterData = data; | ||
116 | },100); | ||
117 | //模拟ajax请求子菜单数据。 | ||
118 | // setTimeout(()=>{ | ||
119 | //this.filterData[1].submenu[0].submenu = [{"name": "附近","value": "附近"},{"name": "1km","value": "1km"},{"name": "2km","value": "2km"},{"name": "3km","value": "3km"},{"name": "4km","value": "4km"},{"name": "5km","value": "5km"}]; | ||
120 | // },5000) | ||
121 | }, | ||
122 | methods: { | ||
123 | showDrawer(e) { | ||
124 | this.$refs[e].open() | ||
125 | }, | ||
126 | closeDrawer(e) { | ||
127 | this.$refs[e].close() | ||
128 | }, | ||
129 | change(e, type) { | ||
130 | this[type] = e | ||
131 | }, | ||
132 | onClickItem(e) { | ||
133 | if (this.current !== e) { | ||
134 | this.current = e; | ||
135 | } | ||
136 | }, | ||
137 | dropDown(){ | ||
138 | console.log('下拉') | ||
139 | }, | ||
140 | //接收菜单结果 | ||
141 | confirm(e){ | ||
142 | this.indexArr = e.index; | ||
143 | this.valueArr = e.value; | ||
144 | return; | ||
145 | console.log('修改菜单'); | ||
146 | this.filterData[4].submenu[1] = { | ||
147 | "name": "项目2", | ||
148 | "submenu": [ | ||
149 | |||
150 | ] | ||
151 | } | ||
152 | } | ||
153 | }, | ||
154 | onNavigationBarButtonTap(e) { | ||
155 | this.showRight = !this.showRight | ||
156 | }, | ||
157 | //上拉加载, | ||
158 | onReachBottom(){ | ||
159 | console.log('到底加载') | ||
160 | let len = this.goodsList.length; | ||
161 | if(len>=30){ | ||
162 | this.loadingText="~~到底了~~"; | ||
163 | return false; | ||
164 | }else{ | ||
165 | this.loadingText="正在加载..."; | ||
166 | } | ||
167 | let end_goods_id = this.goodsList[len-1].goods_id; | ||
168 | for(let i=1;i<=10;i++){ | ||
169 | let goods_id = end_goods_id+i; | ||
170 | let p = { goods_id: goods_id, img: '/static/img/goods/p'+(goods_id%10==0?10:goods_id%10)+'.jpg', name: '商品名称', price: '¥168', slogan:'1235人付款' }; | ||
171 | this.goodsList.push(p); | ||
172 | } | ||
173 | }, | ||
174 | } | ||
175 | </script> | ||
176 | |||
177 | <style lang="scss"> | ||
178 | .content { | ||
179 | display: flex; | ||
180 | flex-direction: column; | ||
181 | align-items: center; | ||
182 | justify-content: center; | ||
183 | background-color: #F7F6F6; | ||
184 | } | ||
185 | .header{ | ||
186 | display: flex; | ||
187 | flex-direction: column; | ||
188 | align-items: center; | ||
189 | justify-content: center; | ||
190 | background-color: #F7F6F6; | ||
191 | height:178rpx ; | ||
192 | width: 100%; | ||
193 | z-index: 999; | ||
194 | position: fixed; | ||
195 | top: 0; | ||
196 | } | ||
197 | .searchBar { | ||
198 | width: 670rpx; | ||
199 | display: flex; | ||
200 | position: fixed; | ||
201 | top: 0; | ||
202 | justify-content: center; | ||
203 | align-items: center; | ||
204 | box-sizing: border-box; | ||
205 | padding: 0rpx 16rpx; | ||
206 | border: 1px solid #FF6B4A; | ||
207 | border-radius: 8rpx; | ||
208 | background-color: #ffffff; | ||
209 | } | ||
210 | |||
211 | .searchIpt { | ||
212 | height: 68rpx; | ||
213 | width: 670rpx; | ||
214 | padding: 16rpx; | ||
215 | font-size: 28rpx; | ||
216 | box-sizing: border-box; | ||
217 | } | ||
218 | .screenBar{ | ||
219 | position: fixed; | ||
220 | top: 68rpx; | ||
221 | width: 670rpx; | ||
222 | height: 110rpx; | ||
223 | display: flex; | ||
224 | flex-direction: row; | ||
225 | justify-content: space-between; | ||
226 | align-items: center; | ||
227 | color: #333333; | ||
228 | font-size: 32rpx; | ||
229 | } | ||
230 | .active{ | ||
231 | color: #FF6B4A; | ||
232 | } | ||
233 | .screenItem{ | ||
234 | display: flex; | ||
235 | justify-content: center; | ||
236 | align-items: center; | ||
237 | } | ||
238 | .content-wrap{ | ||
239 | width: 100%; | ||
240 | background-color: #FFFFFF; | ||
241 | } | ||
242 | |||
243 | .HMfilterDropdown{ | ||
244 | position: fixed; | ||
245 | top: 178rpx !important; | ||
246 | } | ||
247 | .place{ | ||
248 | background-color: #ffffff; | ||
249 | height: 266rpx; | ||
250 | } | ||
251 | .goods-list{ | ||
252 | padding-top: 10px; | ||
253 | .loading-text{ | ||
254 | width: 100%; | ||
255 | display: flex; | ||
256 | justify-content: center; | ||
257 | align-items: center; | ||
258 | height: 30px; | ||
259 | color: #979797; | ||
260 | font-size: 12px; | ||
261 | } | ||
262 | .product-list{ | ||
263 | width: 92%; | ||
264 | padding: 0 4% 3vw 4%; | ||
265 | display: flex; | ||
266 | justify-content: space-between; | ||
267 | flex-wrap: wrap; | ||
268 | .product{ | ||
269 | width: 48%; | ||
270 | border-radius: 10px; | ||
271 | background-color: #fff; | ||
272 | margin: 0 0 7px 0; | ||
273 | box-shadow: 0 3px 12px rgba(0,0,0,0.1); | ||
274 | image{ | ||
275 | width: 100%; | ||
276 | border-radius: 10px 10px 0 0; | ||
277 | } | ||
278 | .name{ | ||
279 | width: 92%; | ||
280 | padding: 5px 4%; | ||
281 | display: -webkit-box; | ||
282 | -webkit-box-orient: vertical; | ||
283 | -webkit-line-clamp: 2; | ||
284 | text-align: justify; | ||
285 | overflow: hidden; | ||
286 | font-size: 15px; | ||
287 | } | ||
288 | .info{ | ||
289 | display: flex; | ||
290 | justify-content: space-between; | ||
291 | align-items: flex-end; | ||
292 | width: 92%; | ||
293 | padding: 5px 4% 5px 4%; | ||
294 | .price{ | ||
295 | color: #e65339; | ||
296 | font-size: 15px; | ||
297 | font-weight: 600; | ||
298 | } | ||
299 | .slogan{ | ||
300 | color: #807c87; | ||
301 | font-size: 12px; | ||
302 | } | ||
303 | } | ||
304 | } | ||
305 | } | ||
306 | } | ||
307 | |||
308 | </style> | ||
309 | 1 | <template> |
pages/user/user.vue
1 | <template> | File was deleted | |
2 | <view class="content"> | ||
3 | <image class="logo" src="/static/logo.png"></image> | ||
4 | <view class="text-area"> | ||
5 | <text class="title">{{title}}</text> | ||
6 | </view> | ||
7 | </view> | ||
8 | </template> | ||
9 | |||
10 | <script> | ||
11 | export default { | ||
12 | data() { | ||
13 | return { | ||
14 | title: 'Hello' | ||
15 | } | ||
16 | }, | ||
17 | onLoad() { | ||
18 | |||
19 | }, | ||
20 | methods: { | ||
21 | |||
22 | } | ||
23 | } | ||
24 | </script> | ||
25 | |||
26 | <style> | ||
27 | .content { | ||
28 | display: flex; | ||
29 | flex-direction: column; | ||
30 | align-items: center; | ||
31 | justify-content: center; | ||
32 | } | ||
33 | |||
34 | .logo { | ||
35 | height: 200rpx; | ||
36 | width: 200rpx; | ||
37 | margin-top: 200rpx; | ||
38 | margin-left: auto; | ||
39 | margin-right: auto; | ||
40 | margin-bottom: 50rpx; | ||
41 | } | ||
42 | |||
43 | .text-area { | ||
44 | display: flex; | ||
45 | justify-content: center; | ||
46 | } | ||
47 | |||
48 | .title { | ||
49 | font-size: 36rpx; | ||
50 | color: #8f8f94; | ||
51 | } | ||
52 | </style> | ||
53 | 1 | <template> |
src/App.vue
File was created | 1 | <script> | |
2 | export default { | ||
3 | onLaunch: function() { | ||
4 | console.log('App Launch') | ||
5 | }, | ||
6 | onShow: function() { | ||
7 | console.log('App Show') | ||
8 | }, | ||
9 | onHide: function() { | ||
10 | console.log('App Hide') | ||
11 | } | ||
12 | } | ||
13 | </script> | ||
14 | |||
15 | <style> | ||
16 | /*每个页面公共css */ | ||
17 | </style> | ||
18 |
src/LICENSE
File was created | 1 | MIT License | |
2 | |||
3 | Copyright (c) 2018 DCloud | ||
4 | |||
5 | Permission is hereby granted, free of charge, to any person obtaining a copy | ||
6 | of this software and associated documentation files (the "Software"), to deal | ||
7 | in the Software without restriction, including without limitation the rights | ||
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
9 | copies of the Software, and to permit persons to whom the Software is | ||
10 | furnished to do so, subject to the following conditions: | ||
11 | |||
12 | The above copyright notice and this permission notice shall be included in all | ||
13 | copies or substantial portions of the Software. | ||
14 | |||
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
21 | SOFTWARE. | ||
22 |
src/README
File was created | 1 | thie is a new gulu project base on vue | |
2 |
src/README.md
File was created | 1 | # hello-uniapp | |
2 | |||
3 | `uni-app`框架示例,一套代码,同时发行到iOS、Android、H5、小程序等多个平台,请使用手机扫码快速体验`uni-app`的强大功能。 | ||
4 | |||
5 | <p align="center"> | ||
6 | <a href="https://m3w.cn/uniapp" target="blank"> | ||
7 | <img src="https://img-cdn-qiniu.dcloud.net.cn/uni-app-qr-all.jpg"/> | ||
8 | </a> | ||
9 | </p> | ||
10 | |||
11 | `uni-app`官网文档详见[https://uniapp.dcloud.io](https://uniapp.dcloud.io) | ||
12 | |||
13 | 更多uni-app的模板、示例详见[插件市场](https://ext.dcloud.net.cn/) | ||
14 | |||
15 |
src/common/data.js
File was created | 1 | // 数据格式,数据中只需要包含以下字段和数据格式,可以添加字段,比如id等等,不影响组件显示, | |
2 | // 组件的返回结果是有菜单数组下标形式返回, | ||
3 | // 如果传入数据中有value,也会返回value,开发者可根据返回的下标获取所选中的菜单 | ||
4 | /* | ||
5 | [ | ||
6 | { | ||
7 | "name":"", //字符串类型 选填项 菜单名称,如不填,则取第一个子菜单的name值,filter和radio类型则将设置为"筛选" | ||
8 | "type":"" //字符串类型 必填项 可取值 hierarchy/filter/radio hierarchy单/多层级菜单(最多三级); filter筛选多选菜单; radio筛选单选菜单 | ||
9 | "submenu":[ //对象数组类型 必填项 子菜单数据 | ||
10 | { | ||
11 | "name":"", //字符串类型 必填项 菜单名称 | ||
12 | "value":"", //字符串类型 选填项 自定义内容,比如id等等,如果填写了,confirm返回的结果中将返回对应选中的value,若菜单无value字段则返回null,filter类型此字段无效果 | ||
13 | "submenu":[ //对象数组类型 必填项 子菜单数据 | ||
14 | { | ||
15 | "name":"", //字符串类型 必填项 菜单名称 | ||
16 | "value":"", //字符串类型 选填项 自定义内容,比如id等等,如果填写了,confirm返回的结果中将返回对应选中的value,若菜单无value字段则返回null | ||
17 | "submenu":[ //对象数组类型 必填项 子菜单数据 filter类型无效 | ||
18 | { | ||
19 | "name":"", //字符串类型 必填项 菜单名称 hierarchy类型层级最多到此 | ||
20 | "value":"", //字符串类型 选填项 自定义内容,比如id等等,如果填写了,confirm返回的结果中将返回对应选中的value,若菜单无value字段则返回null | ||
21 | } | ||
22 | ] | ||
23 | } | ||
24 | ] | ||
25 | } | ||
26 | ] | ||
27 | } | ||
28 | ] | ||
29 | */ | ||
30 | |||
31 | //0.0.4版本起 返回结果将有两部分组成: | ||
32 | /* | ||
33 | { | ||
34 | index:[], //旧版本的下标数组形式 | ||
35 | value:[] //菜单中的valve,结构和下标结果数组一样,只是把下标替换成了value而已 | ||
36 | } | ||
37 | */ | ||
38 | // 以下演示数据中,我故意把value设置成跟name一样,只是为了方便演示,使示例更加易懂,实际使用时候value应该是一个标识,给后台识别所用的. | ||
39 | // 数据较长,请仔细查看。 | ||
40 | export default [ | ||
41 | { | ||
42 | "name":'综合', | ||
43 | "type": 'filter', | ||
44 | "submenu": [{ | ||
45 | "submenu": [ | ||
46 | |||
47 | ] | ||
48 | }, | ||
49 | ], | ||
50 | }, | ||
51 | { | ||
52 | name:'品牌', | ||
53 | "type": 'filter', | ||
54 | "submenu": [{ | ||
55 | "name": '品牌', | ||
56 | "value": "品牌", | ||
57 | "submenu": [{ | ||
58 | "name": "帕森", | ||
59 | "value": "帕森", | ||
60 | }, | ||
61 | { | ||
62 | "name": "海伦凯勒", | ||
63 | "value": "海伦凯勒", | ||
64 | }, | ||
65 | ] | ||
66 | }, | ||
67 | ] | ||
68 | }, | ||
69 | { | ||
70 | "name":'功能', | ||
71 | "type": 'filter', | ||
72 | "submenu": [{ | ||
73 | "name": "智能排序", | ||
74 | "value": "智能排序" | ||
75 | }, | ||
76 | { | ||
77 | "name": "离我最近", | ||
78 | "value": "离我最近" | ||
79 | }, | ||
80 | { | ||
81 | "name": "人均从高到低", | ||
82 | "value": "人均从高到低" | ||
83 | }, | ||
84 | { | ||
85 | "name": "人均从低到高", | ||
86 | "value": "人均从低到高" | ||
87 | } | ||
88 | ] | ||
89 | }, | ||
90 | { | ||
91 | "name":'材质', | ||
92 | "type": 'filter', | ||
93 | "submenu": [{ | ||
94 | "submenu": [{ | ||
95 | "name": "满减活动", | ||
96 | "value": "满减活动" | ||
97 | }, | ||
98 | { | ||
99 | "name": "打折优惠", | ||
100 | "value": "打折优惠" | ||
101 | }, | ||
102 | { | ||
103 | "name": "会员专享", | ||
104 | "value": "会员专享" | ||
105 | } | ||
106 | ] | ||
107 | } | ||
108 | ] | ||
109 | }, | ||
110 | { | ||
111 | "name":'折扣', | ||
112 | "type": 'filter', | ||
113 | "submenu": [{ | ||
114 | "name": "折扣(多选)", | ||
115 | "submenu": [{ | ||
116 | "name": "满减活动", | ||
117 | "value": "满减活动" | ||
118 | }, | ||
119 | { | ||
120 | "name": "打折优惠", | ||
121 | "value": "打折优惠" | ||
122 | }, | ||
123 | { | ||
124 | "name": "会员专享", | ||
125 | "value": "会员专享" | ||
126 | } | ||
127 | ] | ||
128 | } | ||
129 | ] | ||
130 | } | ||
131 | ] | ||
132 | |||
133 |
src/components/HM-filterDropdown/HM-filterDropdown.vue
File was created | 1 | <template> | |
2 | <view class="HMfilterDropdown" @touchmove.stop.prevent="discard" @tap.stop="discard"> | ||
3 | <view class="nav"> | ||
4 | <block v-for="(item,index) in menu" :key="index"> | ||
5 | <view class="first-menu" :class="{'on':showPage==index}" @tap="togglePage(index)"> | ||
6 | <text class="name">{{item.name}}</text> | ||
7 | <text class="iconfont triangle" :style="'transform:rotate('+triangleDeg[index]+'deg);'"></text> | ||
8 | </view> | ||
9 | </block> | ||
10 | </view> | ||
11 | <view class="mask" :class="{'show':isShowMask,'hide':maskVisibility!=true}" @tap="togglePage(showPage)"></view> | ||
12 | <block v-for="(page,page_index) in subData" :key="page_index"> | ||
13 | <view class="sub-menu-class" :class="{'show':showPage==page_index,'hide':pageState[page_index]!=true}"> | ||
14 | <block v-if="page.type=='hierarchy'&& page.submenu.length>0"> | ||
15 | <scroll-view class="sub-menu-list" :class="[activeMenuArr[page_index].length>1?'first':'alone']" | ||
16 | :scroll-y="true" :scroll-into-view="'first_id'+firstScrollInto"> | ||
17 | <block v-for="(sub,index) in page.submenu" :key="index"> | ||
18 | <view class="sub-menu" :id="'first_id'+index" :class="{'on':activeMenuArr[page_index][0]==index}" @tap="selectHierarchyMenu(page_index,index,null,null)"> | ||
19 | <view class="menu-name"> | ||
20 | <text>{{sub.name}}</text> | ||
21 | <text class="iconfont selected"></text> | ||
22 | </view> | ||
23 | </view> | ||
24 | </block> | ||
25 | </scroll-view> | ||
26 | <block v-for="(sub,index) in page.submenu" :key="index"> | ||
27 | <scroll-view class="sub-menu-list not-first" :scroll-y="true" v-if="activeMenuArr[page_index][0]==index&&sub.submenu.length>0" | ||
28 | :scroll-into-view="'second_id'+secondScrollInto"> | ||
29 | <block v-for="(sub_second,second_index) in sub.submenu" :key="second_index"> | ||
30 | <view class="sub-menu" :id="'second_id'+second_index" :class="{'on':activeMenuArr[page_index][1]==second_index}"> | ||
31 | <view class="menu-name" @tap="selectHierarchyMenu(page_index,activeMenuArr[page_index][0],second_index,null)"> | ||
32 | <text>{{sub_second.name}}</text> | ||
33 | <text class="iconfont selected"></text> | ||
34 | </view> | ||
35 | <view class="more-sub-menu" v-if="sub_second.submenu&&sub.submenu.length>0&&sub_second.submenu.length>0"> | ||
36 | <block v-for="(sub2,sub2_index) in sub_second.submenu" :key="sub2_index"> | ||
37 | <text v-if="sub_second.showAllSub || (sub2_index<8)" :class="{'on':activeMenuArr[page_index][1]==second_index&&activeMenuArr[page_index][2]==sub2_index}" | ||
38 | @tap="selectHierarchyMenu(page_index,activeMenuArr[page_index][0],second_index,sub2_index)">{{sub2.name}}</text> | ||
39 | <text v-if="sub_second.showAllSub!=true && sub2_index==8 && sub_second.submenu.length>9" @tap="showMoreSub(second_index)">更多<text | ||
40 | class="iconfont triangle"></text></text> | ||
41 | </block> | ||
42 | </view> | ||
43 | </view> | ||
44 | </block> | ||
45 | </scroll-view> | ||
46 | </block> | ||
47 | </block> | ||
48 | <block v-if="page.type=='filter'"> | ||
49 | <view class="filter"> | ||
50 | <scroll-view class="menu-box" :scroll-y="true"> | ||
51 | <view class="box" v-for="(box,box_index) in page.submenu" :key="box_index"> | ||
52 | <view class="title">{{box.name}}</view> | ||
53 | <view class="labels"> | ||
54 | <view v-for="(label,label_index) in box.submenu" :key="label_index" @tap="selectFilterLabel(page_index,box_index,label_index)" | ||
55 | :class="{'on':label.selected}">{{label.name}}</view> | ||
56 | </view> | ||
57 | </view> | ||
58 | </scroll-view> | ||
59 | <view class="btn-box"> | ||
60 | <view class="reset" @tap="resetFilterData(page_index)">重置</view> | ||
61 | <view class="submit" @tap="setFilterData(page_index)">确定</view> | ||
62 | </view> | ||
63 | </view> | ||
64 | </block> | ||
65 | <block v-if="page.type=='radio'"> | ||
66 | <view class="filter"> | ||
67 | <scroll-view class="menu-box" :scroll-y="true"> | ||
68 | <view class="box" v-for="(box,box_index) in page.submenu" :key="box_index"> | ||
69 | <view class="title">{{box.name}}</view> | ||
70 | <view class="labels"> | ||
71 | <view v-for="(label,label_index) in box.submenu" :key="label_index" @tap="selectRadioLabel(page_index,box_index,label_index)" | ||
72 | :class="{'on':label.selected}">{{label.name}}</view> | ||
73 | </view> | ||
74 | </view> | ||
75 | </scroll-view> | ||
76 | <view class="btn-box"> | ||
77 | <view class="reset" @tap="resetFilterData(page_index)">重置</view> | ||
78 | <view class="submit" @tap="setFilterData(page_index)">确定</view> | ||
79 | </view> | ||
80 | </view> | ||
81 | </block> | ||
82 | </view> | ||
83 | </block> | ||
84 | </view> | ||
85 | </template> | ||
86 | <script> | ||
87 | export default { | ||
88 | data() { | ||
89 | return { | ||
90 | subData: [], //菜单数据 | ||
91 | menu: [], //顶部横条数据 | ||
92 | showPage: -1, //菜单页面显示/隐藏动画控制 | ||
93 | pageState: [], //页面的状态 | ||
94 | activeMenuArr: [], //UI状态 | ||
95 | shadowActiveMenuArr: [], //记录选中 | ||
96 | defaultActive:[], | ||
97 | triangleDeg: [], //小三角形的翻转动画控制 | ||
98 | isShowMask: false, //遮罩层显示/隐藏动画控制 | ||
99 | maskVisibility: false, //遮罩层显示/隐藏状态 | ||
100 | //滚动区域定位 | ||
101 | firstScrollInto: 0, | ||
102 | secondScrollInto: 0, | ||
103 | componentTop:0 ,//组件top | ||
104 | isReadNewSelect:false | ||
105 | } | ||
106 | }, | ||
107 | props: { | ||
108 | filterData: { | ||
109 | value: Array, | ||
110 | default: [] | ||
111 | }, | ||
112 | defaultSelected:{ | ||
113 | value: Array, | ||
114 | default: [] | ||
115 | }, | ||
116 | updateMenuName:{ | ||
117 | value: Boolean, | ||
118 | default: true | ||
119 | }, | ||
120 | dataFormat:{ | ||
121 | value: String, | ||
122 | default: 'Array' | ||
123 | } | ||
124 | }, | ||
125 | watch: { | ||
126 | filterData: { | ||
127 | handler() { | ||
128 | this.initMenu(); //filterData重新赋值初始化菜单 | ||
129 | }, | ||
130 | immediate: true | ||
131 | }, | ||
132 | defaultSelected(newVal) { | ||
133 | if(newVal.length==0){ | ||
134 | return; | ||
135 | } | ||
136 | this.defaultActive = JSON.parse(JSON.stringify(newVal)); | ||
137 | this.activeMenuArr = JSON.parse(JSON.stringify(newVal)); | ||
138 | this.shadowActiveMenuArr = JSON.parse(JSON.stringify(newVal)); | ||
139 | if(this.updateMenuName){ | ||
140 | this.setMenuName(); | ||
141 | } | ||
142 | } | ||
143 | }, | ||
144 | methods: { | ||
145 | initMenu() { | ||
146 | let tmpMenuActiveArr=[]; | ||
147 | let tmpMenu=[]; | ||
148 | for (let i = 0; i < this.filterData.length; i++) { | ||
149 | let tmpitem = this.filterData[i]; | ||
150 | tmpMenu.push({ | ||
151 | //如果没有设置name,则取第一个菜单作为menu.name,filter类型则将"筛选"作为menu.name | ||
152 | name: tmpitem.name || (tmpitem.type == "filter" ? "筛选" : tmpitem.submenu[0].name), | ||
153 | type: tmpitem.type | ||
154 | }); | ||
155 | //初始化选中项数组-ui状态 | ||
156 | tmpMenuActiveArr.push(this.processActive(tmpitem)); | ||
157 | //初始化角度数组 | ||
158 | this.triangleDeg.push(0); | ||
159 | //初始化控制显示状态数组 | ||
160 | this.pageState.push(false); | ||
161 | //递归处理子菜单数据 | ||
162 | tmpitem = this.processSubMenu(tmpitem); | ||
163 | this.filterData[i] = tmpitem; | ||
164 | } | ||
165 | this.menu = tmpMenu; | ||
166 | //初始化选中项数组 | ||
167 | tmpMenuActiveArr = this.defaultActive.length>0?this.defaultActive:this.activeMenuArr.length>0?this.activeMenuArr:tmpMenuActiveArr; | ||
168 | this.defaultActive = []; | ||
169 | this.activeMenuArr = JSON.parse(JSON.stringify(tmpMenuActiveArr)); | ||
170 | this.shadowActiveMenuArr = JSON.parse(JSON.stringify(tmpMenuActiveArr)); | ||
171 | //加载菜单数据 | ||
172 | this.subData = this.filterData; | ||
173 | //设定顶部菜单名字 | ||
174 | if(this.updateMenuName){ | ||
175 | this.setMenuName(); | ||
176 | } | ||
177 | }, | ||
178 | setMenuName(){ | ||
179 | for(var i=0;i<this.activeMenuArr.length;i++){ | ||
180 | let row = this.activeMenuArr[i]; | ||
181 | if (typeof(row[0]) != 'object'){ | ||
182 | var tmpsub = false; | ||
183 | if(row.length>0 && row[0]!=null){ | ||
184 | tmpsub = this.subData[i].submenu[row[0]]; | ||
185 | if(row.length>1 && row[1]!=null){ | ||
186 | tmpsub = tmpsub.submenu[row[1]]; | ||
187 | if(row.length>2 && row[2]!=null){ | ||
188 | tmpsub = tmpsub.submenu[row[2]]; | ||
189 | } | ||
190 | } | ||
191 | }else{ | ||
192 | tmpsub = false; | ||
193 | } | ||
194 | if(tmpsub){ | ||
195 | this.menu[i].name = tmpsub.name; | ||
196 | } | ||
197 | } | ||
198 | } | ||
199 | }, | ||
200 | //展开更多 | ||
201 | showMoreSub(index) { | ||
202 | this.subData[this.showPage].submenu[this.activeMenuArr[this.showPage][0]].submenu[index].showAllSub = true; | ||
203 | this.$forceUpdate(); | ||
204 | }, | ||
205 | //选中 | ||
206 | selectHierarchyMenu(page_index, level1_index, level2_index, level3_index) { | ||
207 | //读取记录 | ||
208 | if (level1_index != null && level2_index == null && level3_index == null && this.shadowActiveMenuArr[page_index][0] == | ||
209 | level1_index) { | ||
210 | this.activeMenuArr.splice(page_index, 1, JSON.parse(JSON.stringify(this.shadowActiveMenuArr[page_index]))); | ||
211 | } else { | ||
212 | this.activeMenuArr[page_index].splice(0, 1, level1_index); | ||
213 | (level2_index!=null||this.activeMenuArr[page_index].length>=2)&&this.activeMenuArr[page_index].splice(1, 1, level2_index) || this.activeMenuArr[page_index].splice(1, 1); | ||
214 | (level3_index!=null||this.activeMenuArr[page_index].length>=3)&&this.activeMenuArr[page_index].splice(2, 1, level3_index) || this.activeMenuArr[page_index].splice(2, 1); | ||
215 | } | ||
216 | //写入结果 | ||
217 | if (level3_index != null || level2_index != null || (level1_index != null && this.subData[page_index].submenu[level1_index].submenu.length == 0) | ||
218 | ) { | ||
219 | let sub = this.subData[page_index].submenu[level1_index].submenu[level2_index]; | ||
220 | if(this.updateMenuName){ | ||
221 | this.menu[page_index].name = (level3_index != null && sub.submenu[level3_index].name) || (level2_index != null && sub.name) || this.subData[page_index].submenu[level1_index].name; | ||
222 | } | ||
223 | this.shadowActiveMenuArr[page_index] = JSON.parse(JSON.stringify(this.activeMenuArr[page_index])); | ||
224 | this.togglePage(this.showPage); | ||
225 | } | ||
226 | }, | ||
227 | //写入结果,筛选 | ||
228 | setFilterData(page_index) { | ||
229 | this.shadowActiveMenuArr[page_index] = JSON.parse(JSON.stringify(this.activeMenuArr[page_index])); | ||
230 | this.togglePage(this.showPage); | ||
231 | }, | ||
232 | //重置结果和ui,筛选 | ||
233 | resetFilterData(page_index) { | ||
234 | let tmpArr = []; | ||
235 | let level = this.shadowActiveMenuArr[page_index].length; | ||
236 | while (level > 0) { | ||
237 | tmpArr.push([]); | ||
238 | let box = this.subData[page_index].submenu[level - 1].submenu; | ||
239 | for (let i = 0; i < box.length; i++) { | ||
240 | this.subData[page_index].submenu[level - 1].submenu[i].selected = false; | ||
241 | } | ||
242 | level--; | ||
243 | } | ||
244 | this.activeMenuArr[page_index] = JSON.parse(JSON.stringify(tmpArr)); | ||
245 | this.$forceUpdate(); | ||
246 | }, | ||
247 | //选中筛选类label-UI状态 | ||
248 | selectFilterLabel(page_index, box_index, label_index) { | ||
249 | let find_index = this.activeMenuArr[page_index][box_index].indexOf(label_index); | ||
250 | if (find_index > -1) { | ||
251 | this.activeMenuArr[page_index][box_index].splice(find_index, 1); | ||
252 | this.subData[page_index].submenu[box_index].submenu[label_index].selected = false; | ||
253 | } else { | ||
254 | this.activeMenuArr[page_index][box_index].push(label_index); | ||
255 | this.subData[page_index].submenu[box_index].submenu[label_index].selected = true; | ||
256 | } | ||
257 | this.$forceUpdate(); | ||
258 | }, | ||
259 | //选中单选类label-UI状态 | ||
260 | selectRadioLabel(page_index, box_index, label_index) { | ||
261 | |||
262 | let activeIndex = this.activeMenuArr[page_index][box_index][0]; | ||
263 | if(activeIndex == label_index){ | ||
264 | this.subData[page_index].submenu[box_index].submenu[activeIndex].selected = false; | ||
265 | this.activeMenuArr[page_index][box_index][0] = null; | ||
266 | }else{ | ||
267 | if(activeIndex!=null && activeIndex<this.subData[page_index].submenu[box_index].submenu.length){ | ||
268 | this.subData[page_index].submenu[box_index].submenu[activeIndex].selected = false; | ||
269 | } | ||
270 | |||
271 | this.subData[page_index].submenu[box_index].submenu[label_index].selected = true; | ||
272 | this.activeMenuArr[page_index][box_index][0] = label_index; | ||
273 | } | ||
274 | this.$forceUpdate(); | ||
275 | }, | ||
276 | //菜单开关 | ||
277 | togglePage(index) { | ||
278 | if (index == this.showPage) { | ||
279 | this.hidePageLayer(true); | ||
280 | this.hideMask(); | ||
281 | this.showPage = -1; | ||
282 | } else { | ||
283 | if (this.showPage > -1) { | ||
284 | this.hidePageLayer(false); | ||
285 | } | ||
286 | this.showPageLayer(index); | ||
287 | this.showMask(); | ||
288 | } | ||
289 | }, | ||
290 | //hide遮罩层 | ||
291 | hideMask() { | ||
292 | this.isShowMask = false; | ||
293 | setTimeout(() => { | ||
294 | this.maskVisibility = false; | ||
295 | }, 200); | ||
296 | }, | ||
297 | //show遮罩层 | ||
298 | showMask() { | ||
299 | this.maskVisibility = true; | ||
300 | this.$nextTick(() => { | ||
301 | setTimeout(() => { | ||
302 | this.isShowMask = true; | ||
303 | }, 0); | ||
304 | }) | ||
305 | }, | ||
306 | //hide菜单页 | ||
307 | hidePageLayer(isAnimation) { | ||
308 | this.triangleDeg[this.showPage] = 0; | ||
309 | let tmpIndex = this.showPage; | ||
310 | if (isAnimation) { | ||
311 | setTimeout(() => { | ||
312 | this.pageState.splice(tmpIndex, 1, false); | ||
313 | }, 200); | ||
314 | this.confirm(); | ||
315 | } else { | ||
316 | this.pageState.splice(tmpIndex, 1, false) | ||
317 | } | ||
318 | this.firstScrollInto = null; | ||
319 | this.secondScrollInto = null; | ||
320 | }, | ||
321 | confirm() { | ||
322 | let index = JSON.parse(JSON.stringify(this.shadowActiveMenuArr)); | ||
323 | let value = JSON.parse(JSON.stringify(this.shadowActiveMenuArr)); | ||
324 | |||
325 | //对结果做一下处理 | ||
326 | index.forEach((item, i) => { | ||
327 | if (typeof(item[0]) == 'object') { | ||
328 | //针对筛选结果过一个排序 | ||
329 | item.forEach((s, j) => { | ||
330 | if(s!=null){ | ||
331 | s.sort((val1, val2) => { | ||
332 | return val1 - val2; | ||
333 | }); | ||
334 | item[j] = s; | ||
335 | s.forEach((v, k) => { | ||
336 | value[i][j][k] = (v==null||v>=this.subData[i].submenu[j].submenu.length)?null:this.subData[i].submenu[j].submenu[v].value; | ||
337 | if(this.subData[i].type == 'radio' && value[i][j][k] == null){ | ||
338 | value[i][j] = []; | ||
339 | index[i][j] = []; | ||
340 | } | ||
341 | }); | ||
342 | } | ||
343 | }); | ||
344 | }else{ | ||
345 | let submenu = this.subData[i].submenu[item[0]]; | ||
346 | value[i][0] = submenu.value; | ||
347 | if(value[i].length>=2 && item[1]!=null){ | ||
348 | if(submenu.submenu.length>0){ | ||
349 | submenu = submenu.submenu[item[1]]; | ||
350 | value[i][1] = submenu.hasOwnProperty('value')?submenu.value:null; | ||
351 | }else{ | ||
352 | value[i][1] = null | ||
353 | } | ||
354 | if(value[i].length>=3 && item[2]!=null){ | ||
355 | if(submenu.submenu.length>0){ | ||
356 | submenu = submenu.submenu[item[2]]; | ||
357 | value[i][2] = submenu.hasOwnProperty('value')?submenu.value:null; | ||
358 | }else{ | ||
359 | value[i][2] = null; | ||
360 | } | ||
361 | } | ||
362 | } | ||
363 | } | ||
364 | index[i] = item; | ||
365 | |||
366 | }); | ||
367 | // 输出 | ||
368 | this.$emit('confirm', { | ||
369 | index: index, | ||
370 | value: value | ||
371 | }); | ||
372 | }, | ||
373 | //show菜单页 | ||
374 | showPageLayer(index) { | ||
375 | this.processPage(index); | ||
376 | this.pageState.splice(index, 1, true); | ||
377 | this.$nextTick(() => { | ||
378 | setTimeout(() => { | ||
379 | this.showPage = index; | ||
380 | }, 0); | ||
381 | }) | ||
382 | this.triangleDeg[index] = 180; | ||
383 | }, | ||
384 | reloadActiveMenuArr(){ | ||
385 | for (let i = 0; i < this.filterData.length; i++) { | ||
386 | let tmpitem = this.filterData[i]; | ||
387 | let tmpArr = this.processActive(tmpitem); | ||
388 | tmpitem = this.processSubMenu(tmpitem); | ||
389 | if(this.activeMenuArr[i].length!=tmpArr.length){ | ||
390 | this.filterData[i] = tmpitem; | ||
391 | this.activeMenuArr.splice(i, 1, JSON.parse(JSON.stringify(tmpArr))); | ||
392 | this.shadowActiveMenuArr.splice(i, 1, JSON.parse(JSON.stringify(tmpArr))); | ||
393 | } | ||
394 | } | ||
395 | this.subData = this.filterData; | ||
396 | this.$forceUpdate(); | ||
397 | }, | ||
398 | processPage(index) { | ||
399 | //check UI控制数组,结果数组,防止传入数据层级和UI控制数组不同步 | ||
400 | this.reloadActiveMenuArr(); | ||
401 | //重置UI控制数组 | ||
402 | this.activeMenuArr.splice(index, 1, JSON.parse(JSON.stringify(this.shadowActiveMenuArr[index]))); | ||
403 | if (this.menu[index].type == 'filter') { | ||
404 | //重载筛选页选中状态 | ||
405 | let level = this.shadowActiveMenuArr[index].length; | ||
406 | for (let i = 0; i < level; i++) { | ||
407 | let box = this.subData[index].submenu[i].submenu; | ||
408 | for (let j = 0; j < box.length; j++) { | ||
409 | if (this.shadowActiveMenuArr[index][i].indexOf(j) > -1) { | ||
410 | this.subData[index].submenu[i].submenu[j].selected = true; | ||
411 | } else { | ||
412 | this.subData[index].submenu[i].submenu[j].selected = false; | ||
413 | } | ||
414 | } | ||
415 | } | ||
416 | } else if (this.menu[index].type == 'hierarchy') { | ||
417 | this.$nextTick(() => { | ||
418 | setTimeout(() => { | ||
419 | //滚动到选中项 | ||
420 | this.firstScrollInto = parseInt(this.activeMenuArr[index][0]); | ||
421 | this.secondScrollInto = parseInt(this.activeMenuArr[index][1]); | ||
422 | }, 0); | ||
423 | }) | ||
424 | } else if (this.menu[index].type == 'radio') { | ||
425 | //重载筛选页选中状态 | ||
426 | let level = this.shadowActiveMenuArr[index].length; | ||
427 | for (let i = 0; i < level; i++) { | ||
428 | let box = this.subData[index].submenu[i].submenu; | ||
429 | for (let j = 0; j < box.length; j++) { | ||
430 | if (this.shadowActiveMenuArr[index][i].indexOf(j) > -1) { | ||
431 | this.subData[index].submenu[i].submenu[j].selected = true; | ||
432 | } else { | ||
433 | this.subData[index].submenu[i].submenu[j].selected = false; | ||
434 | } | ||
435 | } | ||
436 | } | ||
437 | } | ||
438 | }, | ||
439 | processActive(tmpitem) { | ||
440 | let tmpArr = [] | ||
441 | if (tmpitem.type == 'hierarchy'&&tmpitem.hasOwnProperty('submenu')&&tmpitem.submenu.length>0) { | ||
442 | let level = this.getMaxFloor(tmpitem.submenu); | ||
443 | while (level > 0) { | ||
444 | tmpArr.push(0); | ||
445 | level--; | ||
446 | } | ||
447 | } else if (tmpitem.type == 'filter') { | ||
448 | let level = tmpitem.submenu.length; | ||
449 | while (level > 0) { | ||
450 | tmpArr.push([]); | ||
451 | level--; | ||
452 | } | ||
453 | } else if (tmpitem.type == 'radio') { | ||
454 | let level = tmpitem.submenu.length; | ||
455 | while (level > 0) { | ||
456 | tmpArr.push([]); | ||
457 | level--; | ||
458 | } | ||
459 | } | ||
460 | return tmpArr; | ||
461 | }, | ||
462 | processSubMenu(menu) { | ||
463 | if (menu.hasOwnProperty('submenu') && menu.submenu.length > 0) { | ||
464 | for (let i = 0; i < menu.submenu.length; i++) { | ||
465 | menu.submenu[i] = this.processSubMenu(menu.submenu[i]); | ||
466 | } | ||
467 | } else { | ||
468 | menu.submenu = []; | ||
469 | } | ||
470 | return menu; | ||
471 | }, | ||
472 | //计算菜单层级 | ||
473 | getMaxFloor(treeData) { | ||
474 | let floor = 0 | ||
475 | let max = 0 | ||
476 | function each(data, floor) { | ||
477 | data.forEach(e => { | ||
478 | max = floor > max ? floor : max; | ||
479 | if (e.hasOwnProperty('submenu') && e.submenu.length > 0) { | ||
480 | each(e.submenu, floor + 1) | ||
481 | } | ||
482 | }) | ||
483 | } | ||
484 | each(treeData, 1) | ||
485 | return max; | ||
486 | }, | ||
487 | discard() { | ||
488 | |||
489 | } | ||
490 | } | ||
491 | } | ||
492 | </script> | ||
493 | <style lang="scss"> | ||
494 | .HMfilterDropdown { | ||
495 | flex-shrink: 0; | ||
496 | width: 100%; | ||
497 | height: 44px; | ||
498 | position: fixed; | ||
499 | z-index: 997; | ||
500 | flex-wrap: nowrap; | ||
501 | display: flex; | ||
502 | flex-direction: row; | ||
503 | top: var(--window-top); | ||
504 | left:0; | ||
505 | view { | ||
506 | display: flex; | ||
507 | flex-wrap: nowrap; | ||
508 | } | ||
509 | } | ||
510 | .region { | ||
511 | flex: 1; | ||
512 | height: 44px; | ||
513 | } | ||
514 | .nav { | ||
515 | width: 100%; | ||
516 | height: 44px; | ||
517 | border-bottom: solid 1rpx #eee; | ||
518 | z-index: 12; | ||
519 | background-color: #ffffff; | ||
520 | flex-direction: row; | ||
521 | .first-menu { | ||
522 | width: 100%; | ||
523 | font-size: 13px; | ||
524 | color: #757575; | ||
525 | flex-direction: row; | ||
526 | align-items: center; | ||
527 | justify-content: center; | ||
528 | transition: color .2s linear; | ||
529 | |||
530 | &.on { | ||
531 | color: #ec652b; | ||
532 | |||
533 | .iconfont { | ||
534 | color: #ec652b; | ||
535 | } | ||
536 | } | ||
537 | .name { | ||
538 | height: 20px; | ||
539 | text-align: center; | ||
540 | text-overflow: clip; | ||
541 | overflow: hidden; | ||
542 | } | ||
543 | .iconfont { | ||
544 | width: 13px; | ||
545 | height: 13px; | ||
546 | align-items: center; | ||
547 | justify-content: center; | ||
548 | transition: transform .2s linear, color .2s linear; | ||
549 | } | ||
550 | } | ||
551 | } | ||
552 | .sub-menu-class { | ||
553 | width: 100%; | ||
554 | position: absolute; | ||
555 | left: 0; | ||
556 | transform: translate3d(0, - 100%, 0); | ||
557 | max-height: 345px; | ||
558 | background-color: #ffffff; | ||
559 | z-index: 11; | ||
560 | box-shadow: 0 5px 5px rgba(0, 0, 0, .1); | ||
561 | overflow: hidden; | ||
562 | flex-direction: row; | ||
563 | transition: transform .15s linear; | ||
564 | &.hide { | ||
565 | display: none; | ||
566 | } | ||
567 | |||
568 | &.show { | ||
569 | transform: translate3d(0, calc(44px + 1rpx), 0); | ||
570 | } | ||
571 | } | ||
572 | .sub-menu-list { | ||
573 | width: 100%; | ||
574 | height: 345px; | ||
575 | flex-direction: column; | ||
576 | .sub-menu { | ||
577 | min-height: 44px; | ||
578 | font-size: 13px; | ||
579 | flex-direction: column; | ||
580 | padding-right: 15px; | ||
581 | >.menu-name { | ||
582 | height: 44px; | ||
583 | flex-direction: row; | ||
584 | align-items: center; | ||
585 | justify-content: space-between; | ||
586 | >.iconfont { | ||
587 | display: none; | ||
588 | font-size: 18px; | ||
589 | color: #ec652b; | ||
590 | } | ||
591 | } | ||
592 | } | ||
593 | &.first { | ||
594 | flex-shrink: 0; | ||
595 | width: 236rpx; | ||
596 | background-color: #f0f0f0; | ||
597 | .sub-menu { | ||
598 | padding-left: 15px; | ||
599 | |||
600 | &.on { | ||
601 | background-color: #fff; | ||
602 | } | ||
603 | } | ||
604 | } | ||
605 | &.alone { | ||
606 | max-height: 345px; | ||
607 | min-height: 170px; | ||
608 | height: auto; | ||
609 | .sub-menu { | ||
610 | min-height: calc(44px - 1rpx); | ||
611 | margin-left: 15px; | ||
612 | border-bottom: solid 1rpx #e5e5e5; | ||
613 | |||
614 | &.on { | ||
615 | color: #ec652b; | ||
616 | |||
617 | >.menu-name { | ||
618 | >.iconfont { | ||
619 | display: block; | ||
620 | } | ||
621 | } | ||
622 | } | ||
623 | } | ||
624 | } | ||
625 | &.not-first { | ||
626 | .sub-menu { | ||
627 | min-height: calc(44px - 1rpx); | ||
628 | margin-left: 15px; | ||
629 | border-bottom: solid 1rpx #e5e5e5; | ||
630 | >.menu-name { | ||
631 | height: calc(44px - 1rpx); | ||
632 | >.iconfont { | ||
633 | display: none; | ||
634 | font-size: 18px; | ||
635 | color: #ec652b; | ||
636 | } | ||
637 | } | ||
638 | &.on { | ||
639 | color: #ec652b; | ||
640 | >.menu-name { | ||
641 | >.iconfont { | ||
642 | display: block; | ||
643 | } | ||
644 | } | ||
645 | } | ||
646 | .more-sub-menu { | ||
647 | flex-direction: row; | ||
648 | flex-wrap: wrap; | ||
649 | padding-bottom: 9px; | ||
650 | >text { | ||
651 | height: 30px; | ||
652 | border-radius: 3px; | ||
653 | background-color: #f5f5f5; | ||
654 | color: #9b9b9b; | ||
655 | margin-bottom: 6px; | ||
656 | margin-right: 6px; | ||
657 | text-align: center; | ||
658 | line-height: 30px; | ||
659 | border: solid #f5f5f5 1rpx; | ||
660 | flex: 0 0 calc(33.33% - 6px); | ||
661 | overflow: hidden; | ||
662 | font-size: 12px; | ||
663 | &:nth-child(3n) { | ||
664 | margin-right: 0; | ||
665 | } | ||
666 | &.on { | ||
667 | border-color: #f6c8ac; | ||
668 | color: #ec652b; | ||
669 | } | ||
670 | .iconfont { | ||
671 | color: #9b9b9b; | ||
672 | } | ||
673 | } | ||
674 | } | ||
675 | } | ||
676 | } | ||
677 | } | ||
678 | .filter { | ||
679 | width: 100%; | ||
680 | height: 345px; | ||
681 | display: flex; | ||
682 | flex-direction: column; | ||
683 | justify-content: space-between; | ||
684 | align-items: center; | ||
685 | .menu-box { | ||
686 | width: 698rpx; | ||
687 | height: calc(345px - 75px); | ||
688 | flex-shrink: 1; | ||
689 | .box { | ||
690 | width: 100%; | ||
691 | margin-top: 16px; | ||
692 | flex-direction: column; | ||
693 | .title { | ||
694 | width: 100%; | ||
695 | font-size: 13px; | ||
696 | color: #888; | ||
697 | } | ||
698 | .labels { | ||
699 | flex-direction: row; | ||
700 | flex-wrap: wrap; | ||
701 | .on { | ||
702 | border-color: #ec652b; | ||
703 | background-color: #ec652b; | ||
704 | color: #fff; | ||
705 | } | ||
706 | >view { | ||
707 | width: 148rpx; | ||
708 | height: 30px; | ||
709 | border: solid 1rpx #adadad; | ||
710 | border-radius: 2px; | ||
711 | margin-right: 15px; | ||
712 | margin-top: 8px; | ||
713 | font-size: 12px; | ||
714 | flex-direction: row; | ||
715 | justify-content: center; | ||
716 | align-items: center; | ||
717 | &:nth-child(4n) { | ||
718 | margin-right: 0; | ||
719 | } | ||
720 | } | ||
721 | } | ||
722 | } | ||
723 | } | ||
724 | .btn-box { | ||
725 | flex-shrink: 0; | ||
726 | width: 698rpx; | ||
727 | height: 75px; | ||
728 | flex-direction: row !important; | ||
729 | align-items: center; | ||
730 | justify-content: space-between; | ||
731 | >view { | ||
732 | width: 320rpx; | ||
733 | height: 40px; | ||
734 | border-radius: 40px; | ||
735 | border: solid 1rpx #ec652b; | ||
736 | align-items: center; | ||
737 | justify-content: center; | ||
738 | } | ||
739 | .reset { | ||
740 | color: #ec652b; | ||
741 | } | ||
742 | .submit { | ||
743 | color: #fff; | ||
744 | background-color: #ec652b; | ||
745 | } | ||
746 | } | ||
747 | } | ||
748 | .mask { | ||
749 | z-index: 10; | ||
750 | position: fixed; | ||
751 | top: 0; | ||
752 | left: 0; | ||
753 | right: 0; | ||
754 | bottom: 0; | ||
755 | background-color: rgba(0, 0, 0, 0); | ||
756 | transition: background-color .15s linear; | ||
757 | &.show { | ||
758 | background-color: rgba(0, 0, 0, 0.5); | ||
759 | } | ||
760 | &.hide { | ||
761 | display: none; | ||
762 | } | ||
763 | } | ||
764 | /* 字体图标 */ | ||
765 | @font-face { | ||
766 | font-family: "HM-FD-font"; | ||
767 | src: url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAALAAAsAAAAABpQAAAJzAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCDBgp4gQIBNgIkAwwLCAAEIAWEbQc5G8sFERWMIbIfCbbzqA4hp7InSBibVsYGb4J42o82b3e/nJlHMw/NHbGOlwKJRCRpwzPtpAECCOZubdqxjYpQLMlVg+70/08edrgQOtx2ukpVyApZn+dyehPoQObHo3O85rYx9vOjXoBxQIHugW2yIkqIW2QXcScu4jwE8CSWbKSmrqUHFwOaJoCsLM5P4haSGIxRcRHshrUGucLCVcfqI3AZfV/+USguKCwNmtsxVztDxU/n55C+3W0Z4QQpEOTNFqCBbMCAjDUWB9CIwWk87aa70cYgqLkyd3dEmm+18R8eKATEBrV7A5CulBT8dKiWOYZk412XNcDdKSEKSGODnyKIDl+dmVt9/Dx4pu/xyeutkMlHISGPTsPCnoTNP9nOT6wTtDdlO6dPr47efvj942lkYuQzrhMKEjq9N6y98P3340gmlJ/RStUD6F31CAEEPtUW94/7rf+7XgaAz57X0ZHXAGsFFwVgw38yALuMb0IBbVyNamFYEw4oKMDTj3AHRQP5Pt4dci9VwSVkRNQh5r7CLskZadhsWHhRDBsXczk8ZYk3ewnCxmQeQKa3BOHvA8XXO2j+vqRhf7CE+sPmn4anvoL29JLa4qqaUQkmoK+QG2osCckq7txi2leK86aIPyJ3eQZ8xytXYmyQ51jQndJAxIJlqiGSLsOqImiZCjTiZCJt6Lq26U2OoXqwUo0hRaAE0K5AziANy/uLVeXzWyjVqyjcoeupjxDr5MMDn8MDkLG9Aenu5ZrOSSoghAUsRmogkkahSoWAtnlUARnCkY3It0Iu7mWhdmd9Z/19BwBP6GidEi0G56opckXTGZVSPxgAAAA='); | ||
768 | } | ||
769 | .iconfont { | ||
770 | font-family: "HM-FD-font" !important; | ||
771 | font-size: 13px; | ||
772 | font-style: normal; | ||
773 | color: #757575; | ||
774 | &.triangle { | ||
775 | &:before { | ||
776 | content: "\e65a"; | ||
777 | } | ||
778 | } | ||
779 | &.selected { | ||
780 | &:before { | ||
781 | content: "\e607"; | ||
782 | } | ||
783 | } | ||
784 | } | ||
785 | </style> | ||
786 |
src/components/card.vue
File was created | 1 | <template> | |
2 | <view> | ||
3 | |||
4 | </view> | ||
5 | </template> | ||
6 | |||
7 | <script> | ||
8 | export default { | ||
9 | data() { | ||
10 | return { | ||
11 | |||
12 | }; | ||
13 | } | ||
14 | } | ||
15 | </script> | ||
16 | |||
17 | <style lang="scss"> | ||
18 | |||
19 | </style> | ||
20 |
src/components/uni-drawer/uni-drawer.vue
File was created | 1 | <template> | |
2 | <view v-if="visibleSync" :class="{ 'uni-drawer--visible': showDrawer }" class="uni-drawer" @touchmove.stop.prevent="clear"> | ||
3 | <view class="uni-drawer__mask" :class="{ 'uni-drawer__mask--visible': showDrawer && mask }" @tap="close('mask')" /> | ||
4 | <view class="uni-drawer__content" :class="{'uni-drawer--right': rightMode,'uni-drawer--left': !rightMode, 'uni-drawer__content--visible': showDrawer}" :style="{width:drawerWidth+'px'}"> | ||
5 | <slot /> | ||
6 | </view> | ||
7 | </view> | ||
8 | </template> | ||
9 | |||
10 | <script> | ||
11 | /** | ||
12 | * Drawer 抽屉 | ||
13 | * @description 抽屉侧滑菜单 | ||
14 | * @tutorial https://ext.dcloud.net.cn/plugin?id=26 | ||
15 | * @property {Boolean} mask = [true | false] 是否显示遮罩 | ||
16 | * @property {Boolean} maskClick = [true | false] 点击遮罩是否关闭 | ||
17 | * @property {Boolean} mode = [left | right] Drawer 滑出位置 | ||
18 | * @value left 从左侧滑出 | ||
19 | * @value right 从右侧侧滑出 | ||
20 | * @property {Number} width 抽屉的宽度 ,仅 vue 页面生效 | ||
21 | * @event {Function} close 组件关闭时触发事件 | ||
22 | */ | ||
23 | export default { | ||
24 | name: 'UniDrawer', | ||
25 | props: { | ||
26 | /** | ||
27 | * 显示模式(左、右),只在初始化生效 | ||
28 | */ | ||
29 | mode: { | ||
30 | type: String, | ||
31 | default: '' | ||
32 | }, | ||
33 | /** | ||
34 | * 蒙层显示状态 | ||
35 | */ | ||
36 | mask: { | ||
37 | type: Boolean, | ||
38 | default: true | ||
39 | }, | ||
40 | /** | ||
41 | * 遮罩是否可点击关闭 | ||
42 | */ | ||
43 | maskClick:{ | ||
44 | type: Boolean, | ||
45 | default: true | ||
46 | }, | ||
47 | /** | ||
48 | * 抽屉宽度 | ||
49 | */ | ||
50 | width: { | ||
51 | type: Number, | ||
52 | default: 220 | ||
53 | } | ||
54 | }, | ||
55 | data() { | ||
56 | return { | ||
57 | visibleSync: false, | ||
58 | showDrawer: false, | ||
59 | rightMode: false, | ||
60 | watchTimer: null, | ||
61 | drawerWidth: 220 | ||
62 | } | ||
63 | }, | ||
64 | created() { | ||
65 | // #ifndef APP-NVUE | ||
66 | this.drawerWidth = this.width | ||
67 | // #endif | ||
68 | this.rightMode = this.mode === 'right' | ||
69 | }, | ||
70 | methods: { | ||
71 | clear(){}, | ||
72 | close(type) { | ||
73 | // fixed by mehaotian 抽屉尚未完全关闭或遮罩禁止点击时不触发以下逻辑 | ||
74 | if((type === 'mask' && !this.maskClick) || !this.visibleSync) return | ||
75 | this._change('showDrawer', 'visibleSync', false) | ||
76 | }, | ||
77 | open() { | ||
78 | // fixed by mehaotian 处理重复点击打开的事件 | ||
79 | if(this.visibleSync) return | ||
80 | this._change('visibleSync', 'showDrawer', true) | ||
81 | }, | ||
82 | _change(param1, param2, status) { | ||
83 | this[param1] = status | ||
84 | if (this.watchTimer) { | ||
85 | clearTimeout(this.watchTimer) | ||
86 | } | ||
87 | this.watchTimer = setTimeout(() => { | ||
88 | this[param2] = status | ||
89 | this.$emit('change',status) | ||
90 | }, status ? 50 : 300) | ||
91 | } | ||
92 | } | ||
93 | } | ||
94 | </script> | ||
95 | |||
96 | <style lang="scss" scoped> | ||
97 | // 抽屉宽度 | ||
98 | $drawer-width: 220px; | ||
99 | |||
100 | .uni-drawer { | ||
101 | /* #ifndef APP-NVUE */ | ||
102 | display: block; | ||
103 | /* #endif */ | ||
104 | position: fixed; | ||
105 | top: 0; | ||
106 | left: 0; | ||
107 | right: 0; | ||
108 | bottom: 0; | ||
109 | overflow: hidden; | ||
110 | z-index: 999; | ||
111 | } | ||
112 | |||
113 | .uni-drawer__content { | ||
114 | /* #ifndef APP-NVUE */ | ||
115 | display: block; | ||
116 | /* #endif */ | ||
117 | position: absolute; | ||
118 | top: 0; | ||
119 | width: $drawer-width; | ||
120 | bottom: 0; | ||
121 | background-color: $uni-bg-color; | ||
122 | transition: transform 0.3s ease; | ||
123 | } | ||
124 | |||
125 | .uni-drawer--left { | ||
126 | left: 0; | ||
127 | /* #ifdef APP-NVUE */ | ||
128 | transform: translateX(-$drawer-width); | ||
129 | /* #endif */ | ||
130 | /* #ifndef APP-NVUE */ | ||
131 | transform: translateX(-100%); | ||
132 | /* #endif */ | ||
133 | } | ||
134 | |||
135 | .uni-drawer--right { | ||
136 | right: 0; | ||
137 | /* #ifdef APP-NVUE */ | ||
138 | transform: translateX($drawer-width); | ||
139 | /* #endif */ | ||
140 | /* #ifndef APP-NVUE */ | ||
141 | transform: translateX(100%); | ||
142 | /* #endif */ | ||
143 | } | ||
144 | |||
145 | .uni-drawer__content--visible { | ||
146 | transform: translateX(0px); | ||
147 | } | ||
148 | |||
149 | |||
150 | .uni-drawer__mask { | ||
151 | /* #ifndef APP-NVUE */ | ||
152 | display: block; | ||
153 | /* #endif */ | ||
154 | opacity: 0; | ||
155 | position: absolute; | ||
156 | top: 0; | ||
157 | left: 0; | ||
158 | bottom: 0; | ||
159 | right: 0; | ||
160 | background-color: $uni-bg-color-mask; | ||
161 | transition: opacity 0.3s; | ||
162 | } | ||
163 | |||
164 | .uni-drawer__mask--visible { | ||
165 | /* #ifndef APP-NVUE */ | ||
166 | display: block; | ||
167 | /* #endif */ | ||
168 | opacity: 1; | ||
169 | } | ||
170 | </style> | ||
171 |
src/hybrid/html/local.html
File was created | 1 | <!DOCTYPE html> | |
2 | <html> | ||
3 | <head> | ||
4 | <meta charset="utf-8" /> | ||
5 | <meta name="viewport" content="width=device-width, initial-scale=1"> | ||
6 | <title>本地网页</title> | ||
7 | <style type="text/css"> | ||
8 | .btn { | ||
9 | display: block; | ||
10 | margin: 20px auto; | ||
11 | padding: 5px; | ||
12 | background-color: #007aff; | ||
13 | border: 0; | ||
14 | color: #ffffff; | ||
15 | height: 40px; | ||
16 | width: 200px; | ||
17 | } | ||
18 | |||
19 | .btn-red { | ||
20 | background-color: #dd524d; | ||
21 | } | ||
22 | |||
23 | .btn-yellow { | ||
24 | background-color: #f0ad4e; | ||
25 | } | ||
26 | |||
27 | .desc { | ||
28 | padding: 10px; | ||
29 | color: #999999; | ||
30 | } | ||
31 | </style> | ||
32 | </head> | ||
33 | <body> | ||
34 | <p class="desc">web-view 组件加载本地 html 示例,仅在 App 环境下生效。点击下列按钮,跳转至其它页面。</p> | ||
35 | <div class="btn-list"> | ||
36 | <button class="btn" type="button" data-action="navigateTo">navigateTo</button> | ||
37 | <button class="btn" type="button" data-action="redirectTo">redirectTo</button> | ||
38 | <button class="btn" type="button" data-action="navigateBack">navigateBack</button> | ||
39 | <button class="btn" type="button" data-action="reLaunch">reLaunch</button> | ||
40 | <button class="btn" type="button" data-action="switchTab">switchTab</button> | ||
41 | </div> | ||
42 | <p class="desc">网页向应用发送消息。注意:小程序端应用会在此页面后退时接收到消息。</p> | ||
43 | <div class="btn-list"> | ||
44 | <button class="btn btn-red" type="button" id="postMessage">postMessage</button> | ||
45 | </div> | ||
46 | <!-- uni 的 SDK --> | ||
47 | <script type="text/javascript" src="https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js"></script> | ||
48 | <script type="text/javascript"> | ||
49 | document.addEventListener('UniAppJSBridgeReady', function() { | ||
50 | document.querySelector('.btn-list').addEventListener('click', function(evt) { | ||
51 | var target = evt.target; | ||
52 | if (target.tagName === 'BUTTON') { | ||
53 | var action = target.getAttribute('data-action'); | ||
54 | switch (action) { | ||
55 | case 'switchTab': | ||
56 | uni.switchTab({ | ||
57 | url: '/pages/tabBar/API/API' | ||
58 | }); | ||
59 | break; | ||
60 | case 'reLaunch': | ||
61 | uni.reLaunch({ | ||
62 | url: '/pages/tabBar/API/API' | ||
63 | }); | ||
64 | break; | ||
65 | case 'navigateBack': | ||
66 | uni.navigateBack({ | ||
67 | delta: 1 | ||
68 | }); | ||
69 | break; | ||
70 | default: | ||
71 | uni[action]({ | ||
72 | url: '/pages/component/button/button' | ||
73 | }); | ||
74 | break; | ||
75 | } | ||
76 | } | ||
77 | }); | ||
78 | document.querySelector("#postMessage").addEventListener('click', function() { | ||
79 | uni.postMessage({ | ||
80 | data: { | ||
81 | action: 'message' | ||
82 | } | ||
83 | }); | ||
84 | }) | ||
85 | }); | ||
86 | </script> | ||
87 | </body> | ||
88 | </html> | ||
89 |
src/main.js
File was created | 1 | import Vue from 'vue' | |
2 | import App from './App' | ||
3 | |||
4 | Vue.config.productionTip = false | ||
5 | |||
6 | App.mpType = 'app' | ||
7 | |||
8 | const app = new Vue({ | ||
9 | ...App | ||
10 | }) | ||
11 | app.$mount() | ||
12 |
src/manifest.json
File was created | 1 | { | |
2 | "name" : "gulu-vue", | ||
3 | "appid" : "", | ||
4 | "description" : "", | ||
5 | "versionName" : "1.0.0", | ||
6 | "versionCode" : "100", | ||
7 | "transformPx" : false, | ||
8 | /* 5+App特有相关 */ | ||
9 | "app-plus" : { | ||
10 | "usingComponents" : true, | ||
11 | "nvueCompiler" : "uni-app", | ||
12 | "compilerVersion" : 3, | ||
13 | "splashscreen" : { | ||
14 | "alwaysShowBeforeRender" : true, | ||
15 | "waiting" : true, | ||
16 | "autoclose" : true, | ||
17 | "delay" : 0 | ||
18 | }, | ||
19 | /* 模块配置 */ | ||
20 | "modules" : {}, | ||
21 | /* 应用发布信息 */ | ||
22 | "distribute" : { | ||
23 | /* android打包配置 */ | ||
24 | "android" : { | ||
25 | "permissions" : [ | ||
26 | "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>", | ||
27 | "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>", | ||
28 | "<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>", | ||
29 | "<uses-permission android:name=\"android.permission.VIBRATE\"/>", | ||
30 | "<uses-permission android:name=\"android.permission.READ_LOGS\"/>", | ||
31 | "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>", | ||
32 | "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>", | ||
33 | "<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>", | ||
34 | "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>", | ||
35 | "<uses-permission android:name=\"android.permission.CAMERA\"/>", | ||
36 | "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>", | ||
37 | "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>", | ||
38 | "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>", | ||
39 | "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>", | ||
40 | "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>", | ||
41 | "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>", | ||
42 | "<uses-permission android:name=\"android.permission.CALL_PHONE\"/>", | ||
43 | "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>", | ||
44 | "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>", | ||
45 | "<uses-feature android:name=\"android.hardware.camera\"/>", | ||
46 | "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>", | ||
47 | "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>" | ||
48 | ] | ||
49 | }, | ||
50 | /* ios打包配置 */ | ||
51 | "ios" : {}, | ||
52 | /* SDK配置 */ | ||
53 | "sdkConfigs" : {} | ||
54 | } | ||
55 | }, | ||
56 | /* 快应用特有相关 */ | ||
57 | "quickapp" : {}, | ||
58 | /* 小程序特有相关 */ | ||
59 | "mp-weixin" : { | ||
60 | "appid" : "", | ||
61 | "setting" : { | ||
62 | "urlCheck" : false | ||
63 | }, | ||
64 | "usingComponents" : true | ||
65 | }, | ||
66 | "mp-alipay" : { | ||
67 | "usingComponents" : true | ||
68 | }, | ||
69 | "mp-baidu" : { | ||
70 | "usingComponents" : true | ||
71 | }, | ||
72 | "mp-toutiao" : { | ||
73 | "usingComponents" : true | ||
74 | } | ||
75 | } | ||
76 |
src/pages.json
File was created | 1 | { | |
2 | "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages | ||
3 | { | ||
4 | "path": "pages/index/index", | ||
5 | "style": { | ||
6 | "navigationBarTitleText": "商城一览" | ||
7 | } | ||
8 | }, | ||
9 | { | ||
10 | "path": "pages/cart/cart", | ||
11 | "style": { | ||
12 | "navigationBarTitleText": "购物车" | ||
13 | } | ||
14 | }, | ||
15 | { | ||
16 | "path": "pages/user/user", | ||
17 | "style": { | ||
18 | "navigationBarTitleText": "我的" | ||
19 | } | ||
20 | } | ||
21 | ], | ||
22 | "globalStyle": { | ||
23 | "navigationBarTextStyle": "black", | ||
24 | "navigationBarTitleText": "uni-app", | ||
25 | "navigationBarBackgroundColor": "#F8F8F8", | ||
26 | "backgroundColor": "#F8F8F8" | ||
27 | }, | ||
28 | "tabBar": { | ||
29 | "color": "#C0C4CC", | ||
30 | "selectedColor": "#fa436a", | ||
31 | "borderStyle": "black", | ||
32 | "backgroundColor": "#ffffff", | ||
33 | "list": [{ | ||
34 | "pagePath": "pages/index/index", | ||
35 | "iconPath": "static/tab-home.png", | ||
36 | "selectedIconPath": "static/tab-home-current.png", | ||
37 | "text": "首页" | ||
38 | }, | ||
39 | { | ||
40 | "pagePath": "pages/cart/cart", | ||
41 | "iconPath": "static/tab-cart.png", | ||
42 | "selectedIconPath": "static/tab-cart-current.png", | ||
43 | "text": "购物车" | ||
44 | }, | ||
45 | { | ||
46 | "pagePath": "pages/user/user", | ||
47 | "iconPath": "static/tab-my.png", | ||
48 | "selectedIconPath": "static/tab-my-current.png", | ||
49 | "text": "我的" | ||
50 | } | ||
51 | ] | ||
52 | } | ||
53 | } | ||
54 |
src/pages/cart/cart.vue
File was created | 1 | <template> | |
2 | <view class="content"> | ||
3 | <image class="logo" src="/static/logo.png"></image> | ||
4 | <view class="text-area"> | ||
5 | <text class="title">{{title}}</text> | ||
6 | </view> | ||
7 | </view> | ||
8 | </template> | ||
9 | |||
10 | <script> | ||
11 | export default { | ||
12 | data() { | ||
13 | return { | ||
14 | title: 'Hello' | ||
15 | } | ||
16 | }, | ||
17 | onLoad() { | ||
18 | |||
19 | }, | ||
20 | methods: { | ||
21 | |||
22 | } | ||
23 | } | ||
24 | </script> | ||
25 | |||
26 | <style> | ||
27 | .content { | ||
28 | display: flex; | ||
29 | flex-direction: column; | ||
30 | align-items: center; | ||
31 | justify-content: center; | ||
32 | } | ||
33 | |||
34 | .logo { | ||
35 | height: 200rpx; | ||
36 | width: 200rpx; | ||
37 | margin-top: 200rpx; | ||
38 | margin-left: auto; | ||
39 | margin-right: auto; | ||
40 | margin-bottom: 50rpx; | ||
41 | } | ||
42 | |||
43 | .text-area { | ||
44 | display: flex; | ||
45 | justify-content: center; | ||
46 | } | ||
47 | |||
48 | .title { | ||
49 | font-size: 36rpx; | ||
50 | color: #8f8f94; | ||
51 | } | ||
52 | </style> | ||
53 |
src/pages/index/index.vue
File was created | 1 | <template> | |
2 | <view class="content"> | ||
3 | <view class="header"> | ||
4 | <!-- 搜索--> | ||
5 | <view class="searchBar"> | ||
6 | <icon class="searchIcon" type="search" size="14"></icon> | ||
7 | <input class="searchIpt" placeholder="老花镜" confirm-type="search"/> | ||
8 | </view> | ||
9 | |||
10 | <!-- 筛选栏--> | ||
11 | <view class="screenBar"> | ||
12 | <view v-for="item in screenItems" :key="item.current" @click="onClickItem(item.current)" > | ||
13 | <view class="screenItem" v-bind:class="{ active: current === item.current }" v-if="item.current === 2" @click="dropDown"> | ||
14 | {{ item.text }}<icon type="info" size="14"></icon> | ||
15 | </view> | ||
16 | <view class="screenItem" v-bind:class="{ active: current === item.current }" v-if="item.current === 4" @click="showDrawer('showRight')"> | ||
17 | {{ item.text }}<icon type="info" size="14"></icon> | ||
18 | </view> | ||
19 | <view v-if="item.current !== 2&&item.current!==4"> | ||
20 | <view class="screenItem" v-bind:class="{ active: current === item.current }">{{ item.text }}</view> | ||
21 | </view> | ||
22 | </view> | ||
23 | </view> | ||
24 | </view> | ||
25 | <uni-drawer ref="showRight" mask="true" maskClick=true mode="right" :width="320" @change="change($event,'showRight')"> | ||
26 | <view class="close"> | ||
27 | <view @click="closeDrawer('showRight')"><text class="word-btn-white">关闭</text></view> | ||
28 | </view> | ||
29 | </uni-drawer> | ||
30 | |||
31 | |||
32 | |||
33 | <!-- 筛选菜单--> | ||
34 | <view class="content-wrap"> | ||
35 | <view> | ||
36 | <HMfilterDropdown :filterData="filterData" :defaultSelected ="filterDropdownValue" :updateMenuName="true" @confirm="confirm" dataFormat="Object"></HMfilterDropdown> | ||
37 | <!-- 占位 --> | ||
38 | <view class="place"></view> | ||
39 | <!-- 商品列表 --> | ||
40 | <view class="goods-list"> | ||
41 | <view class="product-list"> | ||
42 | <view class="product" v-for="(goods) in goodsList" :key="goods.goods_id" @tap="toGoods(goods)"> | ||
43 | <image mode="widthFix" :src="goods.img"></image> | ||
44 | <view class="name">{{goods.name}}</view> | ||
45 | <view class="info"> | ||
46 | <view class="price">{{goods.price}}</view> | ||
47 | <view class="slogan">{{goods.slogan}}</view> | ||
48 | </view> | ||
49 | </view> | ||
50 | </view> | ||
51 | <view class="loading-text">{{loadingText}}</view> | ||
52 | </view> | ||
53 | |||
54 | </view> | ||
55 | </view> | ||
56 | </view> | ||
57 | </template> | ||
58 | |||
59 | <script> | ||
60 | import uniDrawer from "@/components/uni-drawer/uni-drawer.vue"; | ||
61 | import HMfilterDropdown from "../../components/HM-filterDropdown/HM-filterDropdown.vue"; | ||
62 | import data from '@/common/data.js';//筛选菜单数据 | ||
63 | export default { | ||
64 | components: { | ||
65 | uniDrawer, | ||
66 | 'HMfilterDropdown':HMfilterDropdown | ||
67 | }, | ||
68 | data() { | ||
69 | return { | ||
70 | screenItems: [ | ||
71 | {current:0,text:'全部',hasIcon:false}, | ||
72 | {current:1,text:'销量',hasIcon:false}, | ||
73 | {current:2,text:'价格',hasIcon:true}, | ||
74 | {current:3,text:'折扣',hasIcon:false}, | ||
75 | {current:4,text:'筛选',hasIcon:true}, | ||
76 | ], | ||
77 | current: 0, | ||
78 | showRight: false, | ||
79 | indexArr:'', | ||
80 | valueArr:'', | ||
81 | //商品数据 | ||
82 | goodsList:[ | ||
83 | { goods_id: 0, img: '/static/img/goods/p1.jpg', name: '商品名称', price: '¥168', slogan:'1235人付款' }, | ||
84 | { goods_id: 1, img: '/static/img/goods/p2.jpg', name: '商品名称', price: '¥168', slogan:'1235人付款' }, | ||
85 | { goods_id: 2, img: '/static/img/goods/p3.jpg', name: '商品名称', price: '¥168', slogan:'1235人付款' }, | ||
86 | { goods_id: 3, img: '/static/img/goods/p4.jpg', name: '商品名称', price: '¥168', slogan:'1235人付款' }, | ||
87 | { goods_id: 4, img: '/static/img/goods/p5.jpg', name: '商品名称', price: '¥168', slogan:'1235人付款' }, | ||
88 | { goods_id: 5, img: '/static/img/goods/p6.jpg', name: '商品名称', price: '¥168', slogan:'1235人付款' }, | ||
89 | { goods_id: 6, img: '/static/img/goods/p7.jpg', name: '商品名称', price: '¥168', slogan:'1235人付款' }, | ||
90 | { goods_id: 7, img: '/static/img/goods/p8.jpg', name: '商品名称', price: '¥168', slogan:'1235人付款' }, | ||
91 | { goods_id: 8, img: '/static/img/goods/p9.jpg', name: '商品名称', price: '¥168', slogan:'1235人付款' }, | ||
92 | { goods_id: 9, img: '/static/img/goods/p10.jpg', name: '商品名称', price: '¥168', slogan:'1235人付款' } | ||
93 | ], | ||
94 | loadingText:"正在加载...", | ||
95 | filterDropdownValue:[], | ||
96 | filterData:[] | ||
97 | } | ||
98 | }, | ||
99 | filters: { | ||
100 | outData(value) { | ||
101 | return JSON.stringify(value); | ||
102 | } | ||
103 | }, | ||
104 | onLoad: function () { | ||
105 | //定时器模拟ajax异步请求数据 | ||
106 | setTimeout(()=>{ | ||
107 | //传入defaultSelected的结构不能错,错了就报错运行异常。 不选中的项目传入null | ||
108 | this.filterDropdownValue = [ | ||
109 | [1,1,0], //第0个菜单选中 一级菜单的第1项,二级菜单的第1项,三级菜单的第3项 | ||
110 | [null,null], //第1个菜单选中 都不选中 | ||
111 | [1], //第2个菜单选中 一级菜单的第1项 | ||
112 | [[0],[1,2,7],[1,0]], //筛选菜单选中 第一个筛选的第0项,第二个筛选的第1,2,7项,第三个筛选的第1,0项 | ||
113 | [[0],[1],[1]], //单选菜单选中 第一个筛选的第0项,第二个筛选的第1项,第三个筛选的第1项 | ||
114 | ]; | ||
115 | this.filterData = data; | ||
116 | },100); | ||
117 | //模拟ajax请求子菜单数据。 | ||
118 | // setTimeout(()=>{ | ||
119 | //this.filterData[1].submenu[0].submenu = [{"name": "附近","value": "附近"},{"name": "1km","value": "1km"},{"name": "2km","value": "2km"},{"name": "3km","value": "3km"},{"name": "4km","value": "4km"},{"name": "5km","value": "5km"}]; | ||
120 | // },5000) | ||
121 | }, | ||
122 | methods: { | ||
123 | showDrawer(e) { | ||
124 | this.$refs[e].open() | ||
125 | }, | ||
126 | closeDrawer(e) { | ||
127 | this.$refs[e].close() | ||
128 | }, | ||
129 | change(e, type) { | ||
130 | this[type] = e | ||
131 | }, | ||
132 | onClickItem(e) { | ||
133 | if (this.current !== e) { | ||
134 | this.current = e; | ||
135 | } | ||
136 | }, | ||
137 | dropDown(){ | ||
138 | console.log('下拉') | ||
139 | }, | ||
140 | //接收菜单结果 | ||
141 | confirm(e){ | ||
142 | this.indexArr = e.index; | ||
143 | this.valueArr = e.value; | ||
144 | return; | ||
145 | console.log('修改菜单'); | ||
146 | this.filterData[4].submenu[1] = { | ||
147 | "name": "项目2", | ||
148 | "submenu": [ | ||
149 | |||
150 | ] | ||
151 | } | ||
152 | } | ||
153 | }, | ||
154 | onNavigationBarButtonTap(e) { | ||
155 | this.showRight = !this.showRight | ||
156 | }, | ||
157 | //上拉加载, | ||
158 | onReachBottom(){ | ||
159 | console.log('到底加载') | ||
160 | let len = this.goodsList.length; | ||
161 | if(len>=30){ | ||
162 | this.loadingText="~~到底了~~"; | ||
163 | return false; | ||
164 | }else{ | ||
165 | this.loadingText="正在加载..."; | ||
166 | } | ||
167 | let end_goods_id = this.goodsList[len-1].goods_id; | ||
168 | for(let i=1;i<=10;i++){ | ||
169 | let goods_id = end_goods_id+i; | ||
170 | let p = { goods_id: goods_id, img: '/static/img/goods/p'+(goods_id%10==0?10:goods_id%10)+'.jpg', name: '商品名称', price: '¥168', slogan:'1235人付款' }; | ||
171 | this.goodsList.push(p); | ||
172 | } | ||
173 | }, | ||
174 | } | ||
175 | </script> | ||
176 | |||
177 | <style lang="scss"> | ||
178 | .content { | ||
179 | display: flex; | ||
180 | flex-direction: column; | ||
181 | align-items: center; | ||
182 | justify-content: center; | ||
183 | background-color: #F7F6F6; | ||
184 | } | ||
185 | .header{ | ||
186 | display: flex; | ||
187 | flex-direction: column; | ||
188 | align-items: center; | ||
189 | justify-content: center; | ||
190 | background-color: #F7F6F6; | ||
191 | height:178rpx ; | ||
192 | width: 100%; | ||
193 | z-index: 999; | ||
194 | position: fixed; | ||
195 | top: 0; | ||
196 | } | ||
197 | .searchBar { | ||
198 | width: 670rpx; | ||
199 | display: flex; | ||
200 | position: fixed; | ||
201 | top: 0; | ||
202 | justify-content: center; | ||
203 | align-items: center; | ||
204 | box-sizing: border-box; | ||
205 | padding: 0rpx 16rpx; | ||
206 | border: 1px solid #FF6B4A; | ||
207 | border-radius: 8rpx; | ||
208 | background-color: #ffffff; | ||
209 | } | ||
210 | |||
211 | .searchIpt { | ||
212 | height: 68rpx; | ||
213 | width: 670rpx; | ||
214 | padding: 16rpx; | ||
215 | font-size: 28rpx; | ||
216 | box-sizing: border-box; | ||
217 | } | ||
218 | .screenBar{ | ||
219 | position: fixed; | ||
220 | top: 68rpx; | ||
221 | width: 670rpx; | ||
222 | height: 110rpx; | ||
223 | display: flex; | ||
224 | flex-direction: row; | ||
225 | justify-content: space-between; | ||
226 | align-items: center; | ||
227 | color: #333333; | ||
228 | font-size: 32rpx; | ||
229 | } | ||
230 | .active{ | ||
231 | color: #FF6B4A; | ||
232 | } | ||
233 | .screenItem{ | ||
234 | display: flex; | ||
235 | justify-content: center; | ||
236 | align-items: center; | ||
237 | } | ||
238 | .content-wrap{ | ||
239 | width: 100%; | ||
240 | background-color: #FFFFFF; | ||
241 | } | ||
242 | |||
243 | .HMfilterDropdown{ | ||
244 | position: fixed; | ||
245 | top: 178rpx !important; | ||
246 | } | ||
247 | .place{ | ||
248 | background-color: #ffffff; | ||
249 | height: 266rpx; | ||
250 | } | ||
251 | .goods-list{ | ||
252 | padding-top: 10px; | ||
253 | .loading-text{ | ||
254 | width: 100%; | ||
255 | display: flex; | ||
256 | justify-content: center; | ||
257 | align-items: center; | ||
258 | height: 30px; | ||
259 | color: #979797; | ||
260 | font-size: 12px; | ||
261 | } | ||
262 | .product-list{ | ||
263 | width: 92%; | ||
264 | padding: 0 4% 3vw 4%; | ||
265 | display: flex; | ||
266 | justify-content: space-between; | ||
267 | flex-wrap: wrap; | ||
268 | .product{ | ||
269 | width: 48%; | ||
270 | border-radius: 10px; | ||
271 | background-color: #fff; | ||
272 | margin: 0 0 7px 0; | ||
273 | box-shadow: 0 3px 12px rgba(0,0,0,0.1); | ||
274 | image{ | ||
275 | width: 100%; | ||
276 | border-radius: 10px 10px 0 0; | ||
277 | } | ||
278 | .name{ | ||
279 | width: 92%; | ||
280 | padding: 5px 4%; | ||
281 | display: -webkit-box; | ||
282 | -webkit-box-orient: vertical; | ||
283 | -webkit-line-clamp: 2; | ||
284 | text-align: justify; | ||
285 | overflow: hidden; | ||
286 | font-size: 15px; | ||
287 | } | ||
288 | .info{ | ||
289 | display: flex; | ||
290 | justify-content: space-between; | ||
291 | align-items: flex-end; | ||
292 | width: 92%; | ||
293 | padding: 5px 4% 5px 4%; | ||
294 | .price{ | ||
295 | color: #e65339; | ||
296 | font-size: 15px; | ||
297 | font-weight: 600; | ||
298 | } | ||
299 | .slogan{ | ||
300 | color: #807c87; | ||
301 | font-size: 12px; | ||
302 | } | ||
303 | } | ||
304 | } | ||
305 | } | ||
306 | } | ||
307 | |||
308 | </style> | ||
309 |
src/pages/user/user.vue
File was created | 1 | <template> | |
2 | <view class="content"> | ||
3 | <image class="logo" src="/static/logo.png"></image> | ||
4 | <view class="text-area"> | ||
5 | <text class="title">{{title}}</text> | ||
6 | </view> | ||
7 | </view> | ||
8 | </template> | ||
9 | |||
10 | <script> | ||
11 | export default { | ||
12 | data() { | ||
13 | return { | ||
14 | title: 'Hello' | ||
15 | } | ||
16 | }, | ||
17 | onLoad() { | ||
18 | |||
19 | }, | ||
20 | methods: { | ||
21 | |||
22 | } | ||
23 | } | ||
24 | </script> | ||
25 | |||
26 | <style> | ||
27 | .content { | ||
28 | display: flex; | ||
29 | flex-direction: column; | ||
30 | align-items: center; | ||
31 | justify-content: center; | ||
32 | } | ||
33 | |||
34 | .logo { | ||
35 | height: 200rpx; | ||
36 | width: 200rpx; | ||
37 | margin-top: 200rpx; | ||
38 | margin-left: auto; | ||
39 | margin-right: auto; | ||
40 | margin-bottom: 50rpx; | ||
41 | } | ||
42 | |||
43 | .text-area { | ||
44 | display: flex; | ||
45 | justify-content: center; | ||
46 | } | ||
47 | |||
48 | .title { | ||
49 | font-size: 36rpx; | ||
50 | color: #8f8f94; | ||
51 | } | ||
52 | </style> | ||
53 |
src/platforms/app-plus/feedback/feedback.vue
File was created | 1 | <template> | |
2 | <view class="page"> | ||
3 | <view class='feedback-title'> | ||
4 | <text>问题和意见</text> | ||
5 | <text class="feedback-quick" @tap="chooseMsg">快速键入</text> | ||
6 | </view> | ||
7 | <view class="feedback-body"> | ||
8 | <textarea placeholder="请详细描述你的问题和意见..." v-model="sendDate.content" class="feedback-textare"></textarea> | ||
9 | </view> | ||
10 | <view class='feedback-title'> | ||
11 | <text>图片(选填,提供问题截图,总大小10M以下)</text> | ||
12 | </view> | ||
13 | <view class="feedback-body feedback-uploader"> | ||
14 | <view class="uni-uploader"> | ||
15 | <view class="uni-uploader-head"> | ||
16 | <view class="uni-uploader-title">点击预览图片</view> | ||
17 | <view class="uni-uploader-info">{{imageList.length}}/8</view> | ||
18 | </view> | ||
19 | <view class="uni-uploader-body"> | ||
20 | <view class="uni-uploader__files"> | ||
21 | <block v-for="(image,index) in imageList" :key="index"> | ||
22 | <view class="uni-uploader__file" style="position: relative;"> | ||
23 | <image class="uni-uploader__img" :src="image" @tap="previewImage(index)"></image> | ||
24 | <view class="close-view" @click="close(index)">x</view> | ||
25 | </view> | ||
26 | </block> | ||
27 | <view class="uni-uploader__input-box" v-show="imageList.length < 8"> | ||
28 | <view class="uni-uploader__input" @tap="chooseImg"></view> | ||
29 | </view> | ||
30 | </view> | ||
31 | </view> | ||
32 | </view> | ||
33 | </view> | ||
34 | <view class='feedback-title'> | ||
35 | <text>QQ/邮箱</text> | ||
36 | </view> | ||
37 | <view class="feedback-body"> | ||
38 | <input class="feedback-input" v-model="sendDate.contact" placeholder="(选填,方便我们联系你 )" /> | ||
39 | </view> | ||
40 | <view class='feedback-title feedback-star-view'> | ||
41 | <text>应用评分</text> | ||
42 | <view class="feedback-star-view"> | ||
43 | <text class="feedback-star" v-for="(value,key) in stars" :key="key" :class="key < sendDate.score ? 'active' : ''" | ||
44 | @tap="chooseStar(value)"></text> | ||
45 | </view> | ||
46 | </view> | ||
47 | <button type="default" class="feedback-submit" @tap="send">提交</button> | ||
48 | <view class='feedback-title'> | ||
49 | <text>用户反馈的结果可在app打包后于DCloud开发者中心查看</text> | ||
50 | </view> | ||
51 | </view> | ||
52 | </template> | ||
53 | |||
54 | <script> | ||
55 | export default { | ||
56 | data() { | ||
57 | return { | ||
58 | msgContents: ["界面显示错乱", "启动缓慢,卡出翔了", "UI无法直视,丑哭了", "偶发性崩溃"], | ||
59 | stars: [1, 2, 3, 4, 5], | ||
60 | imageList: [], | ||
61 | sendDate: { | ||
62 | score: 0, | ||
63 | content: "", | ||
64 | contact: "" | ||
65 | } | ||
66 | } | ||
67 | }, | ||
68 | onLoad() { | ||
69 | let deviceInfo = { | ||
70 | appid: plus.runtime.appid, | ||
71 | imei: plus.device.imei, //设备标识 | ||
72 | p: plus.os.name === "Android" ? "a" : "i", //平台类型,i表示iOS平台,a表示Android平台。 | ||
73 | md: plus.device.model, //设备型号 | ||
74 | app_version: plus.runtime.version, | ||
75 | plus_version: plus.runtime.innerVersion, //基座版本号 | ||
76 | os: plus.os.version, | ||
77 | net: "" + plus.networkinfo.getCurrentType() | ||
78 | } | ||
79 | this.sendDate = Object.assign(deviceInfo, this.sendDate); | ||
80 | }, | ||
81 | methods: { | ||
82 | close(e) { | ||
83 | this.imageList.splice(e, 1); | ||
84 | }, | ||
85 | chooseMsg() { //快速输入 | ||
86 | uni.showActionSheet({ | ||
87 | itemList: this.msgContents, | ||
88 | success: (res) => { | ||
89 | this.sendDate.content = this.msgContents[res.tapIndex]; | ||
90 | } | ||
91 | }) | ||
92 | }, | ||
93 | chooseImg() { //选择图片 | ||
94 | uni.chooseImage({ | ||
95 | sourceType: ["camera", "album"], | ||
96 | sizeType: "compressed", | ||
97 | count: 8 - this.imageList.length, | ||
98 | success: (res) => { | ||
99 | this.imageList = this.imageList.concat(res.tempFilePaths); | ||
100 | } | ||
101 | }) | ||
102 | }, | ||
103 | chooseStar(e) { //点击评星 | ||
104 | this.sendDate.score = e; | ||
105 | }, | ||
106 | previewImage(index) { //预览图片 | ||
107 | uni.previewImage({ | ||
108 | urls: this.imageList, | ||
109 | current: this.imageList[index] | ||
110 | }); | ||
111 | }, | ||
112 | send() { //发送反馈 | ||
113 | console.log(JSON.stringify(this.sendDate)); | ||
114 | if (this.imageList.length === 0) { | ||
115 | uni.showModal({ | ||
116 | content: '至少选择一张图片', | ||
117 | showCancel: false | ||
118 | }) | ||
119 | return | ||
120 | } | ||
121 | if (this.sendDate.content.length === 0) { | ||
122 | uni.showModal({ | ||
123 | content: '请输入问题和意见', | ||
124 | showCancel: false | ||
125 | }) | ||
126 | return | ||
127 | } | ||
128 | uni.showLoading({ | ||
129 | title: '上传中...' | ||
130 | }) | ||
131 | let imgs = this.imageList.map((value, index) => { | ||
132 | return { | ||
133 | name: "image" + index, | ||
134 | uri: value | ||
135 | } | ||
136 | }) | ||
137 | uni.uploadFile({ | ||
138 | url: "https://service.dcloud.net.cn/feedback", | ||
139 | files: imgs, | ||
140 | formData: this.sendDate, | ||
141 | success: (res) => { | ||
142 | if (typeof res.data === 'string') { | ||
143 | res.data = JSON.parse(res.data) | ||
144 | } | ||
145 | if (res.statusCode === 200 && res.data && res.data.ret === 0) { | ||
146 | uni.showModal({ | ||
147 | content: '反馈成功', | ||
148 | showCancel: false | ||
149 | }) | ||
150 | this.imageList = []; | ||
151 | this.sendDate = { | ||
152 | score: 0, | ||
153 | content: "", | ||
154 | contact: "" | ||
155 | } | ||
156 | } else if (res.statusCode !== 200){ | ||
157 | uni.showModal({ | ||
158 | content: '反馈失败,错误码为:' + res.statusCode, | ||
159 | showCancel: false | ||
160 | }) | ||
161 | } else { | ||
162 | uni.showModal({ | ||
163 | content: '反馈失败', | ||
164 | showCancel: false | ||
165 | }) | ||
166 | } | ||
167 | }, | ||
168 | fail: (res) => { | ||
169 | console.log(JSON.stringify(res)) | ||
170 | }, | ||
171 | complete() { | ||
172 | uni.hideLoading() | ||
173 | } | ||
174 | }); | ||
175 | } | ||
176 | } | ||
177 | } | ||
178 | </script> | ||
179 | |||
180 | <style> | ||
181 | page { | ||
182 | background-color: #EFEFF4; | ||
183 | } | ||
184 | |||
185 | .input-view { | ||
186 | font-size: 28rpx; | ||
187 | } | ||
188 | |||
189 | .close-view { | ||
190 | text-align: center; | ||
191 | line-height: 14px; | ||
192 | height: 16px; | ||
193 | width: 16px; | ||
194 | border-radius: 50%; | ||
195 | background: #FF5053; | ||
196 | color: #FFFFFF; | ||
197 | position: absolute; | ||
198 | top: -6px; | ||
199 | right: -4px; | ||
200 | font-size: 12px; | ||
201 | } | ||
202 | </style> | ||
203 |
src/platforms/app-plus/orientation/orientation.vue
File was created | 1 | <template> | |
2 | <view> | ||
3 | <page-head :title="title"></page-head> | ||
4 | <view class="uni-padding-wrap uni-common-mt"> | ||
5 | <view class="uni-btn-v"> | ||
6 | <button type="primary" @tap="getOrient">获取设备的方向信息</button> | ||
7 | <button type="primary" @tap="watchOrient">监听设备的方向变化</button> | ||
8 | <button type="primary" @tap="watchStop">停止监听</button> | ||
9 | </view> | ||
10 | <view class="uni-textarea"> | ||
11 | <textarea :value="value" /> | ||
12 | </view> | ||
13 | </view> | ||
14 | </view> | ||
15 | </template> | ||
16 | <script> | ||
17 | var id = null | ||
18 | export default { | ||
19 | data() { | ||
20 | return { | ||
21 | title: 'orientation', | ||
22 | value: '' | ||
23 | } | ||
24 | }, | ||
25 | methods: { | ||
26 | getOrient: function () { | ||
27 | var that = this; | ||
28 | plus.orientation.getCurrentOrientation(function (o) { | ||
29 | that.value = "alpha:" + o.alpha + "\nbeta:" + o.beta + "\ngamma:" + o.gamma; | ||
30 | }, function (e) { | ||
31 | console.log("获取失败:" + e.message); | ||
32 | }); | ||
33 | }, | ||
34 | watchOrient: function () { | ||
35 | var that = this; | ||
36 | if (id) { | ||
37 | return; | ||
38 | } | ||
39 | id = plus.orientation.watchOrientation(function (o) { | ||
40 | that.value = "监听设备方向变化信息\n" + "alpha:" + o.alpha + "\nbeta:" + o.beta + "\ngamma:" + o.gamma; | ||
41 | }, function (e) { | ||
42 | plus.orientation.clearWatch(id); | ||
43 | id = null; | ||
44 | console.log("监听失败:" + e.message); | ||
45 | }); | ||
46 | }, | ||
47 | watchStop: function () { | ||
48 | if (id) { | ||
49 | plus.orientation.clearWatch(id); | ||
50 | id = null; | ||
51 | } else { | ||
52 | console.log("没有监听设备方向变化"); | ||
53 | } | ||
54 | } | ||
55 | } | ||
56 | } | ||
57 | </script> | ||
58 | |||
59 | <style> | ||
60 | |||
61 | </style> |
src/platforms/app-plus/proximity/proximity.vue
File was created | 1 | <template> | |
2 | <view> | ||
3 | <page-head :title="title"></page-head> | ||
4 | <view class="uni-padding-wrap uni-common-mt"> | ||
5 | <view class="uni-hello-text"> | ||
6 | 手机顶部听筒处有传感器监听距离手机屏幕的障碍物,覆盖该传感器会触发本事件变化 | ||
7 | </view> | ||
8 | <view class="uni-btn-v uni-common-mt"> | ||
9 | <button type="primary" @tap="getProximity">获取距离传感器信息</button> | ||
10 | <button type="primary" @tap="watchProximity">监听距离传感器变化</button> | ||
11 | <button type="primary" @tap="watchStop">停止监听</button> | ||
12 | </view> | ||
13 | <view class="uni-textarea uni-common-mt"> | ||
14 | <textarea :value="value" /> | ||
15 | </view> | ||
16 | </view> | ||
17 | </view> | ||
18 | </template> | ||
19 | <script> | ||
20 | var id = null | ||
21 | var bright = null | ||
22 | export default { | ||
23 | data() { | ||
24 | return { | ||
25 | title: 'proximity', | ||
26 | value: '' | ||
27 | } | ||
28 | }, | ||
29 | methods: { | ||
30 | getProximity: function () { | ||
31 | var that = this; | ||
32 | plus.proximity.getCurrentProximity(function (d) { | ||
33 | that.value = "距离为:" + d; | ||
34 | }, function (e) { | ||
35 | that.value = "获取失败:" + e.message; | ||
36 | }); | ||
37 | }, | ||
38 | watchProximity: function () { | ||
39 | var that = this; | ||
40 | if (id) { | ||
41 | return; | ||
42 | } | ||
43 | bright = plus.screen.getBrightness(); | ||
44 | id = plus.proximity.watchProximity(function (d) { | ||
45 | that.value = "距离变化:" + d; | ||
46 | plus.screen.setBrightness((d < 1) ? 0.01 : bright); | ||
47 | }, function (e) { | ||
48 | plus.proximity.clearWatch(id); | ||
49 | id = null; | ||
50 | that.value = "监听失败:" + e.message; | ||
51 | }); | ||
52 | }, | ||
53 | watchStop: function () { | ||
54 | var that = this; | ||
55 | if (id) { | ||
56 | that.value = "停止监听设备距离传感器信息"; | ||
57 | plus.proximity.clearWatch(id); | ||
58 | id = null; | ||
59 | } else { | ||
60 | that.value = "没有监听设备距离传感器"; | ||
61 | } | ||
62 | } | ||
63 | } | ||
64 | } | ||
65 | </script> | ||
66 | |||
67 | <style> | ||
68 | |||
69 | </style> | ||
70 |
src/platforms/app-plus/push/push.vue
File was created | 1 | <template> | |
2 | <view> | ||
3 | <page-head :title="title"></page-head> | ||
4 | <view class="uni-padding-wrap" v-if="provider[0]"> | ||
5 | <view class="uni-btn-v uni-common-mt"> | ||
6 | <button type="primary" @tap="openPush">开启push</button> | ||
7 | <button type="primary" @tap="closePush">关闭push</button> | ||
8 | <button type="primary" @tap="listenTranMsg">监听透传数据</button> | ||
9 | <button type="primary" @tap="removeTranMsg">移除监听透传数据</button> | ||
10 | </view> | ||
11 | <view class="uni-btn-v uni-common-mt"> | ||
12 | <button type="primary" @tap="requireTranMsg">发送"透传数据"消息</button> | ||
13 | </view> | ||
14 | <view class="uni-title uni-common-mt">透传内容:</view> | ||
15 | <view class="uni-textarea"> | ||
16 | <textarea v-model="tranMsg" /> | ||
17 | </view> | ||
18 | </view> | ||
19 | </view> | ||
20 | </template> | ||
21 | <script> | ||
22 | export default { | ||
23 | data() { | ||
24 | return { | ||
25 | title: 'push', | ||
26 | provider: [], | ||
27 | pushServer: 'http://demo.dcloud.net.cn/push/?', | ||
28 | tranMsg:'' | ||
29 | } | ||
30 | }, | ||
31 | onLoad: function () { | ||
32 | uni.getProvider({ | ||
33 | service: "push", | ||
34 | success: (e) => { | ||
35 | console.log("success", e); | ||
36 | this.provider = e.provider; | ||
37 | }, | ||
38 | fail: (e) => { | ||
39 | console.log("获取推送通道失败", e); | ||
40 | } | ||
41 | }); | ||
42 | }, | ||
43 | onUnload:function(){ | ||
44 | this.tranMsg = '' | ||
45 | }, | ||
46 | methods: { | ||
47 | openPush() { | ||
48 | uni.subscribePush({ | ||
49 | provider: this.provider[0], | ||
50 | success: (e) => { | ||
51 | uni.showToast({ | ||
52 | title: "已开启push接收" | ||
53 | }) | ||
54 | } | ||
55 | }) | ||
56 | }, | ||
57 | closePush() { | ||
58 | uni.unsubscribePush({ | ||
59 | provider: this.provider[0], | ||
60 | success: (e) => { | ||
61 | uni.showToast({ | ||
62 | title: "已关闭push接收" | ||
63 | }) | ||
64 | } | ||
65 | }) | ||
66 | }, | ||
67 | listenTranMsg() { | ||
68 | uni.onPush({ | ||
69 | provider: this.provider[0], | ||
70 | success: (e) => { | ||
71 | uni.showToast({ | ||
72 | title: "开始监听透传数据" | ||
73 | }) | ||
74 | }, | ||
75 | callback: (e) => { | ||
76 | uni.showToast({ | ||
77 | title: "接收到透传数据" | ||
78 | }); | ||
79 | |||
80 | this.tranMsg = JSON.stringify(e.data); | ||
81 | } | ||
82 | }) | ||
83 | }, | ||
84 | removeTranMsg() { | ||
85 | uni.offPush({ | ||
86 | provider: this.provider[0], | ||
87 | success: (e) => { | ||
88 | console.log("移除监听透传数据"); | ||
89 | uni.showToast({ | ||
90 | title: "移除监听透传数据" | ||
91 | }) | ||
92 | } | ||
93 | }) | ||
94 | }, | ||
95 | requireTranMsg() { //请求‘透传数据’推送消息 | ||
96 | var inf = plus.push.getClientInfo(); | ||
97 | var url = this.pushServer + 'type=tran&appid=' + encodeURIComponent(plus.runtime.appid); | ||
98 | inf.id && (url += '&id=' + inf.id); | ||
99 | url += ('&cid=' + encodeURIComponent(inf.clientid)); | ||
100 | if (plus.os.name == 'iOS') { | ||
101 | url += ('&token=' + encodeURIComponent(inf.token)); | ||
102 | } | ||
103 | url += ('&title=' + encodeURIComponent('Hello uniapp')); | ||
104 | url += ('&content=' + encodeURIComponent('带透传数据推送通知!')); | ||
105 | if(plus.os.name === 'iOS'){ | ||
106 | url += ('&payload=' + encodeURIComponent('{"title":"Hello uniapp Test","content":"test content"}')); | ||
107 | }else{ | ||
108 | url += ('&payload=' + encodeURIComponent('\'{"title":"Hello uniapp Test","content":"test content"}\'')); | ||
109 | } | ||
110 | url += ('&version=' + encodeURIComponent(plus.runtime.version)); | ||
111 | plus.runtime.openURL(url); | ||
112 | } | ||
113 | } | ||
114 | } | ||
115 | </script> | ||
116 | |||
117 | <style> | ||
118 | |||
119 | </style> | ||
120 | |||
121 |
src/platforms/app-plus/shake/shake.vue
File was created | 1 | <template> | |
2 | <view class="root" :style="{backgroundImage:'url('+img+')'}"> | ||
3 | <view :class="[show ? 'up' : '','shake-up']"> | ||
4 | <image mode="aspectFit" src="https://img-cdn-qiniu.dcloud.net.cn/uniapp/shake/shakeup.png"></image> | ||
5 | </view> | ||
6 | <view :class="[show ? 'down' : '','shake-down']"> | ||
7 | <image mode="aspectFit" src="https://img-cdn-qiniu.dcloud.net.cn/uniapp/shake/shakedown.png"></image> | ||
8 | </view> | ||
9 | </view> | ||
10 | </template> | ||
11 | <script> | ||
12 | export default { | ||
13 | data() { | ||
14 | return { | ||
15 | img: 'https://img-cdn-qiniu.dcloud.net.cn/uniapp/shake/1.jpg', | ||
16 | show: false, | ||
17 | isOpened: false | ||
18 | } | ||
19 | }, | ||
20 | onLoad: function () { | ||
21 | this.music = uni.createInnerAudioContext(); | ||
22 | this.music.src = 'https://img-cdn-qiniu.dcloud.net.cn/uniapp/shake/shake.wav'; | ||
23 | |||
24 | let index = 1, | ||
25 | t = null; | ||
26 | uni.onAccelerometerChange((res) => { | ||
27 | if (Math.abs(res.x) + Math.abs(res.y) + Math.abs(res.z) > 20 && !this.show && this.isOpened) { | ||
28 | this.music.play(); | ||
29 | setTimeout(() => { | ||
30 | index++; | ||
31 | if (index > 4) { | ||
32 | index = 1 | ||
33 | } | ||
34 | this.img = 'https://img-cdn-qiniu.dcloud.net.cn/uniapp/shake/' + index + '.jpg'; | ||
35 | }, 2000); | ||
36 | this.show = true; | ||
37 | if (t) { | ||
38 | clearTimeout(t); | ||
39 | } | ||
40 | t = setTimeout(() => { | ||
41 | t = null; | ||
42 | this.show = false; | ||
43 | }, 600) | ||
44 | } | ||
45 | }) | ||
46 | }, | ||
47 | onShow() { | ||
48 | this.isOpened = true; | ||
49 | }, | ||
50 | onUnload() { | ||
51 | this.show = false; | ||
52 | this.isOpened = false; | ||
53 | uni.stopAccelerometer(); | ||
54 | this.music.destroy(); | ||
55 | } | ||
56 | } | ||
57 | </script> | ||
58 | |||
59 | <style> | ||
60 | .root { | ||
61 | height: 100%; | ||
62 | display: flex; | ||
63 | flex-direction: column; | ||
64 | background-position: center center; | ||
65 | background-repeat: no-repeat; | ||
66 | } | ||
67 | |||
68 | .shake-up, | ||
69 | .shake-down { | ||
70 | height: 50%; | ||
71 | overflow: hidden; | ||
72 | transition: all .5s ease-in-out; | ||
73 | -webkit-transition: all .5s ease-in-out; | ||
74 | background: #333; | ||
75 | } | ||
76 | |||
77 | .up { | ||
78 | transform: translateY(-50%); | ||
79 | -webkit-transform: translateY(-50%); | ||
80 | } | ||
81 | |||
82 | .down { | ||
83 | transform: translateY(50%); | ||
84 | -webkit-transform: translateY(50%); | ||
85 | } | ||
86 | |||
87 | image { | ||
88 | height: 100%; | ||
89 | width: 100%; | ||
90 | } | ||
91 | </style> | ||
92 |
src/platforms/app-plus/speech/speech.vue
File was created | 1 | <template> | |
2 | <view> | ||
3 | <page-head :title="title"></page-head> | ||
4 | <view class="uni-padding-wrap uni-common-mt"> | ||
5 | <view class="uni-textarea"> | ||
6 | <textarea :value="value" placeholder="语音识别内容展示区域" disabled /> | ||
7 | </view> | ||
8 | <view class="uni-common-mt uni-btn-v"> | ||
9 | <button type="primary" @tap="startRecognize">开始语音识别</button> | ||
10 | <button type="primary" @tap="startRecognizeEnglish">开始语音识别(英语)</button> | ||
11 | </view> | ||
12 | </view> | ||
13 | </view> | ||
14 | </template> | ||
15 | <script> | ||
16 | import permision from "@/common/permission.js" | ||
17 | export default { | ||
18 | data() { | ||
19 | return { | ||
20 | title: 'speech', | ||
21 | value: '' | ||
22 | } | ||
23 | }, | ||
24 | onUnload(){ | ||
25 | this.value = "" | ||
26 | }, | ||
27 | methods: { | ||
28 | async startRecognize () { | ||
29 | // #ifdef APP-PLUS | ||
30 | let status = await this.checkPermission(); | ||
31 | if (status !== 1) { | ||
32 | return; | ||
33 | } | ||
34 | // #endif | ||
35 | |||
36 | // TODO ios 在没有请求过权限之前无法得知是否有相关权限,这种状态下需要直接调用语音,会弹出正在识别的toast | ||
37 | var options = {}; | ||
38 | var that = this; | ||
39 | options.engine = 'baidu'; | ||
40 | that.value = ""; | ||
41 | plus.speech.startRecognize(options, function (s) { | ||
42 | console.log(s); | ||
43 | that.value += s; | ||
44 | }, function (e) { | ||
45 | console.log("语音识别失败:" + e.message); | ||
46 | }); | ||
47 | }, | ||
48 | async startRecognizeEnglish () { | ||
49 | // #ifdef APP-PLUS | ||
50 | let status = await this.checkPermission(); | ||
51 | if (status !== 1) { | ||
52 | return; | ||
53 | } | ||
54 | // #endif | ||
55 | |||
56 | // TODO ios 在没有请求过权限之前无法得知是否有相关权限,这种状态下需要直接调用语音,会弹出正在识别的toast | ||
57 | var options = {}; | ||
58 | var that = this; | ||
59 | options.engine = 'baidu'; | ||
60 | options.lang = 'en-us'; | ||
61 | that.value = ""; | ||
62 | plus.speech.startRecognize(options, function (s) { | ||
63 | console.log(s); | ||
64 | that.value += s; | ||
65 | }, function (e) { | ||
66 | console.log("语音识别失败:" + e.message); | ||
67 | }); | ||
68 | } | ||
69 | // #ifdef APP-PLUS | ||
70 | , | ||
71 | async checkPermission() { | ||
72 | let status = permision.isIOS ? await permision.requestIOS('record') : | ||
73 | await permision.requestAndroid('android.permission.RECORD_AUDIO'); | ||
74 | |||
75 | if (status === null || status === 1) { | ||
76 | status = 1; | ||
77 | } else if (status === 2) { | ||
78 | uni.showModal({ | ||
79 | content: "系统麦克风已关闭", | ||
80 | confirmText: "确定", | ||
81 | showCancel: false, | ||
82 | success: function(res) { | ||
83 | } | ||
84 | }) | ||
85 | } else { | ||
86 | uni.showModal({ | ||
87 | content: "需要麦克风权限", | ||
88 | confirmText: "设置", | ||
89 | success: function(res) { | ||
90 | if (res.confirm) { | ||
91 | permision.gotoAppSetting(); | ||
92 | } | ||
93 | } | ||
94 | }) | ||
95 | } | ||
96 | return status; | ||
97 | } | ||
98 | // #endif | ||
99 | } | ||
100 | } | ||
101 | </script> | ||
102 | |||
103 | <style> | ||
104 | |||
105 | </style> | ||
106 |
src/static/img/goods/p1.jpg
11.3 KB
src/static/img/goods/p10.jpg
22.6 KB
src/static/img/goods/p2.jpg
16.3 KB
src/static/img/goods/p3.jpg
15 KB
src/static/img/goods/p4.jpg
6.55 KB
src/static/img/goods/p5.jpg
29.6 KB
src/static/img/goods/p6.jpg
6.25 KB
src/static/img/goods/p7.jpg
20.1 KB
src/static/img/goods/p8.jpg
20.4 KB
src/static/img/goods/p9.jpg
24.1 KB
src/static/logo.png
3.93 KB
src/static/tab-cart-current.png
2.89 KB
src/static/tab-cart.png
2.85 KB
src/static/tab-home-current.png
3.97 KB
src/static/tab-home.png
3.87 KB
src/static/tab-my-current.png
1.31 KB
src/static/tab-my.png
2.89 KB
src/store/index.js
File was created | 1 | import Vue from 'vue' | |
2 | import Vuex from 'vuex' | ||
3 | |||
4 | Vue.use(Vuex) | ||
5 | |||
6 | const store = new Vuex.Store({ | ||
7 | state: { | ||
8 | hasLogin: false, | ||
9 | loginProvider: "", | ||
10 | openid: null, | ||
11 | testvuex:false, | ||
12 | colorIndex: 0, | ||
13 | colorList: ['#FF0000','#00FF00','#0000FF'] | ||
14 | }, | ||
15 | mutations: { | ||
16 | login(state, provider) { | ||
17 | state.hasLogin = true; | ||
18 | state.loginProvider = provider; | ||
19 | }, | ||
20 | logout(state) { | ||
21 | state.hasLogin = false | ||
22 | state.openid = null | ||
23 | }, | ||
24 | setOpenid(state, openid) { | ||
25 | state.openid = openid | ||
26 | }, | ||
27 | setTestTrue(state){ | ||
28 | state.testvuex = true | ||
29 | }, | ||
30 | setTestFalse(state){ | ||
31 | state.testvuex = false | ||
32 | }, | ||
33 | setColorIndex(state,index){ | ||
34 | state.colorIndex = index | ||
35 | } | ||
36 | }, | ||
37 | getters:{ | ||
38 | currentColor(state){ | ||
39 | return state.colorList[state.colorIndex] | ||
40 | } | ||
41 | }, | ||
42 | actions: { | ||
43 | // lazy loading openid | ||
44 | getUserOpenId: async function ({ | ||
45 | commit, | ||
46 | state | ||
47 | }) { | ||
48 | return await new Promise((resolve, reject) => { | ||
49 | if (state.openid) { | ||
50 | resolve(state.openid) | ||
51 | } else { | ||
52 | uni.login({ | ||
53 | success: (data) => { | ||
54 | commit('login') | ||
55 | setTimeout(function () { //模拟异步请求服务器获取 openid | ||
56 | const openid = '123456789' | ||
57 | console.log('uni.request mock openid[' + openid + ']'); | ||
58 | commit('setOpenid', openid) | ||
59 | resolve(openid) | ||
60 | }, 1000) | ||
61 | }, | ||
62 | fail: (err) => { | ||
63 | console.log('uni.login 接口调用失败,将无法正常使用开放接口等服务', err) | ||
64 | reject(err) | ||
65 | } | ||
66 | }) | ||
67 | } | ||
68 | }) | ||
69 | } | ||
70 | } | ||
71 | }) | ||
72 | |||
73 | export default store | ||
74 |
src/template.h5.html
File was created | 1 | <!DOCTYPE html> | |
2 | <html lang="zh-CN"> | ||
3 | <head> | ||
4 | <meta charset="utf-8"> | ||
5 | <meta http-equiv="X-UA-Compatible" content="IE=edge"> | ||
6 | <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> | ||
7 | <title> | ||
8 | <%= htmlWebpackPlugin.options.title %> | ||
9 | </title> | ||
10 | <!-- 正式发布的时候使用,开发期间不启用。↓ --> | ||
11 | <!-- <script src="/h5/touch-emulator.js"></script> | ||
12 | <script> | ||
13 | TouchEmulator(); | ||
14 | if (document.documentElement.clientWidth > 1024) { | ||
15 | window.location.href = '/h5/pcguide.html#'+location.pathname+location.search; | ||
16 | } | ||
17 | </script> | ||
18 | <style> | ||
19 | ::-webkit-scrollbar{ | ||
20 | display: none; | ||
21 | } | ||
22 | </style> | ||
23 | <script> | ||
24 | var _hmt = _hmt || []; | ||
25 | (function() { | ||
26 | var hm = document.createElement("script"); | ||
27 | hm.src = "https://hm.baidu.com/hm.js?";// 百度统计key | ||
28 | var s = document.getElementsByTagName("script")[0]; | ||
29 | s.parentNode.insertBefore(hm, s); | ||
30 | })(); | ||
31 | </script> --> | ||
32 | <!-- 正式发布的时候使用,开发期间不启用。↑ --> | ||
33 | <script> | ||
34 | document.addEventListener('DOMContentLoaded', function() { | ||
35 | document.documentElement.style.fontSize = document.documentElement.clientWidth / 20 + 'px' | ||
36 | }) | ||
37 | </script> | ||
38 | <link rel="stylesheet" href="<%= BASE_URL %>static/index.css" /> | ||
39 | </head> | ||
40 | <body> | ||
41 | <!-- 该文件为 H5 平台的模板 HTML,并非应用入口。 --> | ||
42 | <!-- 请勿在此文件编写页面代码或直接运行此文件。 --> | ||
43 | <!-- 详见文档:https://uniapp.dcloud.io/collocation/manifest?id=h5-template --> | ||
44 | <noscript> | ||
45 | <strong>Please enable JavaScript to continue.</strong> | ||
46 | </noscript> | ||
47 | <div id="app"></div> | ||
48 | <!-- built files will be auto injected --> | ||
49 | <script> | ||
50 | /*BAIDU_STAT*/ | ||
51 | </script> | ||
52 | </body> | ||
53 | </html> | ||
54 |
src/uni.scss
File was created | 1 | /** | |
2 | * 这里是uni-app内置的常用样式变量 | ||
3 | * | ||
4 | * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量 | ||
5 | * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App | ||
6 | * | ||
7 | */ | ||
8 | |||
9 | /** | ||
10 | * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能 | ||
11 | * | ||
12 | * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件 | ||
13 | */ | ||
14 | |||
15 | /* 颜色变量 */ | ||
16 | |||
17 | /* 行为相关颜色 */ | ||
18 | $uni-color-primary: #007aff; | ||
19 | $uni-color-success: #4cd964; | ||
20 | $uni-color-warning: #f0ad4e; | ||
21 | $uni-color-error: #dd524d; | ||
22 | |||
23 | /* 文字基本颜色 */ | ||
24 | $uni-text-color:#333;//基本色 | ||
25 | $uni-text-color-inverse:#fff;//反色 | ||
26 | $uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息 | ||
27 | $uni-text-color-placeholder: #808080; | ||
28 | $uni-text-color-disable:#c0c0c0; | ||
29 | |||
30 | /* 背景颜色 */ | ||
31 | $uni-bg-color:#ffffff; | ||
32 | $uni-bg-color-grey:#f8f8f8; | ||
33 | $uni-bg-color-hover:#f1f1f1;//点击状态颜色 | ||
34 | $uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色 | ||
35 | |||
36 | /* 边框颜色 */ | ||
37 | $uni-border-color:#c8c7cc; | ||
38 | |||
39 | /* 尺寸变量 */ | ||
40 | |||
41 | /* 文字尺寸 */ | ||
42 | $uni-font-size-sm:24rpx; | ||
43 | $uni-font-size-base:28rpx; | ||
44 | $uni-font-size-lg:32rpx; | ||
45 | |||
46 | /* 图片尺寸 */ | ||
47 | $uni-img-size-sm:40rpx; | ||
48 | $uni-img-size-base:52rpx; | ||
49 | $uni-img-size-lg:80rpx; | ||
50 | |||
51 | /* Border Radius */ | ||
52 | $uni-border-radius-sm: 4rpx; | ||
53 | $uni-border-radius-base: 6rpx; | ||
54 | $uni-border-radius-lg: 12rpx; | ||
55 | $uni-border-radius-circle: 50%; | ||
56 | |||
57 | /* 水平间距 */ | ||
58 | $uni-spacing-row-sm: 10px; | ||
59 | $uni-spacing-row-base: 20rpx; | ||
60 | $uni-spacing-row-lg: 30rpx; | ||
61 | |||
62 | /* 垂直间距 */ | ||
63 | $uni-spacing-col-sm: 8rpx; | ||
64 | $uni-spacing-col-base: 16rpx; | ||
65 | $uni-spacing-col-lg: 24rpx; | ||
66 | |||
67 | /* 透明度 */ | ||
68 | $uni-opacity-disabled: 0.3; // 组件禁用态的透明度 | ||
69 | |||
70 | /* 文章场景相关 */ | ||
71 | $uni-color-title: #2C405A; // 文章标题颜色 | ||
72 | $uni-font-size-title:40rpx; | ||
73 | $uni-color-subtitle: #555555; // 二级标题颜色 | ||
74 | $uni-font-size-subtitle:36rpx; | ||
75 | $uni-color-paragraph: #3F536E; // 文章段落颜色 | ||
76 | $uni-font-size-paragraph:30rpx; |
src/wxcomponents/vant/button/index.d.ts
File was created | 1 | export {}; | |
2 |
src/wxcomponents/vant/button/index.js
File was created | 1 | import { VantComponent } from '../common/component'; | |
2 | import { button } from '../mixins/button'; | ||
3 | import { openType } from '../mixins/open-type'; | ||
4 | VantComponent({ | ||
5 | mixins: [button, openType], | ||
6 | classes: ['hover-class', 'loading-class'], | ||
7 | data: { | ||
8 | style: '' | ||
9 | }, | ||
10 | props: { | ||
11 | icon: String, | ||
12 | plain: Boolean, | ||
13 | block: Boolean, | ||
14 | round: Boolean, | ||
15 | square: Boolean, | ||
16 | loading: Boolean, | ||
17 | hairline: Boolean, | ||
18 | disabled: Boolean, | ||
19 | loadingText: String, | ||
20 | customStyle: String, | ||
21 | loadingType: { | ||
22 | type: String, | ||
23 | value: 'circular' | ||
24 | }, | ||
25 | type: { | ||
26 | type: String, | ||
27 | value: 'default' | ||
28 | }, | ||
29 | size: { | ||
30 | type: String, | ||
31 | value: 'normal' | ||
32 | }, | ||
33 | loadingSize: { | ||
34 | type: String, | ||
35 | value: '20px' | ||
36 | }, | ||
37 | color: { | ||
38 | type: String, | ||
39 | observer(color) { | ||
40 | let style = ''; | ||
41 | if (color) { | ||
42 | style += `color: ${this.data.plain ? color : 'white'};`; | ||
43 | if (!this.data.plain) { | ||
44 | // Use background instead of backgroundColor to make linear-gradient work | ||
45 | style += `background: ${color};`; | ||
46 | } | ||
47 | // hide border when color is linear-gradient | ||
48 | if (color.indexOf('gradient') !== -1) { | ||
49 | style += 'border: 0;'; | ||
50 | } | ||
51 | else { | ||
52 | style += `border-color: ${color};`; | ||
53 | } | ||
54 | } | ||
55 | if (style !== this.data.style) { | ||
56 | this.setData({ style }); | ||
57 | } | ||
58 | } | ||
59 | } | ||
60 | }, | ||
61 | methods: { | ||
62 | onClick() { | ||
63 | if (!this.data.disabled && !this.data.loading) { | ||
64 | this.$emit('click'); | ||
65 | } | ||
66 | } | ||
67 | } | ||
68 | }); | ||
69 |
src/wxcomponents/vant/button/index.json
File was created | 1 | { | |
2 | "component": true, | ||
3 | "usingComponents": { | ||
4 | "van-icon": "../icon/index", | ||
5 | "van-loading": "../loading/index" | ||
6 | } | ||
7 | } | ||
8 |
src/wxcomponents/vant/button/index.vue
File was created | 1 | <template> | |
2 | <uni-shadow-root class="vant-button-index"><button :id="id" :class="'custom-class '+(utils.bem('button', [type, size, { block, round, plain, square, loading, disabled, hairline, unclickable: disabled || loading }]))+' '+(hairline ? 'van-hairline--surround' : '')" hover-class="van-button--active hover-class" :lang="lang" :style="(style)+' '+(customStyle)" :open-type="openType" :business-id="businessId" :session-from="sessionFrom" :send-message-title="sendMessageTitle" :send-message-path="sendMessagePath" :send-message-img="sendMessageImg" :show-message-card="showMessageCard" :app-parameter="appParameter" :aria-label="ariaLabel" @click="onClick" @getuserinfo="bindGetUserInfo" @contact="bindContact" @getphonenumber="bindGetPhoneNumber" @error="bindError" @launchapp="bindLaunchApp" @opensetting="bindOpenSetting"> | ||
3 | <block v-if="loading"> | ||
4 | <van-loading custom-class="loading-class" :size="loadingSize" :type="loadingType" :color="type === 'default' ? '#c9c9c9' : 'white'"></van-loading> | ||
5 | <view v-if="loadingText" class="van-button__loading-text"> | ||
6 | {{ loadingText }} | ||
7 | </view> | ||
8 | </block> | ||
9 | <block v-else> | ||
10 | <van-icon v-if="icon" size="1.2em" :name="icon" class="van-button__icon" custom-style="line-height: inherit;"></van-icon> | ||
11 | <view class="van-button__text"> | ||
12 | <slot></slot> | ||
13 | </view> | ||
14 | </block> | ||
15 | </button></uni-shadow-root> | ||
16 | </template> | ||
17 | <wxs src="../wxs/utils.wxs" module="utils"></wxs> | ||
18 | <script> | ||
19 | import VanIcon from '../icon/index.vue' | ||
20 | import VanLoading from '../loading/index.vue' | ||
21 | global['__wxVueOptions'] = {components:{'van-icon': VanIcon,'van-loading': VanLoading}} | ||
22 | |||
23 | global['__wxRoute'] = 'vant/button/index' | ||
24 | import { VantComponent } from '../common/component'; | ||
25 | import { button } from '../mixins/button'; | ||
26 | import { openType } from '../mixins/open-type'; | ||
27 | VantComponent({ | ||
28 | mixins: [button, openType], | ||
29 | classes: ['hover-class', 'loading-class'], | ||
30 | data: { | ||
31 | style: '' | ||
32 | }, | ||
33 | props: { | ||
34 | icon: String, | ||
35 | plain: Boolean, | ||
36 | block: Boolean, | ||
37 | round: Boolean, | ||
38 | square: Boolean, | ||
39 | loading: Boolean, | ||
40 | hairline: Boolean, | ||
41 | disabled: Boolean, | ||
42 | loadingText: String, | ||
43 | customStyle: String, | ||
44 | loadingType: { | ||
45 | type: String, | ||
46 | value: 'circular' | ||
47 | }, | ||
48 | type: { | ||
49 | type: String, | ||
50 | value: 'default' | ||
51 | }, | ||
52 | size: { | ||
53 | type: String, | ||
54 | value: 'normal' | ||
55 | }, | ||
56 | loadingSize: { | ||
57 | type: String, | ||
58 | value: '20px' | ||
59 | }, | ||
60 | color: { | ||
61 | type: String, | ||
62 | observer(color) { | ||
63 | let style = ''; | ||
64 | if (color) { | ||
65 | style += `color: ${this.data.plain ? color : 'white'};`; | ||
66 | if (!this.data.plain) { | ||
67 | // Use background instead of backgroundColor to make linear-gradient work | ||
68 | style += `background: ${color};`; | ||
69 | } | ||
70 | // hide border when color is linear-gradient | ||
71 | if (color.indexOf('gradient') !== -1) { | ||
72 | style += 'border: 0;'; | ||
73 | } | ||
74 | else { | ||
75 | style += `border-color: ${color};`; | ||
76 | } | ||
77 | } | ||
78 | if (style !== this.data.style) { | ||
79 | this.setData({ style }); | ||
80 | } | ||
81 | } | ||
82 | } | ||
83 | }, | ||
84 | methods: { | ||
85 | onClick() { | ||
86 | if (!this.data.disabled && !this.data.loading) { | ||
87 | this.$emit('click'); | ||
88 | } | ||
89 | } | ||
90 | } | ||
91 | }); | ||
92 | export default global['__wxComponents']['vant/button/index'] | ||
93 | </script> | ||
94 | <style platform="mp-weixin"> | ||
95 | @import '../common/index.css';.van-button{position:relative;display:-webkit-inline-flex;display:inline-flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;box-sizing:border-box;padding:0;line-height:20px;text-align:center;vertical-align:middle;-webkit-appearance:none;-webkit-text-size-adjust:100%;height:44px;height:var(--button-default-height,44px);font-size:16px;font-size:var(--button-default-font-size,16px);transition:opacity .2s;transition:opacity var(--animation-duration-fast,.2s);border-radius:2px;border-radius:var(--button-border-radius,2px)}.van-button:before{position:absolute;top:50%;left:50%;width:100%;height:100%;border:inherit;border-radius:inherit;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);opacity:0;content:" ";background-color:#000;background-color:var(--black,#000);border-color:#000;border-color:var(--black,#000)}.van-button:after{border-width:0}.van-button--active:before{opacity:.15}.van-button--unclickable:after{display:none}.van-button--default{color:#323233;color:var(--button-default-color,#323233);background-color:#fff;background-color:var(--button-default-background-color,#fff);border:1px solid #ebedf0;border:1px solid var(--button-default-border-color,#ebedf0)}.van-button--primary{color:#fff;color:var(--button-primary-color,#fff);background-color:#07c160;background-color:var(--button-primary-background-color,#07c160);border:1px solid #07c160;border:1px solid var(--button-primary-border-color,#07c160)}.van-button--info{color:#fff;color:var(--button-info-color,#fff);background-color:#1989fa;background-color:var(--button-info-background-color,#1989fa);border:1px solid #1989fa;border:1px solid var(--button-info-border-color,#1989fa)}.van-button--danger{color:#fff;color:var(--button-danger-color,#fff);background-color:#ee0a24;background-color:var(--button-danger-background-color,#ee0a24);border:1px solid #ee0a24;border:1px solid var(--button-danger-border-color,#ee0a24)}.van-button--warning{color:#fff;color:var(--button-warning-color,#fff);background-color:#ff976a;background-color:var(--button-warning-background-color,#ff976a);border:1px solid #ff976a;border:1px solid var(--button-warning-border-color,#ff976a)}.van-button--plain{background-color:#fff;background-color:var(--button-plain-background-color,#fff)}.van-button--plain.van-button--primary{color:#07c160;color:var(--button-primary-background-color,#07c160)}.van-button--plain.van-button--info{color:#1989fa;color:var(--button-info-background-color,#1989fa)}.van-button--plain.van-button--danger{color:#ee0a24;color:var(--button-danger-background-color,#ee0a24)}.van-button--plain.van-button--warning{color:#ff976a;color:var(--button-warning-background-color,#ff976a)}.van-button--large{width:100%;height:50px;height:var(--button-large-height,50px)}.van-button--normal{padding:0 15px;font-size:14px;font-size:var(--button-normal-font-size,14px)}.van-button--small{min-width:60px;min-width:var(--button-small-min-width,60px);height:30px;height:var(--button-small-height,30px);padding:0 8px;padding:0 var(--padding-xs,8px);font-size:12px;font-size:var(--button-small-font-size,12px)}.van-button--mini{display:inline-block;min-width:50px;min-width:var(--button-mini-min-width,50px);height:22px;height:var(--button-mini-height,22px);font-size:10px;font-size:var(--button-mini-font-size,10px)}.van-button--mini+.van-button--mini{margin-left:5px}.van-button--block{display:-webkit-flex;display:flex;width:100%}.van-button--round{border-radius:999px;border-radius:var(--button-round-border-radius,999px)}.van-button--square{border-radius:0}.van-button--disabled{opacity:.5;opacity:var(--button-disabled-opacity,.5)}.van-button__text{display:inline}.van-button__icon+.van-button__text:not(:empty),.van-button__loading-text{margin-left:4px}.van-button__icon{min-width:1em;line-height:inherit!important;vertical-align:top}.van-button--hairline{padding-top:1px;border-width:0}.van-button--hairline:after{border-color:inherit;border-width:1px;border-radius:4px;border-radius:calc(var(--button-border-radius, 2px)*2)}.van-button--hairline.van-button--round:after{border-radius:999px;border-radius:var(--button-round-border-radius,999px)}.van-button--hairline.van-button--square:after{border-radius:0} | ||
96 | </style> |
src/wxcomponents/vant/button/index.wxml
File was created | 1 | <wxs src="../wxs/utils.wxs" module="utils" /> | |
2 | |||
3 | <button | ||
4 | id="{{ id }}" | ||
5 | class="custom-class {{ utils.bem('button', [type, size, { block, round, plain, square, loading, disabled, hairline, unclickable: disabled || loading }]) }} {{ hairline ? 'van-hairline--surround' : '' }}" | ||
6 | hover-class="van-button--active hover-class" | ||
7 | lang="{{ lang }}" | ||
8 | style="{{ style }} {{ customStyle }}" | ||
9 | open-type="{{ openType }}" | ||
10 | business-id="{{ businessId }}" | ||
11 | session-from="{{ sessionFrom }}" | ||
12 | send-message-title="{{ sendMessageTitle }}" | ||
13 | send-message-path="{{ sendMessagePath }}" | ||
14 | send-message-img="{{ sendMessageImg }}" | ||
15 | show-message-card="{{ showMessageCard }}" | ||
16 | app-parameter="{{ appParameter }}" | ||
17 | aria-label="{{ ariaLabel }}" | ||
18 | bindtap="onClick" | ||
19 | bindgetuserinfo="bindGetUserInfo" | ||
20 | bindcontact="bindContact" | ||
21 | bindgetphonenumber="bindGetPhoneNumber" | ||
22 | binderror="bindError" | ||
23 | bindlaunchapp="bindLaunchApp" | ||
24 | bindopensetting="bindOpenSetting" | ||
25 | > | ||
26 | <block wx:if="{{ loading }}"> | ||
27 | <van-loading | ||
28 | custom-class="loading-class" | ||
29 | size="{{ loadingSize }}" | ||
30 | type="{{ loadingType }}" | ||
31 | color="{{ type === 'default' ? '#c9c9c9' : 'white' }}" | ||
32 | /> | ||
33 | <view | ||
34 | wx:if="{{ loadingText }}" | ||
35 | class="van-button__loading-text" | ||
36 | > | ||
37 | {{ loadingText }} | ||
38 | </view> | ||
39 | </block> | ||
40 | <block wx:else> | ||
41 | <van-icon | ||
42 | wx:if="{{ icon }}" | ||
43 | size="1.2em" | ||
44 | name="{{ icon }}" | ||
45 | class="van-button__icon" | ||
46 | custom-style="line-height: inherit;" | ||
47 | /> | ||
48 | <view class="van-button__text"> | ||
49 | <slot /> | ||
50 | </view> | ||
51 | </block> | ||
52 | </button> | ||
53 |
src/wxcomponents/vant/button/index.wxss
File was created | 1 | @import '../common/index.wxss';.van-button{position:relative;display:-webkit-inline-flex;display:inline-flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;box-sizing:border-box;padding:0;line-height:20px;text-align:center;vertical-align:middle;-webkit-appearance:none;-webkit-text-size-adjust:100%;height:44px;height:var(--button-default-height,44px);font-size:16px;font-size:var(--button-default-font-size,16px);transition:opacity .2s;transition:opacity var(--animation-duration-fast,.2s);border-radius:2px;border-radius:var(--button-border-radius,2px)}.van-button:before{position:absolute;top:50%;left:50%;width:100%;height:100%;border:inherit;border-radius:inherit;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);opacity:0;content:" ";background-color:#000;background-color:var(--black,#000);border-color:#000;border-color:var(--black,#000)}.van-button:after{border-width:0}.van-button--active:before{opacity:.15}.van-button--unclickable:after{display:none}.van-button--default{color:#323233;color:var(--button-default-color,#323233);background-color:#fff;background-color:var(--button-default-background-color,#fff);border:1px solid #ebedf0;border:1px solid var(--button-default-border-color,#ebedf0)}.van-button--primary{color:#fff;color:var(--button-primary-color,#fff);background-color:#07c160;background-color:var(--button-primary-background-color,#07c160);border:1px solid #07c160;border:1px solid var(--button-primary-border-color,#07c160)}.van-button--info{color:#fff;color:var(--button-info-color,#fff);background-color:#1989fa;background-color:var(--button-info-background-color,#1989fa);border:1px solid #1989fa;border:1px solid var(--button-info-border-color,#1989fa)}.van-button--danger{color:#fff;color:var(--button-danger-color,#fff);background-color:#ee0a24;background-color:var(--button-danger-background-color,#ee0a24);border:1px solid #ee0a24;border:1px solid var(--button-danger-border-color,#ee0a24)}.van-button--warning{color:#fff;color:var(--button-warning-color,#fff);background-color:#ff976a;background-color:var(--button-warning-background-color,#ff976a);border:1px solid #ff976a;border:1px solid var(--button-warning-border-color,#ff976a)}.van-button--plain{background-color:#fff;background-color:var(--button-plain-background-color,#fff)}.van-button--plain.van-button--primary{color:#07c160;color:var(--button-primary-background-color,#07c160)}.van-button--plain.van-button--info{color:#1989fa;color:var(--button-info-background-color,#1989fa)}.van-button--plain.van-button--danger{color:#ee0a24;color:var(--button-danger-background-color,#ee0a24)}.van-button--plain.van-button--warning{color:#ff976a;color:var(--button-warning-background-color,#ff976a)}.van-button--large{width:100%;height:50px;height:var(--button-large-height,50px)}.van-button--normal{padding:0 15px;font-size:14px;font-size:var(--button-normal-font-size,14px)}.van-button--small{min-width:60px;min-width:var(--button-small-min-width,60px);height:30px;height:var(--button-small-height,30px);padding:0 8px;padding:0 var(--padding-xs,8px);font-size:12px;font-size:var(--button-small-font-size,12px)}.van-button--mini{display:inline-block;min-width:50px;min-width:var(--button-mini-min-width,50px);height:22px;height:var(--button-mini-height,22px);font-size:10px;font-size:var(--button-mini-font-size,10px)}.van-button--mini+.van-button--mini{margin-left:5px}.van-button--block{display:-webkit-flex;display:flex;width:100%}.van-button--round{border-radius:999px;border-radius:var(--button-round-border-radius,999px)}.van-button--square{border-radius:0}.van-button--disabled{opacity:.5;opacity:var(--button-disabled-opacity,.5)}.van-button__text{display:inline}.van-button__icon+.van-button__text:not(:empty),.van-button__loading-text{margin-left:4px}.van-button__icon{min-width:1em;line-height:inherit!important;vertical-align:top}.van-button--hairline{padding-top:1px;border-width:0}.van-button--hairline:after{border-color:inherit;border-width:1px;border-radius:4px;border-radius:calc(var(--button-border-radius, 2px)*2)}.van-button--hairline.van-button--round:after{border-radius:999px;border-radius:var(--button-round-border-radius,999px)}.van-button--hairline.van-button--square:after{border-radius:0} |
src/wxcomponents/vant/common/color.d.ts
File was created | 1 | export declare const RED = "#ee0a24"; | |
2 | export declare const BLUE = "#1989fa"; | ||
3 | export declare const WHITE = "#fff"; | ||
4 | export declare const GREEN = "#07c160"; | ||
5 | export declare const ORANGE = "#ff976a"; | ||
6 | export declare const GRAY = "#323233"; | ||
7 | export declare const GRAY_DARK = "#969799"; | ||
8 |
src/wxcomponents/vant/common/color.js
File was created | 1 | export const RED = '#ee0a24'; | |
2 | export const BLUE = '#1989fa'; | ||
3 | export const WHITE = '#fff'; | ||
4 | export const GREEN = '#07c160'; | ||
5 | export const ORANGE = '#ff976a'; | ||
6 | export const GRAY = '#323233'; | ||
7 | export const GRAY_DARK = '#969799'; | ||
8 |
src/wxcomponents/vant/common/component.d.ts
File was created | 1 | import { VantComponentOptions, CombinedComponentInstance } from '../definitions/index'; | |
2 | declare function VantComponent<Data, Props, Methods>(vantOptions?: VantComponentOptions<Data, Props, Methods, CombinedComponentInstance<Data, Props, Methods>>): void; | ||
3 | export { VantComponent }; | ||
4 |
src/wxcomponents/vant/common/component.js
File was created | 1 | import { basic } from '../mixins/basic'; | |
2 | import { observe } from '../mixins/observer/index'; | ||
3 | function mapKeys(source, target, map) { | ||
4 | Object.keys(map).forEach(key => { | ||
5 | if (source[key]) { | ||
6 | target[map[key]] = source[key]; | ||
7 | } | ||
8 | }); | ||
9 | } | ||
10 | function VantComponent(vantOptions = {}) { | ||
11 | const options = {}; | ||
12 | mapKeys(vantOptions, options, { | ||
13 | data: 'data', | ||
14 | props: 'properties', | ||
15 | mixins: 'behaviors', | ||
16 | methods: 'methods', | ||
17 | beforeCreate: 'created', | ||
18 | created: 'attached', | ||
19 | mounted: 'ready', | ||
20 | relations: 'relations', | ||
21 | destroyed: 'detached', | ||
22 | classes: 'externalClasses' | ||
23 | }); | ||
24 | const { relation } = vantOptions; | ||
25 | if (relation) { | ||
26 | options.relations = Object.assign(options.relations || {}, { | ||
27 | [`../${relation.name}/index`]: relation | ||
28 | }); | ||
29 | } | ||
30 | // add default externalClasses | ||
31 | options.externalClasses = options.externalClasses || []; | ||
32 | options.externalClasses.push('custom-class'); | ||
33 | // add default behaviors | ||
34 | options.behaviors = options.behaviors || []; | ||
35 | options.behaviors.push(basic); | ||
36 | // map field to form-field behavior | ||
37 | if (vantOptions.field) { | ||
38 | options.behaviors.push('wx://form-field'); | ||
39 | } | ||
40 | // add default options | ||
41 | options.options = { | ||
42 | multipleSlots: true, | ||
43 | addGlobalClass: true | ||
44 | }; | ||
45 | observe(vantOptions, options); | ||
46 | Component(options); | ||
47 | } | ||
48 | export { VantComponent }; | ||
49 |
src/wxcomponents/vant/common/index.css
File was created | 1 | .van-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.van-multi-ellipsis--l2{-webkit-line-clamp:2}.van-multi-ellipsis--l2,.van-multi-ellipsis--l3{display:-webkit-box;overflow:hidden;text-overflow:ellipsis;-webkit-box-orient:vertical}.van-multi-ellipsis--l3{-webkit-line-clamp:3}.van-clearfix:after{display:table;clear:both;content:""}.van-hairline,.van-hairline--bottom,.van-hairline--left,.van-hairline--right,.van-hairline--surround,.van-hairline--top,.van-hairline--top-bottom{position:relative}.van-hairline--bottom:after,.van-hairline--left:after,.van-hairline--right:after,.van-hairline--surround:after,.van-hairline--top-bottom:after,.van-hairline--top:after,.van-hairline:after{position:absolute;box-sizing:border-box;-webkit-transform-origin:center;transform-origin:center;content:" ";pointer-events:none;top:-50%;right:-50%;bottom:-50%;left:-50%;border:0 solid #eee;-webkit-transform:scale(.5);transform:scale(.5)}.van-hairline--top:after{border-top-width:1px}.van-hairline--left:after{border-left-width:1px}.van-hairline--right:after{border-right-width:1px}.van-hairline--bottom:after{border-bottom-width:1px}.van-hairline--top-bottom:after{border-width:1px 0}.van-hairline--surround:after{border-width:1px} |
src/wxcomponents/vant/common/index.wxss
File was created | 1 | .van-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.van-multi-ellipsis--l2{-webkit-line-clamp:2}.van-multi-ellipsis--l2,.van-multi-ellipsis--l3{display:-webkit-box;overflow:hidden;text-overflow:ellipsis;-webkit-box-orient:vertical}.van-multi-ellipsis--l3{-webkit-line-clamp:3}.van-clearfix:after{display:table;clear:both;content:""}.van-hairline,.van-hairline--bottom,.van-hairline--left,.van-hairline--right,.van-hairline--surround,.van-hairline--top,.van-hairline--top-bottom{position:relative}.van-hairline--bottom:after,.van-hairline--left:after,.van-hairline--right:after,.van-hairline--surround:after,.van-hairline--top-bottom:after,.van-hairline--top:after,.van-hairline:after{position:absolute;box-sizing:border-box;-webkit-transform-origin:center;transform-origin:center;content:" ";pointer-events:none;top:-50%;right:-50%;bottom:-50%;left:-50%;border:0 solid #eee;-webkit-transform:scale(.5);transform:scale(.5)}.van-hairline--top:after{border-top-width:1px}.van-hairline--left:after{border-left-width:1px}.van-hairline--right:after{border-right-width:1px}.van-hairline--bottom:after{border-bottom-width:1px}.van-hairline--top-bottom:after{border-width:1px 0}.van-hairline--surround:after{border-width:1px} |
src/wxcomponents/vant/common/style/clearfix.css
File was created | 1 | .van-clearfix:after{display:table;clear:both;content:""} |
src/wxcomponents/vant/common/style/clearfix.wxss
File was created | 1 | .van-clearfix:after{display:table;clear:both;content:""} |
src/wxcomponents/vant/common/style/ellipsis.css
File was created | 1 | .van-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.van-multi-ellipsis--l2{-webkit-line-clamp:2}.van-multi-ellipsis--l2,.van-multi-ellipsis--l3{display:-webkit-box;overflow:hidden;text-overflow:ellipsis;-webkit-box-orient:vertical}.van-multi-ellipsis--l3{-webkit-line-clamp:3} |
src/wxcomponents/vant/common/style/ellipsis.wxss
File was created | 1 | .van-ellipsis{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.van-multi-ellipsis--l2{-webkit-line-clamp:2}.van-multi-ellipsis--l2,.van-multi-ellipsis--l3{display:-webkit-box;overflow:hidden;text-overflow:ellipsis;-webkit-box-orient:vertical}.van-multi-ellipsis--l3{-webkit-line-clamp:3} |
src/wxcomponents/vant/common/style/hairline.css
File was created | 1 | .van-hairline,.van-hairline--bottom,.van-hairline--left,.van-hairline--right,.van-hairline--surround,.van-hairline--top,.van-hairline--top-bottom{position:relative}.van-hairline--bottom:after,.van-hairline--left:after,.van-hairline--right:after,.van-hairline--surround:after,.van-hairline--top-bottom:after,.van-hairline--top:after,.van-hairline:after{position:absolute;box-sizing:border-box;-webkit-transform-origin:center;transform-origin:center;content:" ";pointer-events:none;top:-50%;right:-50%;bottom:-50%;left:-50%;border:0 solid #eee;-webkit-transform:scale(.5);transform:scale(.5)}.van-hairline--top:after{border-top-width:1px}.van-hairline--left:after{border-left-width:1px}.van-hairline--right:after{border-right-width:1px}.van-hairline--bottom:after{border-bottom-width:1px}.van-hairline--top-bottom:after{border-width:1px 0}.van-hairline--surround:after{border-width:1px} |
src/wxcomponents/vant/common/style/hairline.wxss
File was created | 1 | .van-hairline,.van-hairline--bottom,.van-hairline--left,.van-hairline--right,.van-hairline--surround,.van-hairline--top,.van-hairline--top-bottom{position:relative}.van-hairline--bottom:after,.van-hairline--left:after,.van-hairline--right:after,.van-hairline--surround:after,.van-hairline--top-bottom:after,.van-hairline--top:after,.van-hairline:after{position:absolute;box-sizing:border-box;-webkit-transform-origin:center;transform-origin:center;content:" ";pointer-events:none;top:-50%;right:-50%;bottom:-50%;left:-50%;border:0 solid #eee;-webkit-transform:scale(.5);transform:scale(.5)}.van-hairline--top:after{border-top-width:1px}.van-hairline--left:after{border-left-width:1px}.van-hairline--right:after{border-right-width:1px}.van-hairline--bottom:after{border-bottom-width:1px}.van-hairline--top-bottom:after{border-width:1px 0}.van-hairline--surround:after{border-width:1px} |
src/wxcomponents/vant/common/style/mixins/clearfix.css
src/wxcomponents/vant/common/style/mixins/clearfix.wxss
src/wxcomponents/vant/common/style/mixins/ellipsis.css
src/wxcomponents/vant/common/style/mixins/ellipsis.wxss
src/wxcomponents/vant/common/style/mixins/hairline.css
src/wxcomponents/vant/common/style/mixins/hairline.wxss
src/wxcomponents/vant/common/style/theme.css
src/wxcomponents/vant/common/style/theme.wxss
src/wxcomponents/vant/common/style/var.css
src/wxcomponents/vant/common/style/var.wxss
src/wxcomponents/vant/common/utils.d.ts
File was created | 1 | /// <reference types="miniprogram-api-typings" /> | |
2 | export declare function isDef(value: any): boolean; | ||
3 | export declare function isObj(x: any): boolean; | ||
4 | export declare function isNumber(value: any): boolean; | ||
5 | export declare function range(num: number, min: number, max: number): number; | ||
6 | export declare function nextTick(fn: Function): void; | ||
7 | export declare function getSystemInfoSync(): WechatMiniprogram.GetSystemInfoSuccessCallbackResult; | ||
8 | export declare function addUnit(value?: string | number): string | undefined; | ||
9 |
src/wxcomponents/vant/common/utils.js
File was created | 1 | export function isDef(value) { | |
2 | return value !== undefined && value !== null; | ||
3 | } | ||
4 | export function isObj(x) { | ||
5 | const type = typeof x; | ||
6 | return x !== null && (type === 'object' || type === 'function'); | ||
7 | } | ||
8 | export function isNumber(value) { | ||
9 | return /^\d+(\.\d+)?$/.test(value); | ||
10 | } | ||
11 | export function range(num, min, max) { | ||
12 | return Math.min(Math.max(num, min), max); | ||
13 | } | ||
14 | export function nextTick(fn) { | ||
15 | setTimeout(() => { | ||
16 | fn(); | ||
17 | }, 1000 / 30); | ||
18 | } | ||
19 | let systemInfo = null; | ||
20 | export function getSystemInfoSync() { | ||
21 | if (systemInfo == null) { | ||
22 | systemInfo = wx.getSystemInfoSync(); | ||
23 | } | ||
24 | return systemInfo; | ||
25 | } | ||
26 | export function addUnit(value) { | ||
27 | if (!isDef(value)) { | ||
28 | return undefined; | ||
29 | } | ||
30 | value = String(value); | ||
31 | return isNumber(value) ? `${value}px` : value; | ||
32 | } | ||
33 |
src/wxcomponents/vant/icon/index.d.ts
File was created | 1 | export {}; | |
2 |
src/wxcomponents/vant/icon/index.js
File was created | 1 | import { VantComponent } from '../common/component'; | |
2 | import { addUnit } from '../common/utils'; | ||
3 | VantComponent({ | ||
4 | props: { | ||
5 | dot: Boolean, | ||
6 | info: null, | ||
7 | size: { | ||
8 | type: null, | ||
9 | observer: 'setSizeWithUnit' | ||
10 | }, | ||
11 | color: String, | ||
12 | customStyle: String, | ||
13 | classPrefix: { | ||
14 | type: String, | ||
15 | value: 'van-icon' | ||
16 | }, | ||
17 | name: { | ||
18 | type: String, | ||
19 | observer(val) { | ||
20 | this.setData({ | ||
21 | isImageName: val.indexOf('/') !== -1 | ||
22 | }); | ||
23 | } | ||
24 | } | ||
25 | }, | ||
26 | data: { | ||
27 | sizeWithUnit: null, | ||
28 | }, | ||
29 | methods: { | ||
30 | onClick() { | ||
31 | this.$emit('click'); | ||
32 | }, | ||
33 | setSizeWithUnit(size) { | ||
34 | this.setData({ | ||
35 | sizeWithUnit: addUnit(size) | ||
36 | }); | ||
37 | } | ||
38 | } | ||
39 | }); | ||
40 |
src/wxcomponents/vant/icon/index.json
File was created | 1 | { | |
2 | "component": true, | ||
3 | "usingComponents": { | ||
4 | "van-info": "../info/index" | ||
5 | } | ||
6 | } | ||
7 |
src/wxcomponents/vant/icon/index.vue
File was created | 1 | <template> | |
2 | <uni-shadow-root class="vant-icon-index"><view :class="'custom-class '+(classPrefix)+' '+(isImageName ? 'van-icon--image' : classPrefix + '-' + name)" :style="(color ? 'color: ' + color + ';' : '')+(size ? 'font-size: ' + sizeWithUnit + ';' : '')+(customStyle)" @click="onClick"> | ||
3 | <van-info v-if="info !== null || dot" :dot="dot" :info="info" custom-class="van-icon__info"></van-info> | ||
4 | <image v-if="isImageName" :src="name" mode="aspectFit" class="van-icon__image"></image> | ||
5 | </view></uni-shadow-root> | ||
6 | </template> | ||
7 | |||
8 | <script> | ||
9 | import VanInfo from '../info/index.vue' | ||
10 | global['__wxVueOptions'] = {components:{'van-info': VanInfo}} | ||
11 | |||
12 | global['__wxRoute'] = 'vant/icon/index' | ||
13 | import { VantComponent } from '../common/component'; | ||
14 | import { addUnit } from '../common/utils'; | ||
15 | VantComponent({ | ||
16 | props: { | ||
17 | dot: Boolean, | ||
18 | info: null, | ||
19 | size: { | ||
20 | type: null, | ||
21 | observer: 'setSizeWithUnit' | ||
22 | }, | ||
23 | color: String, | ||
24 | customStyle: String, | ||
25 | classPrefix: { | ||
26 | type: String, | ||
27 | value: 'van-icon' | ||
28 | }, | ||
29 | name: { | ||
30 | type: String, | ||
31 | observer(val) { | ||
32 | this.setData({ | ||
33 | isImageName: val.indexOf('/') !== -1 | ||
34 | }); | ||
35 | } | ||
36 | } | ||
37 | }, | ||
38 | data: { | ||
39 | sizeWithUnit: null, | ||
40 | }, | ||
41 | methods: { | ||
42 | onClick() { | ||
43 | this.$emit('click'); | ||
44 | }, | ||
45 | setSizeWithUnit(size) { | ||
46 | this.setData({ | ||
47 | sizeWithUnit: addUnit(size) | ||
48 | }); | ||
49 | } | ||
50 | } | ||
51 | }); | ||
52 | export default global['__wxComponents']['vant/icon/index'] | ||
53 | </script> | ||
54 | <style platform="mp-weixin"> | ||
55 | @import '../common/index.css'; | ||
56 | |||
57 | @font-face { | ||
58 | font-weight: 400; | ||
59 | font-family: vant-icon; | ||
60 | font-style: normal; | ||
61 | font-display: auto; | ||
62 | src: url(https://img.yzcdn.cn/vant/vant-icon-d3825a.woff2) format("woff2"), url(https://img.yzcdn.cn/vant/vant-icon-d3825a.woff) format("woff"), url(https://img.yzcdn.cn/vant/vant-icon-d3825a.ttf) format("truetype") | ||
63 | } | ||
64 | |||
65 | .van-icon { | ||
66 | position: relative; | ||
67 | font: normal normal normal 14px/1 vant-icon; | ||
68 | font-size: inherit; | ||
69 | text-rendering: auto; | ||
70 | -webkit-font-smoothing: antialiased | ||
71 | } | ||
72 | |||
73 | .van-icon, | ||
74 | .van-icon:before { | ||
75 | display: inline-block | ||
76 | } | ||
77 | |||
78 | .van-icon-add-o:before { | ||
79 | content: "\F000" | ||
80 | } | ||
81 | |||
82 | .van-icon-add-square:before { | ||
83 | content: "\F001" | ||
84 | } | ||
85 | |||
86 | .van-icon-add:before { | ||
87 | content: "\F002" | ||
88 | } | ||
89 | |||
90 | .van-icon-after-sale:before { | ||
91 | content: "\F003" | ||
92 | } | ||
93 | |||
94 | .van-icon-aim:before { | ||
95 | content: "\F004" | ||
96 | } | ||
97 | |||
98 | .van-icon-alipay:before { | ||
99 | content: "\F005" | ||
100 | } | ||
101 | |||
102 | .van-icon-apps-o:before { | ||
103 | content: "\F006" | ||
104 | } | ||
105 | |||
106 | .van-icon-arrow-down:before { | ||
107 | content: "\F007" | ||
108 | } | ||
109 | |||
110 | .van-icon-arrow-left:before { | ||
111 | content: "\F008" | ||
112 | } | ||
113 | |||
114 | .van-icon-arrow-up:before { | ||
115 | content: "\F009" | ||
116 | } | ||
117 | |||
118 | .van-icon-arrow:before { | ||
119 | content: "\F00A" | ||
120 | } | ||
121 | |||
122 | .van-icon-ascending:before { | ||
123 | content: "\F00B" | ||
124 | } | ||
125 | |||
126 | .van-icon-audio:before { | ||
127 | content: "\F00C" | ||
128 | } | ||
129 | |||
130 | .van-icon-award-o:before { | ||
131 | content: "\F00D" | ||
132 | } | ||
133 | |||
134 | .van-icon-award:before { | ||
135 | content: "\F00E" | ||
136 | } | ||
137 | |||
138 | .van-icon-bag-o:before { | ||
139 | content: "\F00F" | ||
140 | } | ||
141 | |||
142 | .van-icon-bag:before { | ||
143 | content: "\F010" | ||
144 | } | ||
145 | |||
146 | .van-icon-balance-list-o:before { | ||
147 | content: "\F011" | ||
148 | } | ||
149 | |||
150 | .van-icon-balance-list:before { | ||
151 | content: "\F012" | ||
152 | } | ||
153 | |||
154 | .van-icon-balance-o:before { | ||
155 | content: "\F013" | ||
156 | } | ||
157 | |||
158 | .van-icon-balance-pay:before { | ||
159 | content: "\F014" | ||
160 | } | ||
161 | |||
162 | .van-icon-bar-chart-o:before { | ||
163 | content: "\F015" | ||
164 | } | ||
165 | |||
166 | .van-icon-bars:before { | ||
167 | content: "\F016" | ||
168 | } | ||
169 | |||
170 | .van-icon-bell:before { | ||
171 | content: "\F017" | ||
172 | } | ||
173 | |||
174 | .van-icon-bill-o:before { | ||
175 | content: "\F018" | ||
176 | } | ||
177 | |||
178 | .van-icon-bill:before { | ||
179 | content: "\F019" | ||
180 | } | ||
181 | |||
182 | .van-icon-birthday-cake-o:before { | ||
183 | content: "\F01A" | ||
184 | } | ||
185 | |||
186 | .van-icon-bookmark-o:before { | ||
187 | content: "\F01B" | ||
188 | } | ||
189 | |||
190 | .van-icon-bookmark:before { | ||
191 | content: "\F01C" | ||
192 | } | ||
193 | |||
194 | .van-icon-browsing-history-o:before { | ||
195 | content: "\F01D" | ||
196 | } | ||
197 | |||
198 | .van-icon-browsing-history:before { | ||
199 | content: "\F01E" | ||
200 | } | ||
201 | |||
202 | .van-icon-brush-o:before { | ||
203 | content: "\F01F" | ||
204 | } | ||
205 | |||
206 | .van-icon-bulb-o:before { | ||
207 | content: "\F020" | ||
208 | } | ||
209 | |||
210 | .van-icon-bullhorn-o:before { | ||
211 | content: "\F021" | ||
212 | } | ||
213 | |||
214 | .van-icon-calender-o:before { | ||
215 | content: "\F022" | ||
216 | } | ||
217 | |||
218 | .van-icon-card:before { | ||
219 | content: "\F023" | ||
220 | } | ||
221 | |||
222 | .van-icon-cart-circle-o:before { | ||
223 | content: "\F024" | ||
224 | } | ||
225 | |||
226 | .van-icon-cart-circle:before { | ||
227 | content: "\F025" | ||
228 | } | ||
229 | |||
230 | .van-icon-cart-o:before { | ||
231 | content: "\F026" | ||
232 | } | ||
233 | |||
234 | .van-icon-cart:before { | ||
235 | content: "\F027" | ||
236 | } | ||
237 | |||
238 | .van-icon-cash-back-record:before { | ||
239 | content: "\F028" | ||
240 | } | ||
241 | |||
242 | .van-icon-cash-on-deliver:before { | ||
243 | content: "\F029" | ||
244 | } | ||
245 | |||
246 | .van-icon-cashier-o:before { | ||
247 | content: "\F02A" | ||
248 | } | ||
249 | |||
250 | .van-icon-certificate:before { | ||
251 | content: "\F02B" | ||
252 | } | ||
253 | |||
254 | .van-icon-chart-trending-o:before { | ||
255 | content: "\F02C" | ||
256 | } | ||
257 | |||
258 | .van-icon-chat-o:before { | ||
259 | content: "\F02D" | ||
260 | } | ||
261 | |||
262 | .van-icon-chat:before { | ||
263 | content: "\F02E" | ||
264 | } | ||
265 | |||
266 | .van-icon-checked:before { | ||
267 | content: "\F02F" | ||
268 | } | ||
269 | |||
270 | .van-icon-circle:before { | ||
271 | content: "\F030" | ||
272 | } | ||
273 | |||
274 | .van-icon-clear:before { | ||
275 | content: "\F031" | ||
276 | } | ||
277 | |||
278 | .van-icon-clock-o:before { | ||
279 | content: "\F032" | ||
280 | } | ||
281 | |||
282 | .van-icon-clock:before { | ||
283 | content: "\F033" | ||
284 | } | ||
285 | |||
286 | .van-icon-close:before { | ||
287 | content: "\F034" | ||
288 | } | ||
289 | |||
290 | .van-icon-closed-eye:before { | ||
291 | content: "\F035" | ||
292 | } | ||
293 | |||
294 | .van-icon-cluster-o:before { | ||
295 | content: "\F036" | ||
296 | } | ||
297 | |||
298 | .van-icon-cluster:before { | ||
299 | content: "\F037" | ||
300 | } | ||
301 | |||
302 | .van-icon-column:before { | ||
303 | content: "\F038" | ||
304 | } | ||
305 | |||
306 | .van-icon-comment-circle-o:before { | ||
307 | content: "\F039" | ||
308 | } | ||
309 | |||
310 | .van-icon-comment-circle:before { | ||
311 | content: "\F03A" | ||
312 | } | ||
313 | |||
314 | .van-icon-comment-o:before { | ||
315 | content: "\F03B" | ||
316 | } | ||
317 | |||
318 | .van-icon-comment:before { | ||
319 | content: "\F03C" | ||
320 | } | ||
321 | |||
322 | .van-icon-completed:before { | ||
323 | content: "\F03D" | ||
324 | } | ||
325 | |||
326 | .van-icon-contact:before { | ||
327 | content: "\F03E" | ||
328 | } | ||
329 | |||
330 | .van-icon-coupon-o:before { | ||
331 | content: "\F03F" | ||
332 | } | ||
333 | |||
334 | .van-icon-coupon:before { | ||
335 | content: "\F040" | ||
336 | } | ||
337 | |||
338 | .van-icon-credit-pay:before { | ||
339 | content: "\F041" | ||
340 | } | ||
341 | |||
342 | .van-icon-cross:before { | ||
343 | content: "\F042" | ||
344 | } | ||
345 | |||
346 | .van-icon-debit-pay:before { | ||
347 | content: "\F043" | ||
348 | } | ||
349 | |||
350 | .van-icon-delete:before { | ||
351 | content: "\F044" | ||
352 | } | ||
353 | |||
354 | .van-icon-descending:before { | ||
355 | content: "\F045" | ||
356 | } | ||
357 | |||
358 | .van-icon-description:before { | ||
359 | content: "\F046" | ||
360 | } | ||
361 | |||
362 | .van-icon-desktop-o:before { | ||
363 | content: "\F047" | ||
364 | } | ||
365 | |||
366 | .van-icon-diamond-o:before { | ||
367 | content: "\F048" | ||
368 | } | ||
369 | |||
370 | .van-icon-diamond:before { | ||
371 | content: "\F049" | ||
372 | } | ||
373 | |||
374 | .van-icon-discount:before { | ||
375 | content: "\F04A" | ||
376 | } | ||
377 | |||
378 | .van-icon-down:before { | ||
379 | content: "\F04B" | ||
380 | } | ||
381 | |||
382 | .van-icon-ecard-pay:before { | ||
383 | content: "\F04C" | ||
384 | } | ||
385 | |||
386 | .van-icon-edit:before { | ||
387 | content: "\F04D" | ||
388 | } | ||
389 | |||
390 | .van-icon-ellipsis:before { | ||
391 | content: "\F04E" | ||
392 | } | ||
393 | |||
394 | .van-icon-empty:before { | ||
395 | content: "\F04F" | ||
396 | } | ||
397 | |||
398 | .van-icon-envelop-o:before { | ||
399 | content: "\F050" | ||
400 | } | ||
401 | |||
402 | .van-icon-exchange:before { | ||
403 | content: "\F051" | ||
404 | } | ||
405 | |||
406 | .van-icon-expand-o:before { | ||
407 | content: "\F052" | ||
408 | } | ||
409 | |||
410 | .van-icon-expand:before { | ||
411 | content: "\F053" | ||
412 | } | ||
413 | |||
414 | .van-icon-eye-o:before { | ||
415 | content: "\F054" | ||
416 | } | ||
417 | |||
418 | .van-icon-eye:before { | ||
419 | content: "\F055" | ||
420 | } | ||
421 | |||
422 | .van-icon-fail:before { | ||
423 | content: "\F056" | ||
424 | } | ||
425 | |||
426 | .van-icon-failure:before { | ||
427 | content: "\F057" | ||
428 | } | ||
429 | |||
430 | .van-icon-filter-o:before { | ||
431 | content: "\F058" | ||
432 | } | ||
433 | |||
434 | .van-icon-fire-o:before { | ||
435 | content: "\F059" | ||
436 | } | ||
437 | |||
438 | .van-icon-fire:before { | ||
439 | content: "\F05A" | ||
440 | } | ||
441 | |||
442 | .van-icon-flag-o:before { | ||
443 | content: "\F05B" | ||
444 | } | ||
445 | |||
446 | .van-icon-flower-o:before { | ||
447 | content: "\F05C" | ||
448 | } | ||
449 | |||
450 | .van-icon-free-postage:before { | ||
451 | content: "\F05D" | ||
452 | } | ||
453 | |||
454 | .van-icon-friends-o:before { | ||
455 | content: "\F05E" | ||
456 | } | ||
457 | |||
458 | .van-icon-friends:before { | ||
459 | content: "\F05F" | ||
460 | } | ||
461 | |||
462 | .van-icon-gem-o:before { | ||
463 | content: "\F060" | ||
464 | } | ||
465 | |||
466 | .van-icon-gem:before { | ||
467 | content: "\F061" | ||
468 | } | ||
469 | |||
470 | .van-icon-gift-card-o:before { | ||
471 | content: "\F062" | ||
472 | } | ||
473 | |||
474 | .van-icon-gift-card:before { | ||
475 | content: "\F063" | ||
476 | } | ||
477 | |||
478 | .van-icon-gift-o:before { | ||
479 | content: "\F064" | ||
480 | } | ||
481 | |||
482 | .van-icon-gift:before { | ||
483 | content: "\F065" | ||
484 | } | ||
485 | |||
486 | .van-icon-gold-coin-o:before { | ||
487 | content: "\F066" | ||
488 | } | ||
489 | |||
490 | .van-icon-gold-coin:before { | ||
491 | content: "\F067" | ||
492 | } | ||
493 | |||
494 | .van-icon-good-job-o:before { | ||
495 | content: "\F068" | ||
496 | } | ||
497 | |||
498 | .van-icon-good-job:before { | ||
499 | content: "\F069" | ||
500 | } | ||
501 | |||
502 | .van-icon-goods-collect-o:before { | ||
503 | content: "\F06A" | ||
504 | } | ||
505 | |||
506 | .van-icon-goods-collect:before { | ||
507 | content: "\F06B" | ||
508 | } | ||
509 | |||
510 | .van-icon-graphic:before { | ||
511 | content: "\F06C" | ||
512 | } | ||
513 | |||
514 | .van-icon-home-o:before { | ||
515 | content: "\F06D" | ||
516 | } | ||
517 | |||
518 | .van-icon-hot-o:before { | ||
519 | content: "\F06E" | ||
520 | } | ||
521 | |||
522 | .van-icon-hot-sale-o:before { | ||
523 | content: "\F06F" | ||
524 | } | ||
525 | |||
526 | .van-icon-hot-sale:before { | ||
527 | content: "\F070" | ||
528 | } | ||
529 | |||
530 | .van-icon-hot:before { | ||
531 | content: "\F071" | ||
532 | } | ||
533 | |||
534 | .van-icon-hotel-o:before { | ||
535 | content: "\F072" | ||
536 | } | ||
537 | |||
538 | .van-icon-idcard:before { | ||
539 | content: "\F073" | ||
540 | } | ||
541 | |||
542 | .van-icon-info-o:before { | ||
543 | content: "\F074" | ||
544 | } | ||
545 | |||
546 | .van-icon-info:before { | ||
547 | content: "\F075" | ||
548 | } | ||
549 | |||
550 | .van-icon-invition:before { | ||
551 | content: "\F076" | ||
552 | } | ||
553 | |||
554 | .van-icon-label-o:before { | ||
555 | content: "\F077" | ||
556 | } | ||
557 | |||
558 | .van-icon-label:before { | ||
559 | content: "\F078" | ||
560 | } | ||
561 | |||
562 | .van-icon-like-o:before { | ||
563 | content: "\F079" | ||
564 | } | ||
565 | |||
566 | .van-icon-like:before { | ||
567 | content: "\F07A" | ||
568 | } | ||
569 | |||
570 | .van-icon-live:before { | ||
571 | content: "\F07B" | ||
572 | } | ||
573 | |||
574 | .van-icon-location-o:before { | ||
575 | content: "\F07C" | ||
576 | } | ||
577 | |||
578 | .van-icon-location:before { | ||
579 | content: "\F07D" | ||
580 | } | ||
581 | |||
582 | .van-icon-lock:before { | ||
583 | content: "\F07E" | ||
584 | } | ||
585 | |||
586 | .van-icon-logistics:before { | ||
587 | content: "\F07F" | ||
588 | } | ||
589 | |||
590 | .van-icon-manager-o:before { | ||
591 | content: "\F080" | ||
592 | } | ||
593 | |||
594 | .van-icon-manager:before { | ||
595 | content: "\F081" | ||
596 | } | ||
597 | |||
598 | .van-icon-map-marked:before { | ||
599 | content: "\F082" | ||
600 | } | ||
601 | |||
602 | .van-icon-medal-o:before { | ||
603 | content: "\F083" | ||
604 | } | ||
605 | |||
606 | .van-icon-medal:before { | ||
607 | content: "\F084" | ||
608 | } | ||
609 | |||
610 | .van-icon-more-o:before { | ||
611 | content: "\F085" | ||
612 | } | ||
613 | |||
614 | .van-icon-more:before { | ||
615 | content: "\F086" | ||
616 | } | ||
617 | |||
618 | .van-icon-music-o:before { | ||
619 | content: "\F087" | ||
620 | } | ||
621 | |||
622 | .van-icon-music:before { | ||
623 | content: "\F088" | ||
624 | } | ||
625 | |||
626 | .van-icon-new-arrival-o:before { | ||
627 | content: "\F089" | ||
628 | } | ||
629 | |||
630 | .van-icon-new-arrival:before { | ||
631 | content: "\F08A" | ||
632 | } | ||
633 | |||
634 | .van-icon-new-o:before { | ||
635 | content: "\F08B" | ||
636 | } | ||
637 | |||
638 | .van-icon-new:before { | ||
639 | content: "\F08C" | ||
640 | } | ||
641 | |||
642 | .van-icon-newspaper-o:before { | ||
643 | content: "\F08D" | ||
644 | } | ||
645 | |||
646 | .van-icon-notes-o:before { | ||
647 | content: "\F08E" | ||
648 | } | ||
649 | |||
650 | .van-icon-orders-o:before { | ||
651 | content: "\F08F" | ||
652 | } | ||
653 | |||
654 | .van-icon-other-pay:before { | ||
655 | content: "\F090" | ||
656 | } | ||
657 | |||
658 | .van-icon-paid:before { | ||
659 | content: "\F091" | ||
660 | } | ||
661 | |||
662 | .van-icon-passed:before { | ||
663 | content: "\F092" | ||
664 | } | ||
665 | |||
666 | .van-icon-pause-circle-o:before { | ||
667 | content: "\F093" | ||
668 | } | ||
669 | |||
670 | .van-icon-pause-circle:before { | ||
671 | content: "\F094" | ||
672 | } | ||
673 | |||
674 | .van-icon-pause:before { | ||
675 | content: "\F095" | ||
676 | } | ||
677 | |||
678 | .van-icon-peer-pay:before { | ||
679 | content: "\F096" | ||
680 | } | ||
681 | |||
682 | .van-icon-pending-payment:before { | ||
683 | content: "\F097" | ||
684 | } | ||
685 | |||
686 | .van-icon-phone-circle-o:before { | ||
687 | content: "\F098" | ||
688 | } | ||
689 | |||
690 | .van-icon-phone-circle:before { | ||
691 | content: "\F099" | ||
692 | } | ||
693 | |||
694 | .van-icon-phone-o:before { | ||
695 | content: "\F09A" | ||
696 | } | ||
697 | |||
698 | .van-icon-phone:before { | ||
699 | content: "\F09B" | ||
700 | } | ||
701 | |||
702 | .van-icon-photo-o:before { | ||
703 | content: "\F09C" | ||
704 | } | ||
705 | |||
706 | .van-icon-photo:before { | ||
707 | content: "\F09D" | ||
708 | } | ||
709 | |||
710 | .van-icon-photograph:before { | ||
711 | content: "\F09E" | ||
712 | } | ||
713 | |||
714 | .van-icon-play-circle-o:before { | ||
715 | content: "\F09F" | ||
716 | } | ||
717 | |||
718 | .van-icon-play-circle:before { | ||
719 | content: "\F0A0" | ||
720 | } | ||
721 | |||
722 | .van-icon-play:before { | ||
723 | content: "\F0A1" | ||
724 | } | ||
725 | |||
726 | .van-icon-plus:before { | ||
727 | content: "\F0A2" | ||
728 | } | ||
729 | |||
730 | .van-icon-point-gift-o:before { | ||
731 | content: "\F0A3" | ||
732 | } | ||
733 | |||
734 | .van-icon-point-gift:before { | ||
735 | content: "\F0A4" | ||
736 | } | ||
737 | |||
738 | .van-icon-points:before { | ||
739 | content: "\F0A5" | ||
740 | } | ||
741 | |||
742 | .van-icon-printer:before { | ||
743 | content: "\F0A6" | ||
744 | } | ||
745 | |||
746 | .van-icon-qr-invalid:before { | ||
747 | content: "\F0A7" | ||
748 | } | ||
749 | |||
750 | .van-icon-qr:before { | ||
751 | content: "\F0A8" | ||
752 | } | ||
753 | |||
754 | .van-icon-question-o:before { | ||
755 | content: "\F0A9" | ||
756 | } | ||
757 | |||
758 | .van-icon-question:before { | ||
759 | content: "\F0AA" | ||
760 | } | ||
761 | |||
762 | .van-icon-records:before { | ||
763 | content: "\F0AB" | ||
764 | } | ||
765 | |||
766 | .van-icon-refund-o:before { | ||
767 | content: "\F0AC" | ||
768 | } | ||
769 | |||
770 | .van-icon-replay:before { | ||
771 | content: "\F0AD" | ||
772 | } | ||
773 | |||
774 | .van-icon-scan:before { | ||
775 | content: "\F0AE" | ||
776 | } | ||
777 | |||
778 | .van-icon-search:before { | ||
779 | content: "\F0AF" | ||
780 | } | ||
781 | |||
782 | .van-icon-send-gift-o:before { | ||
783 | content: "\F0B0" | ||
784 | } | ||
785 | |||
786 | .van-icon-send-gift:before { | ||
787 | content: "\F0B1" | ||
788 | } | ||
789 | |||
790 | .van-icon-service-o:before { | ||
791 | content: "\F0B2" | ||
792 | } | ||
793 | |||
794 | .van-icon-service:before { | ||
795 | content: "\F0B3" | ||
796 | } | ||
797 | |||
798 | .van-icon-setting-o:before { | ||
799 | content: "\F0B4" | ||
800 | } | ||
801 | |||
802 | .van-icon-setting:before { | ||
803 | content: "\F0B5" | ||
804 | } | ||
805 | |||
806 | .van-icon-share:before { | ||
807 | content: "\F0B6" | ||
808 | } | ||
809 | |||
810 | .van-icon-shop-collect-o:before { | ||
811 | content: "\F0B7" | ||
812 | } | ||
813 | |||
814 | .van-icon-shop-collect:before { | ||
815 | content: "\F0B8" | ||
816 | } | ||
817 | |||
818 | .van-icon-shop-o:before { | ||
819 | content: "\F0B9" | ||
820 | } | ||
821 | |||
822 | .van-icon-shop:before { | ||
823 | content: "\F0BA" | ||
824 | } | ||
825 | |||
826 | .van-icon-shopping-cart-o:before { | ||
827 | content: "\F0BB" | ||
828 | } | ||
829 | |||
830 | .van-icon-shopping-cart:before { | ||
831 | content: "\F0BC" | ||
832 | } | ||
833 | |||
834 | .van-icon-shrink:before { | ||
835 | content: "\F0BD" | ||
836 | } | ||
837 | |||
838 | .van-icon-sign:before { | ||
839 | content: "\F0BE" | ||
840 | } | ||
841 | |||
842 | .van-icon-smile-comment-o:before { | ||
843 | content: "\F0BF" | ||
844 | } | ||
845 | |||
846 | .van-icon-smile-comment:before { | ||
847 | content: "\F0C0" | ||
848 | } | ||
849 | |||
850 | .van-icon-smile-o:before { | ||
851 | content: "\F0C1" | ||
852 | } | ||
853 | |||
854 | .van-icon-smile:before { | ||
855 | content: "\F0C2" | ||
856 | } | ||
857 | |||
858 | .van-icon-star-o:before { | ||
859 | content: "\F0C3" | ||
860 | } | ||
861 | |||
862 | .van-icon-star:before { | ||
863 | content: "\F0C4" | ||
864 | } | ||
865 | |||
866 | .van-icon-stop-circle-o:before { | ||
867 | content: "\F0C5" | ||
868 | } | ||
869 | |||
870 | .van-icon-stop-circle:before { | ||
871 | content: "\F0C6" | ||
872 | } | ||
873 | |||
874 | .van-icon-stop:before { | ||
875 | content: "\F0C7" | ||
876 | } | ||
877 | |||
878 | .van-icon-success:before { | ||
879 | content: "\F0C8" | ||
880 | } | ||
881 | |||
882 | .van-icon-thumb-circle-o:before { | ||
883 | content: "\F0C9" | ||
884 | } | ||
885 | |||
886 | .van-icon-thumb-circle:before { | ||
887 | content: "\F0CA" | ||
888 | } | ||
889 | |||
890 | .van-icon-todo-list-o:before { | ||
891 | content: "\F0CB" | ||
892 | } | ||
893 | |||
894 | .van-icon-todo-list:before { | ||
895 | content: "\F0CC" | ||
896 | } | ||
897 | |||
898 | .van-icon-tosend:before { | ||
899 | content: "\F0CD" | ||
900 | } | ||
901 | |||
902 | .van-icon-tv-o:before { | ||
903 | content: "\F0CE" | ||
904 | } | ||
905 | |||
906 | .van-icon-umbrella-circle:before { | ||
907 | content: "\F0CF" | ||
908 | } | ||
909 | |||
910 | .van-icon-underway-o:before { | ||
911 | content: "\F0D0" | ||
912 | } | ||
913 | |||
914 | .van-icon-underway:before { | ||
915 | content: "\F0D1" | ||
916 | } | ||
917 | |||
918 | .van-icon-upgrade:before { | ||
919 | content: "\F0D2" | ||
920 | } | ||
921 | |||
922 | .van-icon-user-circle-o:before { | ||
923 | content: "\F0D3" | ||
924 | } | ||
925 | |||
926 | .van-icon-user-o:before { | ||
927 | content: "\F0D4" | ||
928 | } | ||
929 | |||
930 | .van-icon-video-o:before { | ||
931 | content: "\F0D5" | ||
932 | } | ||
933 | |||
934 | .van-icon-video:before { | ||
935 | content: "\F0D6" | ||
936 | } | ||
937 | |||
938 | .van-icon-vip-card-o:before { | ||
939 | content: "\F0D7" | ||
940 | } | ||
941 | |||
942 | .van-icon-vip-card:before { | ||
943 | content: "\F0D8" | ||
944 | } | ||
945 | |||
946 | .van-icon-volume-o:before { | ||
947 | content: "\F0D9" | ||
948 | } | ||
949 | |||
950 | .van-icon-volume:before { | ||
951 | content: "\F0DA" | ||
952 | } | ||
953 | |||
954 | .van-icon-wap-home-o:before { | ||
955 | content: "\F0DB" | ||
956 | } | ||
957 | |||
958 | .van-icon-wap-home:before { | ||
959 | content: "\F0DC" | ||
960 | } | ||
961 | |||
962 | .van-icon-wap-nav:before { | ||
963 | content: "\F0DD" | ||
964 | } | ||
965 | |||
966 | .van-icon-warn-o:before { | ||
967 | content: "\F0DE" | ||
968 | } | ||
969 | |||
970 | .van-icon-warning-o:before { | ||
971 | content: "\F0DF" | ||
972 | } | ||
973 | |||
974 | .van-icon-warning:before { | ||
975 | content: "\F0E0" | ||
976 | } | ||
977 | |||
978 | .van-icon-weapp-nav:before { | ||
979 | content: "\F0E1" | ||
980 | } | ||
981 | |||
982 | .van-icon-wechat:before { | ||
983 | content: "\F0E2" | ||
984 | } | ||
985 | |||
986 | .van-icon-youzan-shield:before { | ||
987 | content: "\F0E3" | ||
988 | } | ||
989 | |||
990 | .vant-icon-index { | ||
991 | display: -webkit-inline-flex; | ||
992 | display: inline-flex; | ||
993 | -webkit-align-items: center; | ||
994 | align-items: center; | ||
995 | -webkit-justify-content: center; | ||
996 | justify-content: center | ||
997 | } | ||
998 | |||
999 | .van-icon--image { | ||
1000 | width: 1em; | ||
1001 | height: 1em | ||
1002 | } | ||
1003 | |||
1004 | .van-icon__image { | ||
1005 | width: 100%; | ||
1006 | height: 100% | ||
1007 | } | ||
1008 | |||
1009 | .van-icon__info { | ||
1010 | z-index: 1 | ||
1011 | } | ||
1012 | </style> |
src/wxcomponents/vant/icon/index.wxml
File was created | 1 | <view | |
2 | class="custom-class {{ classPrefix }} {{ isImageName ? 'van-icon--image' : classPrefix + '-' + name }}" | ||
3 | style="{{ color ? 'color: ' + color + ';' : '' }}{{ size ? 'font-size: ' + sizeWithUnit + ';' : '' }}{{ customStyle }}" | ||
4 | bind:tap="onClick" | ||
5 | > | ||
6 | <van-info | ||
7 | wx:if="{{ info !== null || dot }}" | ||
8 | dot="{{ dot }}" | ||
9 | info="{{ info }}" | ||
10 | custom-class="van-icon__info" | ||
11 | /> | ||
12 | <image | ||
13 | wx:if="{{ isImageName }}" | ||
14 | src="{{ name }}" | ||
15 | mode="aspectFit" | ||
16 | class="van-icon__image" | ||
17 | /> | ||
18 | </view> | ||
19 |
src/wxcomponents/vant/icon/index.wxss
File was created | 1 | @import '../common/index.wxss'; | |
2 | |||
3 | @font-face { | ||
4 | font-weight: 400; | ||
5 | font-family: vant-icon; | ||
6 | font-style: normal; | ||
7 | font-display: auto; | ||
8 | src: url(https://img.yzcdn.cn/vant/vant-icon-d3825a.woff2) format("woff2"), url(https://img.yzcdn.cn/vant/vant-icon-d3825a.woff) format("woff"), url(https://img.yzcdn.cn/vant/vant-icon-d3825a.ttf) format("truetype") | ||
9 | } | ||
10 | |||
11 | .van-icon { | ||
12 | position: relative; | ||
13 | font: normal normal normal 14px/1 vant-icon; | ||
14 | font-size: inherit; | ||
15 | text-rendering: auto; | ||
16 | -webkit-font-smoothing: antialiased | ||
17 | } | ||
18 | |||
19 | .van-icon, | ||
20 | .van-icon:before { | ||
21 | display: inline-block | ||
22 | } | ||
23 | |||
24 | .van-icon-add-o:before { | ||
25 | content: "\F000" | ||
26 | } | ||
27 | |||
28 | .van-icon-add-square:before { | ||
29 | content: "\F001" | ||
30 | } | ||
31 | |||
32 | .van-icon-add:before { | ||
33 | content: "\F002" | ||
34 | } | ||
35 | |||
36 | .van-icon-after-sale:before { | ||
37 | content: "\F003" | ||
38 | } | ||
39 | |||
40 | .van-icon-aim:before { | ||
41 | content: "\F004" | ||
42 | } | ||
43 | |||
44 | .van-icon-alipay:before { | ||
45 | content: "\F005" | ||
46 | } | ||
47 | |||
48 | .van-icon-apps-o:before { | ||
49 | content: "\F006" | ||
50 | } | ||
51 | |||
52 | .van-icon-arrow-down:before { | ||
53 | content: "\F007" | ||
54 | } | ||
55 | |||
56 | .van-icon-arrow-left:before { | ||
57 | content: "\F008" | ||
58 | } | ||
59 | |||
60 | .van-icon-arrow-up:before { | ||
61 | content: "\F009" | ||
62 | } | ||
63 | |||
64 | .van-icon-arrow:before { | ||
65 | content: "\F00A" | ||
66 | } | ||
67 | |||
68 | .van-icon-ascending:before { | ||
69 | content: "\F00B" | ||
70 | } | ||
71 | |||
72 | .van-icon-audio:before { | ||
73 | content: "\F00C" | ||
74 | } | ||
75 | |||
76 | .van-icon-award-o:before { | ||
77 | content: "\F00D" | ||
78 | } | ||
79 | |||
80 | .van-icon-award:before { | ||
81 | content: "\F00E" | ||
82 | } | ||
83 | |||
84 | .van-icon-bag-o:before { | ||
85 | content: "\F00F" | ||
86 | } | ||
87 | |||
88 | .van-icon-bag:before { | ||
89 | content: "\F010" | ||
90 | } | ||
91 | |||
92 | .van-icon-balance-list-o:before { | ||
93 | content: "\F011" | ||
94 | } | ||
95 | |||
96 | .van-icon-balance-list:before { | ||
97 | content: "\F012" | ||
98 | } | ||
99 | |||
100 | .van-icon-balance-o:before { | ||
101 | content: "\F013" | ||
102 | } | ||
103 | |||
104 | .van-icon-balance-pay:before { | ||
105 | content: "\F014" | ||
106 | } | ||
107 | |||
108 | .van-icon-bar-chart-o:before { | ||
109 | content: "\F015" | ||
110 | } | ||
111 | |||
112 | .van-icon-bars:before { | ||
113 | content: "\F016" | ||
114 | } | ||
115 | |||
116 | .van-icon-bell:before { | ||
117 | content: "\F017" | ||
118 | } | ||
119 | |||
120 | .van-icon-bill-o:before { | ||
121 | content: "\F018" | ||
122 | } | ||
123 | |||
124 | .van-icon-bill:before { | ||
125 | content: "\F019" | ||
126 | } | ||
127 | |||
128 | .van-icon-birthday-cake-o:before { | ||
129 | content: "\F01A" | ||
130 | } | ||
131 | |||
132 | .van-icon-bookmark-o:before { | ||
133 | content: "\F01B" | ||
134 | } | ||
135 | |||
136 | .van-icon-bookmark:before { | ||
137 | content: "\F01C" | ||
138 | } | ||
139 | |||
140 | .van-icon-browsing-history-o:before { | ||
141 | content: "\F01D" | ||
142 | } | ||
143 | |||
144 | .van-icon-browsing-history:before { | ||
145 | content: "\F01E" | ||
146 | } | ||
147 | |||
148 | .van-icon-brush-o:before { | ||
149 | content: "\F01F" | ||
150 | } | ||
151 | |||
152 | .van-icon-bulb-o:before { | ||
153 | content: "\F020" | ||
154 | } | ||
155 | |||
156 | .van-icon-bullhorn-o:before { | ||
157 | content: "\F021" | ||
158 | } | ||
159 | |||
160 | .van-icon-calender-o:before { | ||
161 | content: "\F022" | ||
162 | } | ||
163 | |||
164 | .van-icon-card:before { | ||
165 | content: "\F023" | ||
166 | } | ||
167 | |||
168 | .van-icon-cart-circle-o:before { | ||
169 | content: "\F024" | ||
170 | } | ||
171 | |||
172 | .van-icon-cart-circle:before { | ||
173 | content: "\F025" | ||
174 | } | ||
175 | |||
176 | .van-icon-cart-o:before { | ||
177 | content: "\F026" | ||
178 | } | ||
179 | |||
180 | .van-icon-cart:before { | ||
181 | content: "\F027" | ||
182 | } | ||
183 | |||
184 | .van-icon-cash-back-record:before { | ||
185 | content: "\F028" | ||
186 | } | ||
187 | |||
188 | .van-icon-cash-on-deliver:before { | ||
189 | content: "\F029" | ||
190 | } | ||
191 | |||
192 | .van-icon-cashier-o:before { | ||
193 | content: "\F02A" | ||
194 | } | ||
195 | |||
196 | .van-icon-certificate:before { | ||
197 | content: "\F02B" | ||
198 | } | ||
199 | |||
200 | .van-icon-chart-trending-o:before { | ||
201 | content: "\F02C" | ||
202 | } | ||
203 | |||
204 | .van-icon-chat-o:before { | ||
205 | content: "\F02D" | ||
206 | } | ||
207 | |||
208 | .van-icon-chat:before { | ||
209 | content: "\F02E" | ||
210 | } | ||
211 | |||
212 | .van-icon-checked:before { | ||
213 | content: "\F02F" | ||
214 | } | ||
215 | |||
216 | .van-icon-circle:before { | ||
217 | content: "\F030" | ||
218 | } | ||
219 | |||
220 | .van-icon-clear:before { | ||
221 | content: "\F031" | ||
222 | } | ||
223 | |||
224 | .van-icon-clock-o:before { | ||
225 | content: "\F032" | ||
226 | } | ||
227 | |||
228 | .van-icon-clock:before { | ||
229 | content: "\F033" | ||
230 | } | ||
231 | |||
232 | .van-icon-close:before { | ||
233 | content: "\F034" | ||
234 | } | ||
235 | |||
236 | .van-icon-closed-eye:before { | ||
237 | content: "\F035" | ||
238 | } | ||
239 | |||
240 | .van-icon-cluster-o:before { | ||
241 | content: "\F036" | ||
242 | } | ||
243 | |||
244 | .van-icon-cluster:before { | ||
245 | content: "\F037" | ||
246 | } | ||
247 | |||
248 | .van-icon-column:before { | ||
249 | content: "\F038" | ||
250 | } | ||
251 | |||
252 | .van-icon-comment-circle-o:before { | ||
253 | content: "\F039" | ||
254 | } | ||
255 | |||
256 | .van-icon-comment-circle:before { | ||
257 | content: "\F03A" | ||
258 | } | ||
259 | |||
260 | .van-icon-comment-o:before { | ||
261 | content: "\F03B" | ||
262 | } | ||
263 | |||
264 | .van-icon-comment:before { | ||
265 | content: "\F03C" | ||
266 | } | ||
267 | |||
268 | .van-icon-completed:before { | ||
269 | content: "\F03D" | ||
270 | } | ||
271 | |||
272 | .van-icon-contact:before { | ||
273 | content: "\F03E" | ||
274 | } | ||
275 | |||
276 | .van-icon-coupon-o:before { | ||
277 | content: "\F03F" | ||
278 | } | ||
279 | |||
280 | .van-icon-coupon:before { | ||
281 | content: "\F040" | ||
282 | } | ||
283 | |||
284 | .van-icon-credit-pay:before { | ||
285 | content: "\F041" | ||
286 | } | ||
287 | |||
288 | .van-icon-cross:before { | ||
289 | content: "\F042" | ||
290 | } | ||
291 | |||
292 | .van-icon-debit-pay:before { | ||
293 | content: "\F043" | ||
294 | } | ||
295 | |||
296 | .van-icon-delete:before { | ||
297 | content: "\F044" | ||
298 | } | ||
299 | |||
300 | .van-icon-descending:before { | ||
301 | content: "\F045" | ||
302 | } | ||
303 | |||
304 | .van-icon-description:before { | ||
305 | content: "\F046" | ||
306 | } | ||
307 | |||
308 | .van-icon-desktop-o:before { | ||
309 | content: "\F047" | ||
310 | } | ||
311 | |||
312 | .van-icon-diamond-o:before { | ||
313 | content: "\F048" | ||
314 | } | ||
315 | |||
316 | .van-icon-diamond:before { | ||
317 | content: "\F049" | ||
318 | } | ||
319 | |||
320 | .van-icon-discount:before { | ||
321 | content: "\F04A" | ||
322 | } | ||
323 | |||
324 | .van-icon-down:before { | ||
325 | content: "\F04B" | ||
326 | } | ||
327 | |||
328 | .van-icon-ecard-pay:before { | ||
329 | content: "\F04C" | ||
330 | } | ||
331 | |||
332 | .van-icon-edit:before { | ||
333 | content: "\F04D" | ||
334 | } | ||
335 | |||
336 | .van-icon-ellipsis:before { | ||
337 | content: "\F04E" | ||
338 | } | ||
339 | |||
340 | .van-icon-empty:before { | ||
341 | content: "\F04F" | ||
342 | } | ||
343 | |||
344 | .van-icon-envelop-o:before { | ||
345 | content: "\F050" | ||
346 | } | ||
347 | |||
348 | .van-icon-exchange:before { | ||
349 | content: "\F051" | ||
350 | } | ||
351 | |||
352 | .van-icon-expand-o:before { | ||
353 | content: "\F052" | ||
354 | } | ||
355 | |||
356 | .van-icon-expand:before { | ||
357 | content: "\F053" | ||
358 | } | ||
359 | |||
360 | .van-icon-eye-o:before { | ||
361 | content: "\F054" | ||
362 | } | ||
363 | |||
364 | .van-icon-eye:before { | ||
365 | content: "\F055" | ||
366 | } | ||
367 | |||
368 | .van-icon-fail:before { | ||
369 | content: "\F056" | ||
370 | } | ||
371 | |||
372 | .van-icon-failure:before { | ||
373 | content: "\F057" | ||
374 | } | ||
375 | |||
376 | .van-icon-filter-o:before { | ||
377 | content: "\F058" | ||
378 | } | ||
379 | |||
380 | .van-icon-fire-o:before { | ||
381 | content: "\F059" | ||
382 | } | ||
383 | |||
384 | .van-icon-fire:before { | ||
385 | content: "\F05A" | ||
386 | } | ||
387 | |||
388 | .van-icon-flag-o:before { | ||
389 | content: "\F05B" | ||
390 | } | ||
391 | |||
392 | .van-icon-flower-o:before { | ||
393 | content: "\F05C" | ||
394 | } | ||
395 | |||
396 | .van-icon-free-postage:before { | ||
397 | content: "\F05D" | ||
398 | } | ||
399 | |||
400 | .van-icon-friends-o:before { | ||
401 | content: "\F05E" | ||
402 | } | ||
403 | |||
404 | .van-icon-friends:before { | ||
405 | content: "\F05F" | ||
406 | } | ||
407 | |||
408 | .van-icon-gem-o:before { | ||
409 | content: "\F060" | ||
410 | } | ||
411 | |||
412 | .van-icon-gem:before { | ||
413 | content: "\F061" | ||
414 | } | ||
415 | |||
416 | .van-icon-gift-card-o:before { | ||
417 | content: "\F062" | ||
418 | } | ||
419 | |||
420 | .van-icon-gift-card:before { | ||
421 | content: "\F063" | ||
422 | } | ||
423 | |||
424 | .van-icon-gift-o:before { | ||
425 | content: "\F064" | ||
426 | } | ||
427 | |||
428 | .van-icon-gift:before { | ||
429 | content: "\F065" | ||
430 | } | ||
431 | |||
432 | .van-icon-gold-coin-o:before { | ||
433 | content: "\F066" | ||
434 | } | ||
435 | |||
436 | .van-icon-gold-coin:before { | ||
437 | content: "\F067" | ||
438 | } | ||
439 | |||
440 | .van-icon-good-job-o:before { | ||
441 | content: "\F068" | ||
442 | } | ||
443 | |||
444 | .van-icon-good-job:before { | ||
445 | content: "\F069" | ||
446 | } | ||
447 | |||
448 | .van-icon-goods-collect-o:before { | ||
449 | content: "\F06A" | ||
450 | } | ||
451 | |||
452 | .van-icon-goods-collect:before { | ||
453 | content: "\F06B" | ||
454 | } | ||
455 | |||
456 | .van-icon-graphic:before { | ||
457 | content: "\F06C" | ||
458 | } | ||
459 | |||
460 | .van-icon-home-o:before { | ||
461 | content: "\F06D" | ||
462 | } | ||
463 | |||
464 | .van-icon-hot-o:before { | ||
465 | content: "\F06E" | ||
466 | } | ||
467 | |||
468 | .van-icon-hot-sale-o:before { | ||
469 | content: "\F06F" | ||
470 | } | ||
471 | |||
472 | .van-icon-hot-sale:before { | ||
473 | content: "\F070" | ||
474 | } | ||
475 | |||
476 | .van-icon-hot:before { | ||
477 | content: "\F071" | ||
478 | } | ||
479 | |||
480 | .van-icon-hotel-o:before { | ||
481 | content: "\F072" | ||
482 | } | ||
483 | |||
484 | .van-icon-idcard:before { | ||
485 | content: "\F073" | ||
486 | } | ||
487 | |||
488 | .van-icon-info-o:before { | ||
489 | content: "\F074" | ||
490 | } | ||
491 | |||
492 | .van-icon-info:before { | ||
493 | content: "\F075" | ||
494 | } | ||
495 | |||
496 | .van-icon-invition:before { | ||
497 | content: "\F076" | ||
498 | } | ||
499 | |||
500 | .van-icon-label-o:before { | ||
501 | content: "\F077" | ||
502 | } | ||
503 | |||
504 | .van-icon-label:before { | ||
505 | content: "\F078" | ||
506 | } | ||
507 | |||
508 | .van-icon-like-o:before { | ||
509 | content: "\F079" | ||
510 | } | ||
511 | |||
512 | .van-icon-like:before { | ||
513 | content: "\F07A" | ||
514 | } | ||
515 | |||
516 | .van-icon-live:before { | ||
517 | content: "\F07B" | ||
518 | } | ||
519 | |||
520 | .van-icon-location-o:before { | ||
521 | content: "\F07C" | ||
522 | } | ||
523 | |||
524 | .van-icon-location:before { | ||
525 | content: "\F07D" | ||
526 | } | ||
527 | |||
528 | .van-icon-lock:before { | ||
529 | content: "\F07E" | ||
530 | } | ||
531 | |||
532 | .van-icon-logistics:before { | ||
533 | content: "\F07F" | ||
534 | } | ||
535 | |||
536 | .van-icon-manager-o:before { | ||
537 | content: "\F080" | ||
538 | } | ||
539 | |||
540 | .van-icon-manager:before { | ||
541 | content: "\F081" | ||
542 | } | ||
543 | |||
544 | .van-icon-map-marked:before { | ||
545 | content: "\F082" | ||
546 | } | ||
547 | |||
548 | .van-icon-medal-o:before { | ||
549 | content: "\F083" | ||
550 | } | ||
551 | |||
552 | .van-icon-medal:before { | ||
553 | content: "\F084" | ||
554 | } | ||
555 | |||
556 | .van-icon-more-o:before { | ||
557 | content: "\F085" | ||
558 | } | ||
559 | |||
560 | .van-icon-more:before { | ||
561 | content: "\F086" | ||
562 | } | ||
563 | |||
564 | .van-icon-music-o:before { | ||
565 | content: "\F087" | ||
566 | } | ||
567 | |||
568 | .van-icon-music:before { | ||
569 | content: "\F088" | ||
570 | } | ||
571 | |||
572 | .van-icon-new-arrival-o:before { | ||
573 | content: "\F089" | ||
574 | } | ||
575 | |||
576 | .van-icon-new-arrival:before { | ||
577 | content: "\F08A" | ||
578 | } | ||
579 | |||
580 | .van-icon-new-o:before { | ||
581 | content: "\F08B" | ||
582 | } | ||
583 | |||
584 | .van-icon-new:before { | ||
585 | content: "\F08C" | ||
586 | } | ||
587 | |||
588 | .van-icon-newspaper-o:before { | ||
589 | content: "\F08D" | ||
590 | } | ||
591 | |||
592 | .van-icon-notes-o:before { | ||
593 | content: "\F08E" | ||
594 | } | ||
595 | |||
596 | .van-icon-orders-o:before { | ||
597 | content: "\F08F" | ||
598 | } | ||
599 | |||
600 | .van-icon-other-pay:before { | ||
601 | content: "\F090" | ||
602 | } | ||
603 | |||
604 | .van-icon-paid:before { | ||
605 | content: "\F091" | ||
606 | } | ||
607 | |||
608 | .van-icon-passed:before { | ||
609 | content: "\F092" | ||
610 | } | ||
611 | |||
612 | .van-icon-pause-circle-o:before { | ||
613 | content: "\F093" | ||
614 | } | ||
615 | |||
616 | .van-icon-pause-circle:before { | ||
617 | content: "\F094" | ||
618 | } | ||
619 | |||
620 | .van-icon-pause:before { | ||
621 | content: "\F095" | ||
622 | } | ||
623 | |||
624 | .van-icon-peer-pay:before { | ||
625 | content: "\F096" | ||
626 | } | ||
627 | |||
628 | .van-icon-pending-payment:before { | ||
629 | content: "\F097" | ||
630 | } | ||
631 | |||
632 | .van-icon-phone-circle-o:before { | ||
633 | content: "\F098" | ||
634 | } | ||
635 | |||
636 | .van-icon-phone-circle:before { | ||
637 | content: "\F099" | ||
638 | } | ||
639 | |||
640 | .van-icon-phone-o:before { | ||
641 | content: "\F09A" | ||
642 | } | ||
643 | |||
644 | .van-icon-phone:before { | ||
645 | content: "\F09B" | ||
646 | } | ||
647 | |||
648 | .van-icon-photo-o:before { | ||
649 | content: "\F09C" | ||
650 | } | ||
651 | |||
652 | .van-icon-photo:before { | ||
653 | content: "\F09D" | ||
654 | } | ||
655 | |||
656 | .van-icon-photograph:before { | ||
657 | content: "\F09E" | ||
658 | } | ||
659 | |||
660 | .van-icon-play-circle-o:before { | ||
661 | content: "\F09F" | ||
662 | } | ||
663 | |||
664 | .van-icon-play-circle:before { | ||
665 | content: "\F0A0" | ||
666 | } | ||
667 | |||
668 | .van-icon-play:before { | ||
669 | content: "\F0A1" | ||
670 | } | ||
671 | |||
672 | .van-icon-plus:before { | ||
673 | content: "\F0A2" | ||
674 | } | ||
675 | |||
676 | .van-icon-point-gift-o:before { | ||
677 | content: "\F0A3" | ||
678 | } | ||
679 | |||
680 | .van-icon-point-gift:before { | ||
681 | content: "\F0A4" | ||
682 | } | ||
683 | |||
684 | .van-icon-points:before { | ||
685 | content: "\F0A5" | ||
686 | } | ||
687 | |||
688 | .van-icon-printer:before { | ||
689 | content: "\F0A6" | ||
690 | } | ||
691 | |||
692 | .van-icon-qr-invalid:before { | ||
693 | content: "\F0A7" | ||
694 | } | ||
695 | |||
696 | .van-icon-qr:before { | ||
697 | content: "\F0A8" | ||
698 | } | ||
699 | |||
700 | .van-icon-question-o:before { | ||
701 | content: "\F0A9" | ||
702 | } | ||
703 | |||
704 | .van-icon-question:before { | ||
705 | content: "\F0AA" | ||
706 | } | ||
707 | |||
708 | .van-icon-records:before { | ||
709 | content: "\F0AB" | ||
710 | } | ||
711 | |||
712 | .van-icon-refund-o:before { | ||
713 | content: "\F0AC" | ||
714 | } | ||
715 | |||
716 | .van-icon-replay:before { | ||
717 | content: "\F0AD" | ||
718 | } | ||
719 | |||
720 | .van-icon-scan:before { | ||
721 | content: "\F0AE" | ||
722 | } | ||
723 | |||
724 | .van-icon-search:before { | ||
725 | content: "\F0AF" | ||
726 | } | ||
727 | |||
728 | .van-icon-send-gift-o:before { | ||
729 | content: "\F0B0" | ||
730 | } | ||
731 | |||
732 | .van-icon-send-gift:before { | ||
733 | content: "\F0B1" | ||
734 | } | ||
735 | |||
736 | .van-icon-service-o:before { | ||
737 | content: "\F0B2" | ||
738 | } | ||
739 | |||
740 | .van-icon-service:before { | ||
741 | content: "\F0B3" | ||
742 | } | ||
743 | |||
744 | .van-icon-setting-o:before { | ||
745 | content: "\F0B4" | ||
746 | } | ||
747 | |||
748 | .van-icon-setting:before { | ||
749 | content: "\F0B5" | ||
750 | } | ||
751 | |||
752 | .van-icon-share:before { | ||
753 | content: "\F0B6" | ||
754 | } | ||
755 | |||
756 | .van-icon-shop-collect-o:before { | ||
757 | content: "\F0B7" | ||
758 | } | ||
759 | |||
760 | .van-icon-shop-collect:before { | ||
761 | content: "\F0B8" | ||
762 | } | ||
763 | |||
764 | .van-icon-shop-o:before { | ||
765 | content: "\F0B9" | ||
766 | } | ||
767 | |||
768 | .van-icon-shop:before { | ||
769 | content: "\F0BA" | ||
770 | } | ||
771 | |||
772 | .van-icon-shopping-cart-o:before { | ||
773 | content: "\F0BB" | ||
774 | } | ||
775 | |||
776 | .van-icon-shopping-cart:before { | ||
777 | content: "\F0BC" | ||
778 | } | ||
779 | |||
780 | .van-icon-shrink:before { | ||
781 | content: "\F0BD" | ||
782 | } | ||
783 | |||
784 | .van-icon-sign:before { | ||
785 | content: "\F0BE" | ||
786 | } | ||
787 | |||
788 | .van-icon-smile-comment-o:before { | ||
789 | content: "\F0BF" | ||
790 | } | ||
791 | |||
792 | .van-icon-smile-comment:before { | ||
793 | content: "\F0C0" | ||
794 | } | ||
795 | |||
796 | .van-icon-smile-o:before { | ||
797 | content: "\F0C1" | ||
798 | } | ||
799 | |||
800 | .van-icon-smile:before { | ||
801 | content: "\F0C2" | ||
802 | } | ||
803 | |||
804 | .van-icon-star-o:before { | ||
805 | content: "\F0C3" | ||
806 | } | ||
807 | |||
808 | .van-icon-star:before { | ||
809 | content: "\F0C4" | ||
810 | } | ||
811 | |||
812 | .van-icon-stop-circle-o:before { | ||
813 | content: "\F0C5" | ||
814 | } | ||
815 | |||
816 | .van-icon-stop-circle:before { | ||
817 | content: "\F0C6" | ||
818 | } | ||
819 | |||
820 | .van-icon-stop:before { | ||
821 | content: "\F0C7" | ||
822 | } | ||
823 | |||
824 | .van-icon-success:before { | ||
825 | content: "\F0C8" | ||
826 | } | ||
827 | |||
828 | .van-icon-thumb-circle-o:before { | ||
829 | content: "\F0C9" | ||
830 | } | ||
831 | |||
832 | .van-icon-thumb-circle:before { | ||
833 | content: "\F0CA" | ||
834 | } | ||
835 | |||
836 | .van-icon-todo-list-o:before { | ||
837 | content: "\F0CB" | ||
838 | } | ||
839 | |||
840 | .van-icon-todo-list:before { | ||
841 | content: "\F0CC" | ||
842 | } | ||
843 | |||
844 | .van-icon-tosend:before { | ||
845 | content: "\F0CD" | ||
846 | } | ||
847 | |||
848 | .van-icon-tv-o:before { | ||
849 | content: "\F0CE" | ||
850 | } | ||
851 | |||
852 | .van-icon-umbrella-circle:before { | ||
853 | content: "\F0CF" | ||
854 | } | ||
855 | |||
856 | .van-icon-underway-o:before { | ||
857 | content: "\F0D0" | ||
858 | } | ||
859 | |||
860 | .van-icon-underway:before { | ||
861 | content: "\F0D1" | ||
862 | } | ||
863 | |||
864 | .van-icon-upgrade:before { | ||
865 | content: "\F0D2" | ||
866 | } | ||
867 | |||
868 | .van-icon-user-circle-o:before { | ||
869 | content: "\F0D3" | ||
870 | } | ||
871 | |||
872 | .van-icon-user-o:before { | ||
873 | content: "\F0D4" | ||
874 | } | ||
875 | |||
876 | .van-icon-video-o:before { | ||
877 | content: "\F0D5" | ||
878 | } | ||
879 | |||
880 | .van-icon-video:before { | ||
881 | content: "\F0D6" | ||
882 | } | ||
883 | |||
884 | .van-icon-vip-card-o:before { | ||
885 | content: "\F0D7" | ||
886 | } | ||
887 | |||
888 | .van-icon-vip-card:before { | ||
889 | content: "\F0D8" | ||
890 | } | ||
891 | |||
892 | .van-icon-volume-o:before { | ||
893 | content: "\F0D9" | ||
894 | } | ||
895 | |||
896 | .van-icon-volume:before { | ||
897 | content: "\F0DA" | ||
898 | } | ||
899 | |||
900 | .van-icon-wap-home-o:before { | ||
901 | content: "\F0DB" | ||
902 | } | ||
903 | |||
904 | .van-icon-wap-home:before { | ||
905 | content: "\F0DC" | ||
906 | } | ||
907 | |||
908 | .van-icon-wap-nav:before { | ||
909 | content: "\F0DD" | ||
910 | } | ||
911 | |||
912 | .van-icon-warn-o:before { | ||
913 | content: "\F0DE" | ||
914 | } | ||
915 | |||
916 | .van-icon-warning-o:before { | ||
917 | content: "\F0DF" | ||
918 | } | ||
919 | |||
920 | .van-icon-warning:before { | ||
921 | content: "\F0E0" | ||
922 | } | ||
923 | |||
924 | .van-icon-weapp-nav:before { | ||
925 | content: "\F0E1" | ||
926 | } | ||
927 | |||
928 | .van-icon-wechat:before { | ||
929 | content: "\F0E2" | ||
930 | } | ||
931 | |||
932 | .van-icon-youzan-shield:before { | ||
933 | content: "\F0E3" | ||
934 | } | ||
935 | |||
936 | :host { | ||
937 | display: -webkit-inline-flex; | ||
938 | display: inline-flex; | ||
939 | -webkit-align-items: center; | ||
940 | align-items: center; | ||
941 | -webkit-justify-content: center; | ||
942 | justify-content: center | ||
943 | } | ||
944 | |||
945 | .van-icon--image { | ||
946 | width: 1em; | ||
947 | height: 1em | ||
948 | } | ||
949 | |||
950 | .van-icon__image { | ||
951 | width: 100%; | ||
952 | height: 100% | ||
953 | } | ||
954 | |||
955 | .van-icon__info { | ||
956 | z-index: 1 | ||
957 | } | ||
958 |
src/wxcomponents/vant/info/index.d.ts
File was created | 1 | export {}; | |
2 |
src/wxcomponents/vant/info/index.js
File was created | 1 | import { VantComponent } from '../common/component'; | |
2 | VantComponent({ | ||
3 | props: { | ||
4 | dot: Boolean, | ||
5 | info: null, | ||
6 | customStyle: String | ||
7 | } | ||
8 | }); | ||
9 |
src/wxcomponents/vant/info/index.json
File was created | 1 | { | |
2 | "component": true | ||
3 | } | ||
4 |
src/wxcomponents/vant/info/index.vue
File was created | 1 | <template> | |
2 | <uni-shadow-root class="vant-info-index"><view v-if="info !== null && info !== '' || dot" :class="'custom-class van-info '+(utils.bem('info', { dot }))" :style="customStyle">{{ dot ? '' : info }}</view></uni-shadow-root> | ||
3 | </template> | ||
4 | <wxs src="../wxs/utils.wxs" module="utils"></wxs> | ||
5 | <script> | ||
6 | |||
7 | global['__wxRoute'] = 'vant/info/index' | ||
8 | import { VantComponent } from '../common/component'; | ||
9 | VantComponent({ | ||
10 | props: { | ||
11 | dot: Boolean, | ||
12 | info: null, | ||
13 | customStyle: String | ||
14 | } | ||
15 | }); | ||
16 | export default global['__wxComponents']['vant/info/index'] | ||
17 | </script> | ||
18 | <style platform="mp-weixin"> | ||
19 | @import '../common/index.css';.van-info{position:absolute;top:0;right:0;box-sizing:border-box;white-space:nowrap;text-align:center;-webkit-transform:translate(50%,-50%);transform:translate(50%,-50%);-webkit-transform-origin:100%;transform-origin:100%;min-width:16px;min-width:var(--info-size,16px);padding:0 3px;padding:var(--info-padding,0 3px);color:#fff;color:var(--info-color,#fff);font-weight:500;font-weight:var(--info-font-weight,500);font-size:12px;font-size:var(--info-font-size,12px);font-family:PingFang SC,Helvetica Neue,Arial,sans-serif;font-family:var(--info-font-family,PingFang SC,Helvetica Neue,Arial,sans-serif);line-height:14px;line-height:calc(var(--info-size, 16px) - var(--info-border-width, 1px)*2);background-color:#ee0a24;background-color:var(--info-background-color,#ee0a24);border:1px solid #fff;border:var(--info-border-width,1px) solid var(--white,#fff);border-radius:16px;border-radius:var(--info-size,16px)}.van-info--dot{min-width:0;border-radius:100%;width:8px;width:var(--info-dot-size,8px);height:8px;height:var(--info-dot-size,8px);background-color:#ee0a24;background-color:var(--info-dot-color,#ee0a24)} | ||
20 | </style> |
src/wxcomponents/vant/info/index.wxml
File was created | 1 | <wxs src="../wxs/utils.wxs" module="utils" /> | |
2 | |||
3 | <view | ||
4 | wx:if="{{ info !== null && info !== '' || dot }}" | ||
5 | class="custom-class van-info {{ utils.bem('info', { dot }) }}" | ||
6 | style="{{ customStyle }}" | ||
7 | >{{ dot ? '' : info }}</view> | ||
8 |
src/wxcomponents/vant/info/index.wxss
File was created | 1 | @import '../common/index.wxss';.van-info{position:absolute;top:0;right:0;box-sizing:border-box;white-space:nowrap;text-align:center;-webkit-transform:translate(50%,-50%);transform:translate(50%,-50%);-webkit-transform-origin:100%;transform-origin:100%;min-width:16px;min-width:var(--info-size,16px);padding:0 3px;padding:var(--info-padding,0 3px);color:#fff;color:var(--info-color,#fff);font-weight:500;font-weight:var(--info-font-weight,500);font-size:12px;font-size:var(--info-font-size,12px);font-family:PingFang SC,Helvetica Neue,Arial,sans-serif;font-family:var(--info-font-family,PingFang SC,Helvetica Neue,Arial,sans-serif);line-height:14px;line-height:calc(var(--info-size, 16px) - var(--info-border-width, 1px)*2);background-color:#ee0a24;background-color:var(--info-background-color,#ee0a24);border:1px solid #fff;border:var(--info-border-width,1px) solid var(--white,#fff);border-radius:16px;border-radius:var(--info-size,16px)}.van-info--dot{min-width:0;border-radius:100%;width:8px;width:var(--info-dot-size,8px);height:8px;height:var(--info-dot-size,8px);background-color:#ee0a24;background-color:var(--info-dot-color,#ee0a24)} |
src/wxcomponents/vant/loading/index.d.ts
File was created | 1 | export {}; | |
2 |
src/wxcomponents/vant/loading/index.js
File was created | 1 | import { VantComponent } from '../common/component'; | |
2 | import { addUnit } from '../common/utils'; | ||
3 | VantComponent({ | ||
4 | props: { | ||
5 | color: String, | ||
6 | vertical: Boolean, | ||
7 | type: { | ||
8 | type: String, | ||
9 | value: 'circular' | ||
10 | }, | ||
11 | size: { | ||
12 | type: String, | ||
13 | observer: 'setSizeWithUnit' | ||
14 | }, | ||
15 | textSize: { | ||
16 | type: String, | ||
17 | observer: 'setTextSizeWithUnit' | ||
18 | } | ||
19 | }, | ||
20 | methods: { | ||
21 | setSizeWithUnit(size) { | ||
22 | this.setData({ | ||
23 | sizeWithUnit: addUnit(size) | ||
24 | }); | ||
25 | }, | ||
26 | setTextSizeWithUnit(size) { | ||
27 | this.set({ | ||
28 | textSizeWithUnit: addUnit(size) | ||
29 | }); | ||
30 | } | ||
31 | } | ||
32 | }); | ||
33 |
src/wxcomponents/vant/loading/index.json
File was created | 1 | { | |
2 | "component": true | ||
3 | } |
src/wxcomponents/vant/loading/index.vue
File was created | 1 | <template> | |
2 | <uni-shadow-root class="vant-loading-index"><view :class="'custom-class van-loading '+(vertical ? 'van-loading--vertical' : '')"> | ||
3 | <view :class="'van-loading__spinner van-loading__spinner--'+(type)" :style="'color: '+(color)+'; width: '+(sizeWithUnit)+'; height: '+(sizeWithUnit)"> | ||
4 | <view v-for="(item,index) in ('item in 12')" :key="item.index" v-if="type === 'spinner'" class="van-loading__dot"></view> | ||
5 | </view> | ||
6 | <view class="van-loading__text" :style="'font-size: '+(textSizeWithUnit)+';'"> | ||
7 | <slot></slot> | ||
8 | </view> | ||
9 | </view></uni-shadow-root> | ||
10 | </template> | ||
11 | |||
12 | <script> | ||
13 | |||
14 | global['__wxRoute'] = 'vant/loading/index' | ||
15 | import { VantComponent } from '../common/component'; | ||
16 | import { addUnit } from '../common/utils'; | ||
17 | VantComponent({ | ||
18 | props: { | ||
19 | color: String, | ||
20 | vertical: Boolean, | ||
21 | type: { | ||
22 | type: String, | ||
23 | value: 'circular' | ||
24 | }, | ||
25 | size: { | ||
26 | type: String, | ||
27 | observer: 'setSizeWithUnit' | ||
28 | }, | ||
29 | textSize: { | ||
30 | type: String, | ||
31 | observer: 'setTextSizeWithUnit' | ||
32 | } | ||
33 | }, | ||
34 | methods: { | ||
35 | setSizeWithUnit(size) { | ||
36 | this.setData({ | ||
37 | sizeWithUnit: addUnit(size) | ||
38 | }); | ||
39 | }, | ||
40 | setTextSizeWithUnit(size) { | ||
41 | this.set({ | ||
42 | textSizeWithUnit: addUnit(size) | ||
43 | }); | ||
44 | } | ||
45 | } | ||
46 | }); | ||
47 | export default global['__wxComponents']['vant/loading/index'] | ||
48 | </script> | ||
49 | <style platform="mp-weixin"> | ||
50 | @import '../common/index.css';.vant-loading-index{font-size:0;line-height:1}.van-loading{display:-webkit-inline-flex;display:inline-flex;-webkit-align-items:center;align-items:center;-webkit-justify-content:center;justify-content:center;color:#c8c9cc;color:var(--loading-spinner-color,#c8c9cc)}.van-loading__spinner{position:relative;box-sizing:border-box;width:30px;width:var(--loading-spinner-size,30px);max-width:100%;max-height:100%;height:30px;height:var(--loading-spinner-size,30px);-webkit-animation:van-rotate .8s linear infinite;animation:van-rotate .8s linear infinite;-webkit-animation:van-rotate var(--loading-spinner-animation-duration,.8s) linear infinite;animation:van-rotate var(--loading-spinner-animation-duration,.8s) linear infinite}.van-loading__spinner--spinner{-webkit-animation-timing-function:steps(12);animation-timing-function:steps(12)}.van-loading__spinner--circular{border:1px solid transparent;border-top-color:initial;border-radius:100%}.van-loading__text{margin-left:8px;margin-left:var(--padding-xs,8px);color:#969799;color:var(--loading-text-color,#969799);font-size:14px;font-size:var(--loading-text-font-size,14px);line-height:20px;line-height:var(--loading-text-line-height,20px)}.van-loading__text:empty{display:none}.van-loading--vertical{-webkit-flex-direction:column;flex-direction:column}.van-loading--vertical .van-loading__text{margin:8px 0 0;margin:var(--padding-xs,8px) 0 0}.van-loading__dot{position:absolute;top:0;left:0;width:100%;height:100%}.van-loading__dot:before{display:block;width:2px;height:25%;margin:0 auto;background-color:currentColor;border-radius:40%;content:" "}.van-loading__dot:first-of-type{-webkit-transform:rotate(30deg);transform:rotate(30deg);opacity:1}.van-loading__dot:nth-of-type(2){-webkit-transform:rotate(60deg);transform:rotate(60deg);opacity:.9375}.van-loading__dot:nth-of-type(3){-webkit-transform:rotate(90deg);transform:rotate(90deg);opacity:.875}.van-loading__dot:nth-of-type(4){-webkit-transform:rotate(120deg);transform:rotate(120deg);opacity:.8125}.van-loading__dot:nth-of-type(5){-webkit-transform:rotate(150deg);transform:rotate(150deg);opacity:.75}.van-loading__dot:nth-of-type(6){-webkit-transform:rotate(180deg);transform:rotate(180deg);opacity:.6875}.van-loading__dot:nth-of-type(7){-webkit-transform:rotate(210deg);transform:rotate(210deg);opacity:.625}.van-loading__dot:nth-of-type(8){-webkit-transform:rotate(240deg);transform:rotate(240deg);opacity:.5625}.van-loading__dot:nth-of-type(9){-webkit-transform:rotate(270deg);transform:rotate(270deg);opacity:.5}.van-loading__dot:nth-of-type(10){-webkit-transform:rotate(300deg);transform:rotate(300deg);opacity:.4375}.van-loading__dot:nth-of-type(11){-webkit-transform:rotate(330deg);transform:rotate(330deg);opacity:.375}.van-loading__dot:nth-of-type(12){-webkit-transform:rotate(1turn);transform:rotate(1turn);opacity:.3125}@-webkit-keyframes van-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes van-rotate{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}} | ||
51 | </style> |
src/wxcomponents/vant/loading/index.wxml
File was created | 1 | <view class="custom-class van-loading {{ vertical ? 'van-loading--vertical' : '' }}"> | |
2 | <view | ||
3 | class="van-loading__spinner van-loading__spinner--{{ type }}" | ||
4 | style="color: {{ color }}; width: {{ sizeWithUnit }}; height: {{ sizeWithUnit }}" | ||
5 | > | ||
6 | <view | ||
7 | wx:if="{{ type === 'spinner' }}" | ||
8 | wx:for="item in 12" | ||
9 | wx:key="index" | ||
10 | class="van-loading__dot" | ||
11 | /> | ||
12 | </view> | ||
13 | <view class="van-loading__text" style="font-size: {{ textSizeWithUnit }};"> | ||
14 | <slot /> | ||
15 | </view> | ||
16 | </view> | ||
17 |