quanyawei
2024-03-01 bd99a5211f3a5fcaa051e5da868d87bb870148f5
uni_modules/uview-ui/components/u-row/u-row.vue
New file
@@ -0,0 +1,93 @@
<template>
   <view
       class="u-row"
      ref="u-row"
       :style="[rowStyle]"
       @tap="clickHandler"
   >
      <slot />
   </view>
</template>
<script>
   // #ifdef APP-NVUE
   const dom = uni.requireNativePlugin('dom')
   // #endif
   import props from './props.js';
   /**
    * Row 栅格系统中的行
    * @description 通过基础的 12 分栏,迅速简便地创建布局
    * @tutorial https://www.uviewui.com/components/layout.html
    * @property {String | Number}   gutter      栅格间隔,左右各为此值的一半,单位px  (默认 0 )
    * @property {String}         justify      水平排列方式(微信小程序暂不支持) 可选值为`start`(或`flex-start`)、`end`(或`flex-end`)、`center`、`around`(或`space-around`)、`between`(或`space-between`)  (默认 'start' )
    * @property {String}         align      垂直排列方式 (默认 'center' )
    * @property {Object}         customStyle   定义需要用到的外部样式
    *
    * @event {Function} click row被点击
    * @example <u-row justify="space-between" customStyle="margin-bottom: 10px"></u-row>
    */
   export default {
      name: "u-row",
      mixins: [uni.$u.mpMixin, uni.$u.mixin, props],
      data() {
         return {
         }
      },
      computed: {
         uJustify() {
            if (this.justify == 'end' || this.justify == 'start') return 'flex-' + this.justify
            else if (this.justify == 'around' || this.justify == 'between') return 'space-' + this.justify
            else return this.justify
         },
         uAlignItem() {
            if (this.align == 'top') return 'flex-start'
            if (this.align == 'bottom') return 'flex-end'
            else return this.align
         },
         rowStyle() {
            const style = {
               alignItems: this.uAlignItem,
               justifyContent: this.uJustify
            }
            // 通过给u-row左右两边的负外边距,消除u-col在有gutter时,第一个和最后一个元素的左内边距和右内边距造成的影响
            if(this.gutter) {
               style.marginLeft = uni.$u.addUnit(-Number(this.gutter)/2)
               style.marginRight = uni.$u.addUnit(-Number(this.gutter)/2)
            }
            return uni.$u.deepMerge(style, uni.$u.addStyle(this.customStyle))
         }
      },
      methods: {
         clickHandler(e) {
            this.$emit('click')
         },
         async getComponentWidth() {
            // 延时一定时间,以确保节点渲染完成
            await uni.$u.sleep()
            return new Promise(resolve => {
               // uView封装的获取节点的方法,详见文档
               // #ifndef APP-NVUE
               this.$uGetRect('.u-row').then(res => {
                  resolve(res.width)
               })
               // #endif
               // #ifdef APP-NVUE
               // nvue的dom模块用于获取节点
               dom.getComponentRect(this.$refs['u-row'], (res) => {
                  resolve(res.size.width)
               })
               // #endif
            })
         },
      }
   }
</script>
<style lang="scss" scoped>
   @import "../../libs/css/components.scss";
   .u-row {
      @include flex;
   }
</style>