<template> 
 | 
    <view :class="[ 'uni-row', typeClass , justifyClass, alignClass, ]" :style="{ 
 | 
        marginLeft:`${Number(marginValue)}rpx`, 
 | 
        marginRight:`${Number(marginValue)}rpx`, 
 | 
    }"> 
 | 
        <slot></slot> 
 | 
    </view> 
 | 
</template> 
 | 
  
 | 
<script> 
 | 
    const ComponentClass = 'uni-row'; 
 | 
    const modifierSeparator = '--'; 
 | 
    /** 
 | 
     * Row    布局-行 
 | 
     * @description    流式栅格系统,随着屏幕或视口分为 24 份,可以迅速简便地创建布局。 
 | 
     * @tutorial    https://ext.dcloud.net.cn/plugin?id=3958 
 | 
     * 
 | 
     * @property    {gutter} type = Number 栅格间隔 
 | 
     * @property    {justify} type = String flex 布局下的水平排列方式 
 | 
     *                         可选    start/end/center/space-around/space-between    start 
 | 
     *                         默认值    start 
 | 
     * @property    {align} type = String flex 布局下的垂直排列方式 
 | 
     *                         可选    top/middle/bottom 
 | 
     *                         默认值    top 
 | 
     * @property    {width} type = String|Number nvue下需要自行配置宽度用于计算 
 | 
     *                         默认值 750 
 | 
     */ 
 | 
  
 | 
  
 | 
    export default { 
 | 
        name: 'uniRow', 
 | 
        componentName: 'uniRow', 
 | 
        // #ifdef MP-WEIXIN 
 | 
        options: { 
 | 
            virtualHost: true // 在微信小程序中将组件节点渲染为虚拟节点,更加接近Vue组件的表现,可使用flex布局 
 | 
        }, 
 | 
        // #endif 
 | 
        props: { 
 | 
            type: String, 
 | 
            gutter: Number, 
 | 
            justify: { 
 | 
                type: String, 
 | 
                default: 'start' 
 | 
            }, 
 | 
            align: { 
 | 
                type: String, 
 | 
                default: 'top' 
 | 
            }, 
 | 
            // nvue如果使用span等属性,需要配置宽度 
 | 
            width: { 
 | 
                type: [String, Number], 
 | 
                default: 750 
 | 
            } 
 | 
        }, 
 | 
        created() { 
 | 
            // #ifdef APP-NVUE 
 | 
            this.type = 'flex'; 
 | 
            // #endif 
 | 
        }, 
 | 
        computed: { 
 | 
            marginValue() { 
 | 
                // #ifndef APP-NVUE 
 | 
                if (this.gutter) { 
 | 
                    return -(this.gutter / 2); 
 | 
                } 
 | 
                // #endif 
 | 
                return 0; 
 | 
            }, 
 | 
            typeClass() { 
 | 
                return this.type === 'flex' ? `${ComponentClass + modifierSeparator}flex` : ''; 
 | 
            }, 
 | 
            justifyClass() { 
 | 
                return this.justify !== 'start' ? `${ComponentClass + modifierSeparator}flex-justify-${this.justify}` : '' 
 | 
            }, 
 | 
            alignClass() { 
 | 
                return this.align !== 'top' ? `${ComponentClass + modifierSeparator}flex-align-${this.align}` : '' 
 | 
            } 
 | 
        } 
 | 
    }; 
 | 
</script> 
 | 
  
 | 
<style lang="scss"> 
 | 
    $layout-namespace: ".uni-"; 
 | 
    $row:$layout-namespace+"row"; 
 | 
    $modifier-separator: "--"; 
 | 
  
 | 
    @mixin utils-clearfix { 
 | 
        $selector: &; 
 | 
  
 | 
        @at-root { 
 | 
  
 | 
            /* #ifndef APP-NVUE */ 
 | 
            #{$selector}::before, 
 | 
            #{$selector}::after { 
 | 
                display: table; 
 | 
                content: ""; 
 | 
            } 
 | 
  
 | 
            #{$selector}::after { 
 | 
                clear: both; 
 | 
            } 
 | 
  
 | 
            /* #endif */ 
 | 
        } 
 | 
  
 | 
    } 
 | 
  
 | 
    @mixin utils-flex ($direction: row) { 
 | 
        /* #ifndef APP-NVUE */ 
 | 
        display: flex; 
 | 
        /* #endif */ 
 | 
        flex-direction: $direction; 
 | 
    } 
 | 
  
 | 
    @mixin set-flex($state) { 
 | 
        @at-root &-#{$state} { 
 | 
            @content 
 | 
        } 
 | 
    } 
 | 
  
 | 
    #{$row} { 
 | 
        position: relative; 
 | 
        flex-direction: row; 
 | 
  
 | 
        /* #ifdef APP-NVUE */ 
 | 
        flex: 1; 
 | 
        /* #endif */ 
 | 
  
 | 
        /* #ifndef APP-NVUE */ 
 | 
        box-sizing: border-box; 
 | 
        /* #endif */ 
 | 
  
 | 
        // 非nvue使用float布局 
 | 
        @include utils-clearfix; 
 | 
  
 | 
        // 在QQ、字节、百度小程序平台,编译后使用shadow dom,不可使用flex布局,使用float 
 | 
        @at-root { 
 | 
  
 | 
            /* #ifndef MP-QQ || MP-TOUTIAO || MP-BAIDU */ 
 | 
            &#{$modifier-separator}flex { 
 | 
                @include utils-flex; 
 | 
                flex-wrap: wrap; 
 | 
                flex: 1; 
 | 
  
 | 
                &:before, 
 | 
                &:after { 
 | 
                    /* #ifndef APP-NVUE */ 
 | 
                    display: none; 
 | 
                    /* #endif */ 
 | 
                } 
 | 
  
 | 
                @include set-flex(justify-center) { 
 | 
                    justify-content: center; 
 | 
                } 
 | 
  
 | 
                @include set-flex(justify-end) { 
 | 
                    justify-content: flex-end; 
 | 
                } 
 | 
  
 | 
                @include set-flex(justify-space-between) { 
 | 
                    justify-content: space-between; 
 | 
                } 
 | 
  
 | 
                @include set-flex(justify-space-around) { 
 | 
                    justify-content: space-around; 
 | 
                } 
 | 
  
 | 
                @include set-flex(align-middle) { 
 | 
                    align-items: center; 
 | 
                } 
 | 
  
 | 
                @include set-flex(align-bottom) { 
 | 
                    align-items: flex-end; 
 | 
                } 
 | 
            } 
 | 
  
 | 
            /* #endif */ 
 | 
        } 
 | 
  
 | 
    } 
 | 
  
 | 
    // 字节、QQ配置后不生效 
 | 
    // 此处用法无法使用 
 | 
    /* #ifdef MP-WEIXIN || MP-TOUTIAO || MP-QQ */ 
 | 
    :host { 
 | 
        display: block; 
 | 
    } 
 | 
  
 | 
    /* #endif */ 
 | 
</style> 
 |