image-cache.vue 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. <template>
  2. <image :src="cacheImgUrl" :mode="mode" :lazy-load="lazyLoad" :fade-show="fadeShow"
  3. :show-menu-by-longpress="showMenuByLongpress" :webp="webp" :draggable="draggable"
  4. @load="sendEvent('load', $event)" @error="sendEvent('error', $event)" @click="sendEvent('click', $event)">
  5. </image>
  6. </template>
  7. <script>
  8. import {
  9. ImgCache
  10. } from './imgCache.js';
  11. export default {
  12. name: "ImgCache",
  13. props: {
  14. // 图片资源地址
  15. src: {
  16. type: String,
  17. default: ""
  18. },
  19. // 图片裁剪、缩放的模式
  20. mode: {
  21. type: String,
  22. default: 'aspectFill'
  23. },
  24. // 图片懒加载。只针对page与scroll-view下的image有效
  25. lazyLoad: {
  26. type: Boolean,
  27. default: false
  28. },
  29. // 图片显示动画效果
  30. fadeShow: {
  31. type: Boolean,
  32. default: true
  33. },
  34. // 在系统不支持webp的情况下是否单独启用webp。默认false,只支持网络资源。webp支持详见下面说明
  35. webp: {
  36. type: Boolean,
  37. default: false
  38. },
  39. // 开启长按图片显示识别小程序码菜单
  40. showMenuByLongpress: {
  41. type: Boolean,
  42. default: false
  43. },
  44. // 是否能拖动图片
  45. draggable: {
  46. type: Boolean,
  47. default: true
  48. }
  49. },
  50. watch: {
  51. // 监听URL变化
  52. src: {
  53. handler(src) {
  54. this.handleCache(src);
  55. },
  56. immediate: true
  57. }
  58. },
  59. data() {
  60. return {
  61. // 缓存图片地址
  62. cacheImgUrl: ''
  63. };
  64. },
  65. methods: {
  66. /**
  67. * 处理缓存
  68. * @param {String} imgUrl 网络图片地址
  69. */
  70. async handleCache(imgUrl) {
  71. // #ifdef H5
  72. this.cacheImgUrl = imgUrl;
  73. return;
  74. // #endif
  75. // 判断图片是否存在缓存
  76. let localUrl = await ImgCache.getCache(imgUrl);
  77. if (localUrl) {
  78. // 存在缓存,直接用本地图片地址
  79. this.cacheImgUrl = localUrl;
  80. } else {
  81. // 不存在缓存,用网络地址
  82. this.cacheImgUrl = imgUrl;
  83. // 并且设置缓存
  84. ImgCache.setCache(imgUrl);
  85. }
  86. },
  87. /**
  88. * 向父级发送事件
  89. * @param {String} emit 事件名称
  90. * @param {Object} event 事件回调
  91. */
  92. sendEvent(emit, event) {
  93. this.$emit(emit, event);
  94. }
  95. }
  96. }
  97. </script>