You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.
< template >
< view class = "u-grid" : class = "{'u-border-top u-border-left': border}" :style ="[gridStyle]" > < slot / > < / view >
< / template >
< script >
/**
* grid 宫格布局
* @description 宫格组件一般用于同时展示多个同类项目的场景,可以给宫格的项目设置徽标组件(badge),或者图标等,也可以扩展为左右滑动的轮播形式。
* @tutorial https://www.uviewui.com/components/grid.html
* @property {String Number} col 宫格的列数( 默认3)
* @property {Boolean} border 是否显示宫格的边框( 默认true)
* @property {Boolean} hover-class 点击宫格的时候, 是否显示按下的灰色背景( 默认false)
* @event {Function} click 点击宫格触发
* @example <u-grid :col="3" @click="click"></u-grid>
*/
export default {
name : 'u-grid' ,
props : {
// 分成几列
col : {
type : [ Number , String ] ,
default : 3
} ,
// 是否显示边框
border : {
type : Boolean ,
default : true
} ,
// 宫格对齐方式,表现为数量少的时候,靠左,居中,还是靠右
align : {
type : String ,
default : 'left'
} ,
// 宫格按压时的样式类,"none"为无效果
hoverClass : {
type : String ,
default : 'u-hover-class'
}
} ,
data ( ) {
return {
index : 0 ,
}
} ,
watch : {
// 当父组件需要子组件需要共享的参数发生了变化,手动通知子组件
parentData ( ) {
if ( this . children . length ) {
this . children . map ( child => {
// 判断子组件(u-radio)如果有updateParentData方法的话, 就就执行(执行的结果是子组件重新从父组件拉取了最新的值)
typeof ( child . updateParentData ) == 'function' && child . updateParentData ( ) ;
} )
}
} ,
} ,
created ( ) {
// 如果将children定义在data中, 在微信小程序会造成循环引用而报错
this . children = [ ] ;
} ,
computed : {
// 计算父组件的值是否发生变化
parentData ( ) {
return [ this . hoverClass , this . col , this . size , this . border ] ;
} ,
// 宫格对齐方式
gridStyle ( ) {
let style = { } ;
switch ( this . align ) {
case 'left' :
style . justifyContent = 'flex-start' ;
break ;
case 'center' :
style . justifyContent = 'center' ;
break ;
case 'right' :
style . justifyContent = 'flex-end' ;
break ;
default : style . justifyContent = 'flex-start' ;
} ;
return style ;
}
} ,
methods : {
click ( index ) {
this . $emit ( 'click' , index ) ;
}
}
} ;
< / script >
< style scoped lang = "scss" >
@ import "../../libs/css/style.components.scss" ;
. u - grid {
width : 100 % ;
/* #ifdef MP */
position : relative ;
box - sizing : border - box ;
overflow : hidden ;
/* #endif */
/* #ifndef MP */
@ include vue - flex ;
flex - wrap : wrap ;
align - items : center ;
/* #endif */
}
< / style >