vue构造器注册UI组件

Posted qqprincekin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue构造器注册UI组件相关的知识,希望对你有一定的参考价值。

 1 import ConfirmComponent from ‘../../components/confirm/index‘
 2 import  mergeOptions  from ‘../pluginHelper‘
 3 
 4 function plugin (Vue) 
 5   if (plugin.install) 
 6     return
 7   
 8   const Confirm = Vue.extend(ConfirmComponent)
 9   let $vm = new Confirm(
10     el: document.createElement(‘div‘)
11   )
12   document.body.appendChild($vm.$el)
13   const confirm = 
14     show (options) 
15       if ($vm.showValue) 
16         return
17       
18       if (typeof options === ‘object‘) 
19         mergeOptions($vm, options)
20       
21       if (options && (options.onShow || options.onHide)) 
22         this.watcher = $vm.$watch(‘showValue‘, (val) => 
23           val && options.onShow && options.onShow($vm)
24           if (val === false) 
25             if (options.onHide) 
26               options.onHide($vm)
27             
28             this.watcher && this.watcher()
29           
30         )
31       
32       $vm.$off(‘on-cancel‘)
33       $vm.$off(‘on-confirm‘)
34       $vm.$on(‘on-cancel‘, () => 
35         options && options.onCancel && options.onCancel()
36       )
37       $vm.$on(‘on-confirm‘, () => 
38         options && options.onConfirm && options.onConfirm()
39       )
40       $vm.showValue = true
41     ,
42     hide () 
43       $vm.showValue = false
44     
45   
46   if (!Vue.confirm) 
47     Vue.confirm = confirm
48   
49   Vue.mixin(
50     created: function () 
51       this.$confirm = Vue.confirm
52     
53   )
54 
55 
56 export default plugin

pluginHelper

 1 // merge
 2 export const mergeOptions = function ($vm, options) 
 3   const defaults = 
 4   for (let i in $vm.$options.props) 
 5     defaults[i] = $vm.$options.props[i].default
 6   
 7   const _options = Object.assign(, defaults, options)
 8   for (let i in _options) 
 9     $vm[i] = _options[i]
10   
11 
12 
13 export const initializeProps = function ($vm) 
14   for (let i in $vm.$options.props) 
15     $vm[i] = $vm.$options.props[i].default
16   
17 

loading

 1 <template>
 2   <div>
 3     <transition name="transition">
 4       <div class="loading" v-show="show">
 5         <div class="toast">
 6           <i class="icon"></i>
 7           <p class="text" v-if="text">text</p>
 8         </div>
 9       </div>
10     </transition>
11   </div>
12 </template>
13 
14 <script>
15   export default 
16     name: ‘loading‘,
17     props: 
18       show: Boolean,
19       text: String
20     
21   
22 </script>
23 
24 <style lang="scss" scoped>
25   .loading 
26     position: fixed;
27     z-index: 1000;
28     top: 0;
29     right: 0;
30     left: 0;
31     bottom: 0;
32 
33     .toast 
34       position: fixed;
35       z-index: 5000;
36       width: 92px;
37       min-height: 92px;
38       top: 180px;
39       left: 50%;
40       margin-left: -46px;
41       background: rgba(17, 17, 17, 0.7);
42       text-align: center;
43       border-radius: 5px;
44       color: #FFFFFF;
45     
46 
47     .icon 
48       margin: 27px 0 0;
49       width: 38px;
50       height: 38px;
51       display: inline-block;
52       vertical-align: middle;
53       -webkit-animation: loading 1s steps(12, end) infinite;
54       animation: loading 1s steps(12, end) infinite;
55       background: transparent url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjAiIGhlaWdodD0iMTIwIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgxMDB2MTAwSDB6Ii8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTlFOUU5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTMwKSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iIzk4OTY5NyIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgzMCAxMDUuOTggNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjOUI5OTlBIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDYwIDc1Ljk4IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0EzQTFBMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSg5MCA2NSA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNBQkE5QUEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoMTIwIDU4LjY2IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0IyQjJCMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgxNTAgNTQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjQkFCOEI5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDE4MCA1MCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDMkMwQzEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTE1MCA0NS45OCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDQkNCQ0IiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTEyMCA0MS4zNCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNEMkQyRDIiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTkwIDM1IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0RBREFEQSIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgtNjAgMjQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTJFMkUyIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKC0zMCAtNS45OCA2NSkiLz48L3N2Zz4=") no-repeat;
56       background-size: 100%;
57     
58 
59     .text 
60       display: block;
61       margin: 2px 0 15px;
62       font-size: 12px;
63     
64   
65 
66   //
67   @-webkit-keyframes loading 
68     0% 
69       transform: rotate3d(0, 0, 1, 0deg);
70     
71 
72     100% 
73       transform: rotate3d(0, 0, 1, 360deg);
74     
75   
76 
77   @keyframes loading 
78     0% 
79       transform: rotate3d(0, 0, 1, 0deg);
80     
81 
82     100% 
83       transform: rotate3d(0, 0, 1, 360deg);
84     
85   
86 
87   // 延时动画
88   .transition-enter, .transition-leave-active 
89     opacity: 0;
90   
91 
92   .transition-leave-active, .transition-enter-active 
93     transition: opacity 300ms;
94   
95 </style>

pluginLoadind

 1 import LoadingComponent from ‘../../components/loading/index‘
 2 
 3 function plugin (Vue) 
 4   if (plugin.install) 
 5     return
 6   
 7   const Loading = Vue.extend(LoadingComponent)
 8   let $vm = new Loading(
 9     el: document.createElement(‘div‘)
10   )
11   document.body.appendChild($vm.$el)
12   const loading = 
13     show (options) 
14       if ($vm.show) 
15         return
16       
17       $vm.text = $vm.$options.props.text.default
18       if (typeof options === ‘string‘) 
19         $vm.text = options
20       
21       $vm.show = true
22     ,
23     hide () 
24       $vm.show = false
25     ,
26     isVisible () 
27       return $vm.show
28     
29   
30   if (!Vue.loading) 
31     Vue.loading = loading
32   
33   Vue.mixin(
34     created: function () 
35       this.$loading = Vue.loading
36     
37   )
38 
39 
40 export default plugin

Vue.use() 挂载

以上是关于vue构造器注册UI组件的主要内容,如果未能解决你的问题,请参考以下文章

vue组件

vue -- 组件构造器(extend)

vue组件局部与全局注册的区别

Vue 组件化

Vue.js---组件

组件