- This is a vue component that contains waterfall flow layout and infinite scroll loading
- Compared to other implementations,there is no need to specify the width and height of the image in the returned data
- It is because of the second item that the image is preloaded and then layout
- Responsive layout,adapt mobile
- Simple to use
npm install vue-waterfall-easy --save
import vueWaterfallEasy from 'vue-waterfall-easy'
export default {
name: 'app',
components: {
vueWaterfallEasy
}
}
<script src="path/to/vue/vue.js"></script>
<script src="path/to/vueWaterfallEasy.js"></script>
new Vue({
el: '#app',
components: {
vueWaterfallEasy
}
})
html
<vue-waterfall-easy :imgsArr="imgsArr" @scrollReachBottom="getData"></vue-waterfall-easy>
getData method new request returned data should merged with the original data
js
import vueWaterfallEasy from './vue-waterfall-easy/vue-waterfall-easy.vue'
import axios from 'axios'
export default {
name: 'app',
data() {
return {
imgsArr: [],
group: 0,// request param
}
},
components: {
vueWaterfallEasy
},
methods: {
getData(group) {
// In the real environment,the backend will return a new image array based on the parameter group.
// Here I simulate it with a stunned json file.
axios.get('./static/mock/data.json?group=' + this.group)
.then(res => {
this.imgsArr = this.imgsArr.concat(res.data)
group++
})
},
},
created() {
this.getData()
}
}
props | type | default | description |
---|---|---|---|
width | Number | - | Container width,default is 100% relative parent element width,Due to the responsiveness,all its parent's width must be 100% relative to the browser window at this time,See the example after the table **If it is fixed width, you must set the width prop **, not just its parent element set fixed width |
height | Number | - | Container height,default is 100% relative parent element height The parent element must have a height when the height prop is not passed |
gap | Number | 20 | space between pictures(px) |
imgsArr | Array | [] | required Data used to render the waterfall stream Each array element is an object and must have src and href attributes.The src attribute represents the SRC attribute of the pictureThe href attribute represents the link to click to jump if your key is not src and href , you can use the two properties of srcKey and hrefKey to do the key value replacement. |
srcKey | String | 'src' | When the key value of your picture address is not src , you can use this property to replace it. |
hrefKey | String | 'href' | When the key value of your picture address is not href , you can use this property to replace it. |
imgWidth | Number | 240 | The width of the picture(px) |
maxCols | Number | 5 | Waterfall shows the maximum number of columns |
linkRange | String | 'card' | Identify click to trigger jump link range value: 'card' Whole card range 'img' image range 'custom' Customize the link range through slots |
isRouterLink | Boolean | false | Render the a tag when the value is false Render the router-link component when the value is true |
reachBottomDistance | Number | 0 | The distance(px) from the bottom of the container when the scrolling triggers the scrollReachBottom event |
loadingDotCount | Number | 3 | The number of default loading animation dots |
loadingDotStyle | Object | null | The style object of the small dots in the default loading element |
loadingTimeOut | Number | 500 | Preloading events less than 500ms milliseconds do not display loading animations,increasing the user experience |
event name | description |
---|---|
scrollReachBottom | When the scroll bar scrolls to the bottom,it is used to trigger a request for new image data |
preloaded | Trigger every time image preloading is completed |
click | Trigger when the card is clicked,look at an example under the table |
click event demo
<vue-waterfall-easy :imgsArr="imgsArr" @scrollReachBottom="getData" @click="clickFn"></vue-waterfall-easy>
clickFn(event, { index, value }) {
// Prevent a tag jump
event.preventDefault()
// Do it only when you click on the image
if (event.target.tagName.toLowerCase() == 'img') {
console.log('img clicked',index, value)
}
}
Custom picture description element
parameterpar | description |
---|---|
props.index | The index of the image in the data array,starting from 0 |
props.value | The value of imgsArr item |
<vue-waterfall-easy :imgsArr="imgsArr" @scrollReachBottom="getData">
<div class="img-info" slot-scope="props">
<p class="some-info">picture index: {{props.index}}</p>
<p class="some-info">{{props.value.info}}</p>
</div>
</vue-waterfall-easy>
Custom loading element
<div slot="loading" slot-scope="{isFirstLoad}">
<div slot="loading" v-if="isFirstLoad">first-loading...</div>
<div v-else="v-else">loading...</div>
</div>
Waterfall container head slot
<vue-waterfall-easy :imgsArr="imgsArr" @scrollReachBottom="getData">
<div slot="waterfall-head">waterfall-head</div>
</vue-waterfall-easy>
Don't forget to add following code in index.html <head>
<meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no">