uni-data-checkbox.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826
  1. <template>
  2. <view class="uni-data-checklist">
  3. <template v-if="loading">
  4. <view class="uni-data-loading">
  5. <uni-load-more status="loading" iconType="snow" :iconSize="18" :content-text="contentText"></uni-load-more>
  6. </view>
  7. </template>
  8. <template v-else>
  9. <checkbox-group v-if="multiple" class="checklist-group" :class="{'is-list':mode==='list','is-wrap':wrap}" @change="chagne">
  10. <label class="checklist-box" :class="item.labelClass" :style="[item.styleBackgroud]" v-for="(item,index) in dataList"
  11. :key="index">
  12. <checkbox class="hidden" hidden :disabled="!!item.disabled" :value="item.value+''" :checked="item.selected" />
  13. <view v-if="(mode !=='tag' && mode !== 'list') || ( mode === 'list' && icon === 'left')" class="checkbox__inner"
  14. :class="item.checkboxBgClass" :style="[item.styleIcon]">
  15. <view class="checkbox__inner-icon" :class="item.checkboxClass"></view>
  16. </view>
  17. <view class="checklist-content" :class="{'list-content':mode === 'list' && icon ==='left'}">
  18. <text class="checklist-text" :class="item.textClass" :style="[item.styleIconText]">{{item.text}}</text>
  19. <view v-if="mode === 'list' && icon === 'right'" class="checkobx__list" :class="item.listClass" :style="[item.styleBackgroud]"></view>
  20. </view>
  21. </label>
  22. </checkbox-group>
  23. <radio-group v-else class="checklist-group" :class="{'is-list':mode==='list','is-wrap':wrap}" @change="chagne">
  24. <label class="checklist-box" :class="item.labelClass" :style="[item.styleBackgroud]" v-for="(item,index) in dataList" :key="index">
  25. <radio hidden :disabled="item.disabled" :value="item.value+''" :checked="item.selected" />
  26. <view v-if="(mode !=='tag' && mode !== 'list') || ( mode === 'list' && icon === 'left')" class="radio__inner"
  27. :class="item.checkboxBgClass" :style="[item.styleBackgroud]">
  28. <view class="radio__inner-icon" :class="item.checkboxClass" :style="[item.styleIcon]"></view>
  29. </view>
  30. <view class="checklist-content" :class="{'list-content':mode === 'list' && icon ==='left'}">
  31. <text class="checklist-text" :class="item.textClass" :style="[item.styleIconText]">{{item.text}}</text>
  32. <view v-if="mode === 'list' && icon === 'right'" class="checkobx__list" :class="item.listClass" :style="[item.styleRightIcon]"></view>
  33. </view>
  34. </label>
  35. </radio-group>
  36. </template>
  37. </view>
  38. </template>
  39. <script>
  40. /**
  41. * DataChecklist 数据选择器
  42. * @description 通过数据渲染 checkbox 和 radio
  43. * @tutorial https://ext.dcloud.net.cn/plugin?id=xxx
  44. * @property {String} mode = [default| list | button | tag] 显示模式
  45. * @value default 默认横排模式
  46. * @value list 列表模式
  47. * @value button 按钮模式
  48. * @value tag 标签模式
  49. * @property {Boolean} multiple = [true|false] 是否多选
  50. * @property {Array|String|Number} value 默认值
  51. * @property {Array} localdata 本地数据 ,格式 [{text:'',value:''}]
  52. * @property {Number|String} min 最小选择个数 ,multiple为true时生效
  53. * @property {Number|String} max 最大选择个数 ,multiple为true时生效
  54. * @property {Boolean} wrap 是否换行显示
  55. * @property {String} icon = [left|right] list 列表模式下icon显示位置
  56. * @property {Boolean} selectedColor 选中颜色
  57. * @property {Boolean} selectedTextColor 选中文本颜色,如不填写则自动显示
  58. * @value left 左侧显示
  59. * @value right 右侧显示
  60. * @event {Function} change 选中发生变化触发
  61. */
  62. import clientdb from './clientdb.js'
  63. export default {
  64. name: 'uniDataChecklist',
  65. mixins: [clientdb],
  66. props: {
  67. mode: {
  68. type: String,
  69. default: 'default'
  70. },
  71. multiple: {
  72. type: Boolean,
  73. default: false
  74. },
  75. value: {
  76. type: [Array, String, Number],
  77. default () {
  78. return ''
  79. }
  80. },
  81. localdata: {
  82. type: Array,
  83. default () {
  84. return []
  85. }
  86. },
  87. min: {
  88. type: [Number, String],
  89. default: ''
  90. },
  91. max: {
  92. type: [Number, String],
  93. default: ''
  94. },
  95. wrap: {
  96. type: Boolean,
  97. default: false
  98. },
  99. icon: {
  100. type: String,
  101. default: 'left'
  102. },
  103. selectedColor:{
  104. type: String,
  105. default: ''
  106. },
  107. selectedTextColor:{
  108. type: String,
  109. default: ''
  110. },
  111. // clientDB 相关
  112. options: {
  113. type: [Object, Array],
  114. default () {
  115. return {}
  116. }
  117. },
  118. collection: {
  119. type: String,
  120. default: ''
  121. },
  122. action: {
  123. type: String,
  124. default: ''
  125. },
  126. field: {
  127. type: String,
  128. default: ''
  129. },
  130. pageData: {
  131. type: String,
  132. default: 'add'
  133. },
  134. pageCurrent: {
  135. type: Number,
  136. default: 1
  137. },
  138. pageSize: {
  139. type: Number,
  140. default: 20
  141. },
  142. getcount: {
  143. type: [Boolean, String],
  144. default: false
  145. },
  146. orderby: {
  147. type: String,
  148. default: ''
  149. },
  150. where: {
  151. type: [String, Object],
  152. default: ''
  153. },
  154. getone: {
  155. type: [Boolean, String],
  156. default: false
  157. },
  158. manual: {
  159. type: Boolean,
  160. default: false
  161. }
  162. },
  163. watch: {
  164. localdata: {
  165. handler(newVal) {
  166. this.range = newVal
  167. this.dataList = this.getDataList(this.getSelectedValue(newVal))
  168. },
  169. deep: true
  170. },
  171. listData(newVal) {
  172. this.range = newVal
  173. this.dataList = this.getDataList(this.getSelectedValue(newVal))
  174. },
  175. value(newVal) {
  176. this.dataList = this.getDataList(newVal)
  177. this.formItem && this.formItem.setValue(newVal)
  178. }
  179. },
  180. data() {
  181. return {
  182. dataList: [],
  183. range: [],
  184. contentText: {
  185. contentdown: '查看更多',
  186. contentrefresh: '加载中',
  187. contentnomore: '没有更多'
  188. },
  189. styles: {
  190. selectedColor: '#007aff',
  191. selectedTextColor: '#333',
  192. }
  193. };
  194. },
  195. created() {
  196. this.form = this.getForm('uniForms')
  197. this.formItem = this.getForm('uniFormsItem')
  198. this.formItem && this.formItem.setValue(this.value)
  199. this.styles = {
  200. selectedColor: this.selectedColor,
  201. selectedTextColor: this.selectedTextColor
  202. }
  203. if (this.formItem) {
  204. if (this.formItem.name) {
  205. this.rename = this.formItem.name
  206. this.form.inputChildrens.push(this)
  207. }
  208. }
  209. if (this.localdata && this.localdata.length !== 0) {
  210. this.range = this.localdata
  211. this.dataList = this.getDataList(this.getSelectedValue(this.range))
  212. } else {
  213. if (this.collection) {
  214. this.loadData()
  215. }
  216. }
  217. },
  218. methods: {
  219. init(range) {},
  220. /**
  221. * 获取父元素实例
  222. */
  223. getForm(name = 'uniForms') {
  224. let parent = this.$parent;
  225. let parentName = parent.$options.name;
  226. while (parentName !== name) {
  227. parent = parent.$parent;
  228. if (!parent) return false
  229. parentName = parent.$options.name;
  230. }
  231. return parent;
  232. },
  233. chagne(e) {
  234. const values = e.detail.value
  235. let detail = {
  236. value: [],
  237. data: []
  238. }
  239. if (this.multiple) {
  240. this.range.forEach(item => {
  241. if (values.includes(item.value + '')) {
  242. detail.value.push(item.value)
  243. detail.data.push(item)
  244. }
  245. })
  246. } else {
  247. const range = this.range.find(item => (item.value + '') === values)
  248. if (range) {
  249. detail = {
  250. value: range.value,
  251. data: range
  252. }
  253. }
  254. }
  255. this.formItem && this.formItem.setValue(detail.value)
  256. this.$emit('input', detail.value)
  257. this.$emit('change', {
  258. detail
  259. })
  260. if (this.multiple) {
  261. // 如果 v-model 没有绑定 ,则走内部逻辑
  262. // if (this.value.length === 0) {
  263. this.dataList = this.getDataList(detail.value, true)
  264. // }
  265. } else {
  266. this.dataList = this.getDataList(detail.value)
  267. }
  268. },
  269. getLabelClass(item, index) {
  270. let classes = []
  271. switch (this.mode) {
  272. case 'default':
  273. item.disabled && classes.push('disabled-cursor')
  274. break
  275. case 'button':
  276. classes.push(...['is-button', ...this.getClasses(item, 'button')])
  277. break
  278. case 'list':
  279. if (this.multiple) {
  280. classes.push('is-list-multiple-box')
  281. } else {
  282. classes.push('is-list-box')
  283. }
  284. item.disabled && classes.push('is-list-disabled')
  285. index !== 0 && classes.push('is-list-border')
  286. break
  287. case 'tag':
  288. classes.push(...['is-tag', ...this.getClasses(item, 'tag')])
  289. break
  290. }
  291. classes = classes.join(' ')
  292. return classes
  293. },
  294. getCheckboxClass(item, type = '') {
  295. let classes = []
  296. if (this.multiple) {
  297. classes.push(...this.getClasses(item, 'default-multiple', type))
  298. } else {
  299. classes.push(...this.getClasses(item, 'default', type))
  300. }
  301. classes = classes.join(' ')
  302. return classes
  303. },
  304. getTextClass(item) {
  305. let classes = []
  306. switch (this.mode) {
  307. case 'default':
  308. classes.push(...this.getClasses(item, 'list'))
  309. break
  310. case 'button':
  311. classes.push(...this.getClasses(item, 'list'))
  312. break
  313. case 'list':
  314. classes.push(...this.getClasses(item, 'list'))
  315. break
  316. case 'tag':
  317. classes.push(...['is-tag-text', ...this.getClasses(item, 'tag-text')])
  318. break
  319. }
  320. classes = classes.join(' ')
  321. return classes
  322. },
  323. /**
  324. * 获取渲染的新数组
  325. * @param {Object} value 选中内容
  326. */
  327. getDataList(value) {
  328. // 解除引用关系,破坏原引用关系,避免污染源数据
  329. let dataList = JSON.parse(JSON.stringify(this.range))
  330. let list = []
  331. if (this.multiple) {
  332. if (!Array.isArray(value)) {
  333. value = []
  334. // console.error('props 类型错误');
  335. }
  336. }
  337. dataList.forEach((item, index) => {
  338. item.disabled = item.disable || item.disabled || false
  339. if (this.multiple) {
  340. if (value.length > 0) {
  341. let have = value.find(val => val === item.value)
  342. item.selected = have !== undefined
  343. } else {
  344. item.selected = false
  345. }
  346. } else {
  347. item.selected = value === item.value
  348. }
  349. list.push(item)
  350. })
  351. return this.setRange(list)
  352. },
  353. /**
  354. * 处理最大最小值
  355. * @param {Object} list
  356. */
  357. setRange(list) {
  358. let selectList = list.filter(item => item.selected)
  359. let min = Number(this.min) || 0
  360. let max = Number(this.max) || ''
  361. list.forEach((item, index) => {
  362. if (this.multiple) {
  363. if (selectList.length <= min) {
  364. let have = selectList.find(val => val.value === item.value)
  365. if (have !== undefined) {
  366. item.disabled = true
  367. }
  368. }
  369. if (selectList.length >= max && max !== '') {
  370. let have = selectList.find(val => val.value === item.value)
  371. if (have === undefined) {
  372. item.disabled = true
  373. }
  374. }
  375. }
  376. this.setClass(item, index)
  377. list[index] = item
  378. })
  379. return list
  380. },
  381. /**
  382. * 设置 class
  383. * @param {Object} item
  384. * @param {Object} index
  385. */
  386. setClass(item, index) {
  387. // 设置 label 的 class
  388. item.labelClass = this.getLabelClass(item, index)
  389. // 设置 checkbox外层样式
  390. item.checkboxBgClass = this.getCheckboxClass(item, '-bg')
  391. // 设置 checkbox 内层样式
  392. item.checkboxClass = this.getCheckboxClass(item)
  393. // 设置文本样式
  394. item.textClass = this.getTextClass(item)
  395. // 设置 list 对勾右侧样式
  396. item.listClass = this.getCheckboxClass(item, '-list')
  397. // 设置自定义样式
  398. item.styleBackgroud = this.setStyleBackgroud(item)
  399. item.styleIcon = this.setStyleIcon(item)
  400. item.styleIconText = this.setStyleIconText(item)
  401. item.styleRightIcon = this.setStyleRightIcon(item)
  402. },
  403. /**
  404. * 获取 class
  405. */
  406. getClasses(item, name, type = '') {
  407. let classes = []
  408. item.disabled && classes.push('is-' + name + '-disabled' + type)
  409. item.selected && classes.push('is-' + name + '-checked' + type)
  410. if (this.mode !== 'button' || name === 'button') {
  411. item.selected && item.disabled && classes.push('is-' + name + '-disabled-checked' + type)
  412. }
  413. return classes
  414. },
  415. /**
  416. * 获取选中值
  417. * @param {Object} range
  418. */
  419. getSelectedValue(range) {
  420. if (!this.multiple) return this.value
  421. let selectedArr = []
  422. range.forEach((item) => {
  423. if (item.selected) {
  424. selectedArr.push(item.value)
  425. }
  426. })
  427. return this.value.length > 0 ? this.value : selectedArr
  428. },
  429. /**
  430. * 设置背景样式
  431. */
  432. setStyleBackgroud(item) {
  433. let styles = {}
  434. if (item.selected) {
  435. if (this.mode !== 'list') {
  436. styles.borderColor = this.styles.selectedColor
  437. }
  438. if (this.mode === 'tag') {
  439. styles.backgroundColor = this.styles.selectedColor
  440. }
  441. }
  442. return styles
  443. },
  444. setStyleIcon(item) {
  445. let styles = {}
  446. if (item.selected) {
  447. styles.backgroundColor = this.styles.selectedColor
  448. styles.borderColor = this.styles.selectedColor
  449. }
  450. return styles
  451. },
  452. setStyleIconText(item) {
  453. let styles = {}
  454. if (item.selected) {
  455. if (this.styles.selectedTextColor) {
  456. styles.color = this.styles.selectedTextColor
  457. } else {
  458. if(this.mode === 'tag'){
  459. styles.color = '#fff'
  460. }else{
  461. styles.color = this.styles.selectedColor
  462. }
  463. }
  464. }
  465. return styles
  466. },
  467. setStyleRightIcon(item){
  468. let styles = {}
  469. if (item.selected) {
  470. if(this.mode === 'list'){
  471. styles.borderColor = this.styles.selectedColor
  472. }
  473. }
  474. return styles
  475. }
  476. }
  477. }
  478. </script>
  479. <style>
  480. .uni-data-checklist {
  481. position: relative;
  482. z-index: 0;
  483. /* min-height: 36px; */
  484. }
  485. .uni-data-loading {
  486. display: flex;
  487. align-items: center;
  488. /* justify-content: center; */
  489. height: 36px;
  490. padding-left: 10px;
  491. }
  492. .checklist-group {
  493. /* #ifndef APP-NVUE */
  494. display: flex;
  495. /* #endif */
  496. flex-direction: row;
  497. flex-wrap: wrap;
  498. }
  499. .checklist-box {
  500. /* #ifndef APP-NVUE */
  501. display: flex;
  502. /* #endif */
  503. flex-direction: row;
  504. align-items: center;
  505. margin: 5px 0;
  506. margin-right: 25px;
  507. }
  508. .checklist-text {
  509. font-size: 14px;
  510. color: #333;
  511. margin-left: 5px;
  512. transition: color 0.2s;
  513. }
  514. .is-button {
  515. margin-right: 10px;
  516. padding: 3px 15px;
  517. border: 1px #DCDFE6 solid;
  518. border-radius: 3px;
  519. transition: border-color 0.2s;
  520. }
  521. .is-list {
  522. flex-direction: column;
  523. }
  524. .is-list-box {
  525. /* #ifndef APP-NVUE */
  526. display: flex;
  527. /* #endif */
  528. padding: 10px 15px;
  529. padding-left: 0;
  530. margin: 0;
  531. }
  532. .checklist-content {
  533. /* #ifndef APP-NVUE */
  534. display: flex;
  535. /* #endif */
  536. flex: 1;
  537. flex-direction: row;
  538. align-items: center;
  539. justify-content: space-between;
  540. }
  541. .list-content {
  542. margin-left: 5px;
  543. }
  544. .is-list-multiple-box {
  545. /* #ifndef APP-NVUE */
  546. display: flex;
  547. /* #endif */
  548. padding: 10px 15px;
  549. padding-left: 0;
  550. margin: 0;
  551. }
  552. .is-list-border {
  553. border-top: 1px #eee solid;
  554. }
  555. .is-tag {
  556. margin-right: 10px;
  557. padding: 3px 10px;
  558. border: 1px #eee solid;
  559. border-radius: 3px;
  560. background-color: #f5f5f5;
  561. /* transition: border-color 0.1s; */
  562. }
  563. .is-tag-text {
  564. margin: 0;
  565. color: #666;
  566. }
  567. .checkbox__inner {
  568. flex-shrink: 0;
  569. position: relative;
  570. border: 1px solid #DCDFE6;
  571. border-radius: 2px;
  572. box-sizing: border-box;
  573. width: 16px;
  574. height: 16px;
  575. background-color: #fff;
  576. z-index: 1;
  577. transition: border-color 0.1s;
  578. }
  579. .checkbox__inner-icon {
  580. border: 1px solid #fff;
  581. border-left: 0;
  582. border-top: 0;
  583. height: 8px;
  584. left: 5px;
  585. position: absolute;
  586. top: 1px;
  587. width: 3px;
  588. opacity: 0;
  589. transition: transform .2s;
  590. transform-origin: center;
  591. transform: rotate(40deg) scaleY(0.4);
  592. }
  593. .radio__inner {
  594. flex-shrink: 0;
  595. /* #ifndef APP-NVUE */
  596. display: flex;
  597. /* #endif */
  598. justify-content: center;
  599. align-items: center;
  600. position: relative;
  601. border: 1px solid #DCDFE6;
  602. border-radius: 2px;
  603. box-sizing: border-box;
  604. width: 16px;
  605. height: 16px;
  606. border-radius: 16px;
  607. background-color: #fff;
  608. z-index: 1;
  609. transition: border-color .3s;
  610. }
  611. .radio__inner-icon {
  612. width: 8px;
  613. height: 8px;
  614. border-radius: 10px;
  615. opacity: 0;
  616. transition: transform .3s;
  617. }
  618. .checkobx__list {
  619. border: 1px solid #fff;
  620. border-left: 0;
  621. border-top: 0;
  622. height: 12px;
  623. width: 6px;
  624. transform-origin: center;
  625. opacity: 0;
  626. transition: all 0.3s;
  627. transform: rotate(45deg);
  628. }
  629. /* 禁用样式 */
  630. .is-default-disabled-bg {
  631. background-color: #F2F6FC;
  632. border-color: #DCDFE6;
  633. /* #ifdef H5 */
  634. cursor: not-allowed;
  635. /* #endif */
  636. }
  637. .is-default-multiple-disabled-bg {
  638. background-color: #F2F6FC;
  639. border-color: #DCDFE6;
  640. /* #ifdef H5 */
  641. cursor: not-allowed;
  642. /* #endif */
  643. }
  644. .is-default-disabled {
  645. border-color: #F2F6FC;
  646. }
  647. .is-default-multiple-disabled {
  648. border-color: #F2F6FC;
  649. }
  650. .is-list-disabled {
  651. /* #ifdef H5 */
  652. cursor: not-allowed;
  653. /* #endif */
  654. color: #999;
  655. }
  656. .is-list-disabled-checked {
  657. color: #a1dcc1;
  658. }
  659. .is-button-disabled {
  660. /* #ifdef H5 */
  661. cursor: not-allowed;
  662. /* #endif */
  663. border-color: #EBEEF5;
  664. }
  665. .is-button-text-disabled {
  666. color: #C0C4CC;
  667. }
  668. .is-button-disabled-checked {
  669. border-color: #a1dcc1;
  670. }
  671. .is-tag-disabled {
  672. /* #ifdef H5 */
  673. cursor: not-allowed;
  674. /* #endif */
  675. border-color: #e9e9eb;
  676. background-color: #f4f4f5;
  677. }
  678. .is-tag-text-disabled {
  679. color: #bcbec2;
  680. }
  681. /* 选中样式 */
  682. .is-default-checked-bg {
  683. border-color: #007aff;
  684. }
  685. .is-default-multiple-checked-bg {
  686. border-color: #007aff;
  687. background-color: #007aff;
  688. }
  689. .is-default-checked {
  690. opacity: 1;
  691. background-color: #007aff;
  692. transform: rotate(45deg) scaleY(1);
  693. }
  694. .is-default-multiple-checked {
  695. opacity: 1;
  696. transform: rotate(45deg) scaleY(1);
  697. }
  698. .is-default-disabled-checked-bg {
  699. opacity: 0.4;
  700. }
  701. .is-default-multiple-disabled-checked-bg {
  702. opacity: 0.4;
  703. }
  704. .is-default-checked-list {
  705. border-color: #007aff;
  706. opacity: 1;
  707. transform: rotate(45deg) scaleY(1);
  708. }
  709. .is-default-multiple-checked-list {
  710. border-color: #007aff;
  711. opacity: 1;
  712. transform: rotate(45deg) scaleY(1);
  713. }
  714. .is-list-disabled-checked {
  715. opacity: 0.4;
  716. }
  717. .is-default-disabled-checked-list {
  718. opacity: 0.4;
  719. }
  720. .is-default-multiple-disabled-checked-list {
  721. opacity: 0.4;
  722. }
  723. .is-button-checked {
  724. border-color: #007aff;
  725. }
  726. .is-button-disabled-checked {
  727. opacity: 0.4;
  728. }
  729. .is-list-checked {
  730. color: #007aff;
  731. }
  732. .is-tag-checked {
  733. border-color: #007aff;
  734. background-color: #007aff;
  735. }
  736. .is-tag-text-checked {
  737. color: #fff;
  738. }
  739. .is-tag-disabled-checked {
  740. opacity: 0.4;
  741. }
  742. .disabled-cursor {
  743. /* #ifdef H5 */
  744. cursor: not-allowed;
  745. /* #endif */
  746. }
  747. .is-wrap {
  748. flex-direction: column;
  749. }
  750. .hidden {
  751. /* #ifdef MP-ALIPAY */
  752. display: none;
  753. /* #endif */
  754. }
  755. </style>