通常情况下我们设置的图片都能正常显示,但是有时候会由于图片路径失效等情况导致图片加载失败,所以我们得为图片设置实现后默认显示的备用图片,这里可以使用自定义指令的方式解决
注册自定义指令方式
Vue.directive('指令名称', { // 会在当前指令作用的dom元素 插入之后执行 // options 里面是指令的表达式 inserted: function (dom,options) { } })
在项目中我们可能会注册多个自定义指令,所以我们不可能挨个去给指令注册,这里可以使用模块化的方式统一注册与管理
src/directives/index.js
中管理自定义指令
export const imagerror = { // 指令对象 会在当前的dom元素插入到节点之后执行 inserted(dom, options) { // options是 指令中的变量的解释 其中有一个属性叫做 value // dom 表示当前指令作用的dom对象 // dom认为此时就是图片 // 当图片有地址 但是地址没有加载成功的时候 会报错 会触发图片的一个事件 => onerror dom.onerror = function() { // 当图片出现异常的时候 会将指令配置的默认图片设置为该图片的内容 // dom可以注册error事件 dom.src = options.value // 这里不能写死 } } }
main.js注册全局自定义指令
// import * as 变量 得到的是一个对象 { 变量1:对象1,变量2: 对象2 ... } import * as directives from '@/directives' // 注册自定义指令 // Object.keys将对象属性转化为数组形式然后进行遍历 // 遍历所有的导出的指令对象 完成自定义全局注册 Object.keys(directives).forEach(key => { // 注册自定义指令 Vue.directive(key, directives[key]) })
组件中使用自定义指令
<img v-imageerror="defaultImg" :src="Photo">
data() { return { defaultImg: require('@/assets/common/default.jpg') } },
自定义指令的钩子函数可以看官网