当前位置:   article > 正文

vue封装loading效果插件_vue loading组件

vue loading组件

这是基于iview的样式,其他组件库可作参考,这里分享两种方法,往下看↓

1、这种方法需要先在template中引用组件,然后在method中调用方法

1)首先在@\src\components下新建loading文件夹,里面新建index.vue

  1. <template>
  2. <div>
  3. <Modal v-model="waitModal"
  4. width="460"
  5. class="loading-modal"
  6. :closable="false"
  7. :mask-closable="false">
  8. <div class="demo-spin-container">
  9. <Spin fix>
  10. <Icon type="ios-loading"
  11. size="18"
  12. class="spin-wait-load"></Icon>
  13. <div>{{ waitContent }}</div>
  14. </Spin>
  15. </div>
  16. <div slot="footer"></div>
  17. </Modal>
  18. </div>
  19. </template>
  20. <script>
  21. export default {
  22. name: 'Loading',
  23. data() {
  24. return {
  25. //等待弹框显示和隐藏
  26. waitModal: false,
  27. //等待弹框提示内容
  28. waitContent: '加载中...',
  29. }
  30. },
  31. methods: {
  32. // 显示弹框
  33. show(msg = '') {
  34. this.waitContent = msg
  35. this.waitModal = true
  36. },
  37. // 隐藏弹框
  38. hide() {
  39. this.waitContent = ''
  40. this.waitModal = false
  41. },
  42. },
  43. }
  44. </script>
  45. <style lang="less" scoped>
  46. /* 等待模态框样式 */
  47. .loading-modal {
  48. .demo-spin-container {
  49. display: inline-block;
  50. width: 100%;
  51. height: 100px;
  52. position: relative;
  53. }
  54. .ivu-modal-body {
  55. height: 200px;
  56. display: flex;
  57. align-items: center;
  58. }
  59. .ivu-modal-footer {
  60. border-top: none;
  61. padding: 0 !important;
  62. }
  63. @keyframes ani-demo-spin {
  64. from {
  65. transform: rotate(0deg);
  66. }
  67. 50% {
  68. transform: rotate(180deg);
  69. }
  70. to {
  71. transform: rotate(360deg);
  72. }
  73. }
  74. }
  75. </style>

2)然后再main.js中引入该组件

  1. import Loading from '@/components/loading'
  2. Vue.component('Loading',Loading)

3)在页面中使用,通过$refs访问Loading组件中的show()方法展示弹框,hide()方法隐藏弹框

  1. <template>
  2. <div>
  3. <Button @click="showModal">点击显示弹框</Button>
  4. <Loading ref="loading"></Loading>
  5. </div>
  6. </template>
  7. <script>
  8. export default {
  9. name: 'Example',
  10. create:{
  11. this.initData()
  12. },
  13. methods: {
  14. initData () {
  15. // 如果在create中使用时,注意要在$nextTick等待组件挂载完后在调用方法,
  16. this.$nextTick(()=>{
  17. this.$refs.loading.show('waiting...')
  18. })
  19. },
  20. showModal () {
  21. // 显示弹框
  22. this.$refs.loading.show('waiting...')
  23. setTimeout(() => {
  24. // 隐藏弹框
  25. this.$refs.loading.hide()
  26. }, 2000);
  27. },
  28. }
  29. }
  30. </script>

2、将组件用插件(plugin)的方式封装

