BrickLayout 晓瀑布流为使用者提供开箱即用的瀑布流布局的一种可行性的方案,使用者仅需要按照对应所需的字段传入瀑布流组件,即可快速实现瀑布流布局。支持排序和动态展开收起。
BrickLayout 晓瀑布流为使用者提供开箱即用的瀑布流布局的一种可行性的方案,使用者仅需要按照对应所需的字段传入瀑布流组件,即可快速实现瀑布流布局。未来的瀑布流组件将会提供更多样式、适用更多场景的瀑布流模板,敬请期待!希望有更多场景推荐,希望有更多内容定制,欢迎留言或者告诉我们 👏
由于小程序的诸多限制,导致在 web 上很多常规实现瀑布流的方式大多受到不同程度的影响,小程序中,实现瀑布流组件大抵有两种思路:采用纯粹的 css 来实现,或者通过数据处理配合 css 来实现瀑布流。
采用纯粹的 css
采用纯粹的 css 实现瀑布流,可以用 multi-column 利用 css3 属性实现多列布局、flex 布局、grid 布局等等。但是结合每个布局的特性,我们率先排除了 grid 布局,因为 grid 布局是实现相对有规则的网格布局,瀑布流布局中,grid 布局不适用。其次,我们排除了 multi-column 这个 css3 属性。在呈现效果上看,multi-column 的确很好地满足了我们对于瀑布流布局的样式布局要求,但是,multi-column 本质上是将文档流分为多列,也就是我们在杂志、报刊常见的多列布局,最后呈现效果(如下图)实际上不满足我们对有序数据的展现要求,因此而排除。
最后我们的考虑范围只剩下 flex 布局,flex 布局在初始状态下的确很好地满足了我们对于数据的呈现效果,但是如果不加以数据干预,在默认非展开的情况下展开单个卡片,极端情况下会导致两列高度差过大,破坏了我们对于瀑布流的要求。
css 配合数据处理
综上所述,我们采用了 flex 布局加之对于使用者所传入的数据进行处理,达成了我们想要的效果。前端展现方面,我们还是通过 flex 布局,达成实际的瀑布流呈现效果,对于数据变化亦或是卡片展开时,我们再对数据进行进一步的处理,只有在初始化的时候,或者卡片状态发生改变的时候,对两列高度进行计算,保证两列保持较为稳定的高度差,进而实现瀑布流布局。
通过 BrickLayout 晓瀑布流使用者无须在关心实际的瀑布流布局实现,也无需关心前端的实际样式布局,更加专注于业务逻辑开发。未来的 BrickLayout 晓瀑布流将为使用者提供更加多样的模板,适用于不同场景之下的瀑布流布局。
在微信小程序管理后台中,按 APPID wx3c042630f3cdc175
搜索到该插件,点击添加,即可在代码中使用 brickLayout
。
在 app.json
里,声明该插件的引入,目前该插件为 0.1.1
,provider
为该插件的 APPID,brickLayout
为自定义的插件名称。
"plugins": {
"brickLayout": {
"version": "0.1.1",
"provider": "wx3c042630f3cdc175"
}
}
json
配置文件中,作如下配置:{
"usingComponents": {
"brickLayout": "plugin://brickLayout/brickLayout"
}
}
<brickLayout
dataSet="{{dataSet}}"
option="{{brick_option}}"
bind:tapCard="tapCard"
bind:tapLike="tapLike"
bind:tapUser="tapUser"
bind:onCardExpanded="onCardExpanded"
/>
Array<Object>
string
string
string
unix timestamp
number
bool
Object
string
(optional param) avatar
用户头像 url 如果不填默认没有头像string
(optional param) username
用户名 如果不填默认没有用户名string
(optional param) userId
用户 id, 如果需要点击用户区域相关事件,可以传入 userId
,用于相关点击用户区域事件回调[
{
id: '1',
content:
'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ',
backgroundColor: '#fff',
time: 1533106010,
likedCount: 0,
liked: false,
user: {
avatar: 'user_avatar_url',
name: 'Minya Chan',
userId: '1'
}
},
{
id: '2',
content:
'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ',
backgroundColor: '#fff',
time: 1533106010,
likedCount: 0,
liked: false,
user: {
avatar: 'user_avatar_url',
name: 'Minya Chan',
userId: '1'
}
}
]
Object
bool
false
,即为默认收起string
card.backgroundColor
> backgoundColor
> randomColor
bool
false
,即默认认为源数据的改变只是追加、变更或者减少数据时,不重置卡片的展开状态和高度等等。{
defaultExpandStatus: false,
ackgroundColor: '#ababab',
forceRepaint: false
}
如调用的组件的 wxml 声明如下:
<brickLayout
dataSet="{{dataSet}}"
option="{{brick_option}}"
bind:tapCard="tapCard"
bind:tapLike="tapLike"
bind:tapUser="tapUser"
bind:onCardExpanded="onCardExpanded"
/>
function
event.detail.card_id
拿到对应的卡片的 id,该卡片 id 为 dataSet 里面的唯一标志,唯一标志该数据记录。tapCard: function (event) {
const cardId = event.detail.card_id
// code here.
console.log('tap card!')
},
function
event.detail.card_id
拿到对应的卡片的 id,该卡片 id 为 dataSet 里面的唯一标志,唯一标志该数据记录。tapLike: function (event) {
const cardId = event.detail.card_id
// code here.
console.log('tap like!')
},
function
userId
,使用过程中,可以通过 event.detail.user_id
拿到所对应的用户 userIdtapUser: function (event) {
const userId = event.detail.user_id
// code here.
console.log('tap user!')
},
function
event.detail.card_id
拿到所对应触发的卡片 id ,该卡片 id 为 dataSet 里面的唯一标志,唯一标志该数据记录;同时还可以通过 event.detail.expand_status
拿到当前卡片的展开状态,true
代表目前为 展开
状态。onCardExpanded:function(event){
const cardId = event.detail.card_id
const expandStatus = event.detail.expand_status
// code here
console.log("expand call back")
},
1 个评论
使用setData后去计算高度,计算不是很准确,有部分是相同数值。使用setTimeOut延时验证ok,应该是setData后还没渲染完成。如何处理这种情况
由于一些 Android 机型和老点的 iOS 机型的性能问题,考虑将 timeout 的加大一点,可以根据当前机器信息决定 timeout。
timeout不是很靠谱的,况且这么多机型。建议图片宽高比固定好,只计算文本会好点