Buefy is a UI framework that’s based on Bulma.
In this article, we’ll look at how to use Buefy in our Vue app.
Icons
We can add icons with the b-icon
component.
To do that, we add our icon CSS:
<link
rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css"
integrity="sha384-wvfXpqpZZVQGK6TAh5PVlGOfQNHSoD2xbE+QkPxCAFlNEevoEH3Sl0sibVcOQVnN"
crossorigin="anonymous"
/>
into our head
tag of the public/index.html
file.
Then in our component, we write:
<template>
<div id="app">
<b-icon icon="address-book" pack="fa" size="is-small"></b-icon>
</div>
</template>
<script>
export default {
name: "App"
};
</script>
pack
sets the icon pack to use.
'fa'
sets it to Font Awesome.
icon
is the icon name that we use.
size
sets the size.
We can add the type
ptop to set the style:
<template>
<div id="app">
<b-icon type="is-success" icon="address-book" pack="fa" size="is-small"></b-icon>
</div>
</template>
<script>
export default {
name: "App"
};
</script>
We can also write it as an object:
<template>
<div id="app">
<b-icon :type="{ 'is-success': true }" icon="address-book" pack="fa" size="is-small"></b-icon>
</div>
</template>
<script>
export default {
name: "App"
};
</script>
This lets us set the style conditionally.
Image
Buefy comes with the b-image
component to let us add images.
For example, we can write:
<template>
<div id="app">
<b-image src="https://picsum.photos/600/400" alt="image" ratio="6by4" rounded></b-image>
</div>
</template>
<script>
export default {
name: "App"
};
</script>
alt
sets the text description for the image.
src
has the URL of the image.
rounded
makes the image rounded.
ratio
is the aspect ratio.
We can also add WebP images with b-image
:
<template>
<div id="app">
<b-image
src="https://picsum.photos/id/237/800/450.webp"
webp-fallback="https://picsum.photos/id/1025/800/450.jpg"
alt="image"
ratio="6by4"
rounded
></b-image>
</div>
</template>
<script>
export default {
name: "App"
};
</script>
webp-fallback
has the URL for the fallback image in case WebP images aren’t supported in your browser.
We can add srcset
props to show different images when the screen is different sizes:
<template>
<div id="app">
<b-image
src="https://picsum.photos/id/1074/1600/800"
:srcset-sizes="[400, 800, 1600]"
:srcset-formatter="this.formatSrcset"
alt="image"
ratio="6by4"
></b-image>
</div>
</template>
<script>
export default {
name: "App",
methods: {
formatSrcset(src, size) {
return `https://picsum.photos/id/1000/${size}/${size / 2}`;
}
}
};
</script>
Also, we can listen to the load
event and run an event handler when it loads:
<template>
<div id="app">
<b-image src="https://picsum.photos/id/1074/1600/800" alt="image" ratio="6by4" @load="onLoad"></b-image>
</div>
</template>
<script>
export default {
name: "App",
methods: {
onLoad(event, src) {
console.log(src);
}
}
};
</script>
onLoad
is run when the load
event is emitted.
We can hamdle errors by listening to the error
event and add a fallback image:
<template>
<div id="app">
<b-image
src="https://picsum.photos/id/error/600/400"
src-fallback="https://picsum.photos/id/237/600/400"
ratio="6by4"
@error="onError"
></b-image>
</div>
</template>
<script>
export default {
name: "App",
methods: {
onError(event, src) {
console.log(`${src} fails to load`);
}
}
};
</script>
The onError
method is run when the image set in the src
attribute fails to load.
Conclusion
We can display icons and images easily with Buefy.