1)用这种方法,components中的写法和上一种方法有些许差别

  1. <template>
  2. <div>
  3. <Modal v-model="waitModal"
  4. width="460"
  5. class="loading-modal"
  6. :closable="false"
  7. :mask-closable="false">
  8. <div class="demo-spin-container">
  9. <Spin fix>
  10. <Icon type="ios-loading"
  11. size="18"
  12. class="spin-wait-load"></Icon>
  13. <div>{{ waitContent }}</div>
  14. </Spin>
  15. </div>
  16. <div slot="footer"></div>
  17. </Modal>
  18. </div>
  19. </template>
  20. <script>
  21. export default {
  22. props: {
  23. waitModal: Boolean,
  24. waitContent: {
  25. type: String,
  26. default: '正在加载中...',
  27. },
  28. },
  29. }
  30. </script>
  31. <style lang="less" scoped>
  32. /* 等待模态框样式 */
  33. .loading-modal {
  34. .demo-spin-container {
  35. display: inline-block;
  36. width: 100%;
  37. height: 100px;
  38. position: relative;
  39. }
  40. .ivu-modal-body {
  41. height: 200px;
  42. display: flex;
  43. align-items: center;
  44. }
  45. .ivu-modal-footer {
  46. border-top: none;
  47. padding: 0 !important;
  48. }
  49. @keyframes ani-demo-spin {
  50. from {
  51. transform: rotate(0deg);
  52. }
  53. 50% {
  54. transform: rotate(180deg);
  55. }
  56. to {
  57. transform: rotate(360deg);
  58. }
  59. }
  60. }
  61. </style>

2)然后在@\src\plugins下新建loading文件夹,里面新建index.js

  1. // 引入我们的loading.vue组件
  2. import Loading from '@/components/loading'
  3. let $vm
  4. export default {
  5. // 必须定义的方法
  6. install(Vue, options) {
  7. if (!$vm) {
  8. //通过Vue.extend()方法创建了一个构造器LoadingPlugin
  9. const LoadingPlugin = Vue.extend(Loading)
  10. //通过new LoadingPlugin()创建了vm实例,并挂载到一个div元素上
  11. $vm = new LoadingPlugin({
  12. el:document.createElement('div')
  13. })
  14. //通过document.body.appendChild(vm.el)将其插入到DOM节点中。
  15. document.body.appendChild($vm.$el)
  16. }
  17. //当创建了$vm实例后,我们可以访问该实例的属性和方法
  18. $vm.waitModal = false
  19. let loading = {
  20. show (text = '加载中...') {
  21. //通过$vm.show就可以改变loading组件的waitModal值来控制其显示隐藏,waitContent 控制传参显示提示文字。
  22. $vm.waitModal = true;
  23. $vm.waitContent = text
  24. },
  25. hide () {
  26. $vm.waitModal = false
  27. }
  28. }
  29. if (!Vue.$loading) {
  30. Vue.$loading = loading
  31. }
  32. //通过Vue.mixin或者Vue.prototype.loading来全局添加了$loading事件,其又包含了show和hide两个方法
  33. Vue.prototype.$loading = Vue.$loading
  34. //Vue.mixin({
  35. // created() {
  36. // this.$loading = Vue.$loading;
  37. // }
  38. //})
  39. },
  40. }

3)在main.js中引入这个插件

  1. // 挂载等待弹框插件放到vue实例中
  2. import Loading from '@/plugins/loading/index.js'
  3. Vue.use(Loading)

4)到这里,就可以直接在method中直接使用了。我们可以直接在页面中使用this.$loading.show()来显示加载,使用this.$loading.hide()来关闭加载。

  1. <template>
  2. <div>
  3. <Button @click="showModal">点击显示弹框</Button>
  4. <Loading ref="loading"></Loading>
  5. </div>
  6. </template>
  7. <script>
  8. export default {
  9. name: 'Example',
  10. create:{
  11. this.initData()
  12. },
  13. methods: {
  14. initData () {
  15. this.$loading.show('waiting...')
  16. },
  17. showModal () {
  18. // 显示弹框
  19. this.$loading.show('waiting...')
  20. setTimeout(() => {
  21. // 隐藏弹框
  22. this.$loading.hide()
  23. }, 2000);
  24. },
  25. }
  26. }
  27. </script>

简单的、不需要传太多的参数的组件封装,个人更推荐使用第二种方案

如有错误的地方,欢迎大佬批评指正。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/218842
推荐阅读
相关标签
  

闽ICP备14008679号