• 关于vue.extend的理解应用


    一、基本概念

    Vue.extend( options )

    使用基础 Vue 构造器,创建一个“子类”。参数是一个包含组件选项的对象。

    一般,我们会用 Vue.extend 接收一个组件对象来创建一个构造器,再利用创建的构造器 new 一个实例,并将这个实例挂载到一个元素上。

    二、官网基本示例

    <div id="mount-point">div>
    1. // 创建构造器
    2. var Profile = Vue.extend({
    3. template: '

      {{firstName}} {{lastName}} aka {{alias}}

      '
      ,
    4. data: function () {
    5. return {
    6. firstName: 'Walter',
    7. lastName: 'White',
    8. alias: 'Heisenberg'
    9. }
    10. }
    11. })
    12. // 创建 Profile 实例,并挂载到一个元素上。
    13. new Profile().$mount('#mount-point')

    data 选项是特例,需要注意 - 在 Vue.extend() 中它必须是函数

    结果如下:

    <p>Walter White aka Heisenbergp>

    三、应用

    Vue.extend 属于 Vue 的全局 API,在实际业务开发中我们很少使用,因为相比常用的 Vue.component 写法使用 extend 步骤要更加繁琐一些。但是在一些独立组件开发场景中,例如要实现一个类似于 window.alert() 提示组件,要求像调用 JS 函数一样调用它,这时候 Vue.extend + $mount 这对组合就是我们需要去关注的。

    1、vue $mount 和 el的区别说明

    在应用之前我们先了解一下2个东西 —— $mount 和 el,两者在使用效果上没有任何区别,都是为了将实例化后的vue挂载到指定的dom元素中。

    如果在实例化vue的时候指定el,则该vue将会渲染在此el对应的dom中,反之,若没有指定el,则vue实例会处于一种“未挂载”的状态,此时可以通过$mount来手动执行挂载。

    注:如果$mount没有提供参数,模板将被渲染为文档之外的的元素,并且你必须使用原生DOM API把它插入文档中。

    1. var MyComponent = Vue.extend({
    2. template: '
      Hello!
      '
    3. })
    4. // 创建并挂载到 #app (会替换 #app)
    5. new MyComponent().$mount('#app')
    6. // 同上
    7. new MyComponent({ el: '#app' })
    8. // 或者,在文档之外渲染并且随后挂载
    9. var component = new MyComponent().$mount()
    10. document.getElementById('app').appendChild(component.$el)

    2、Vue.extend实现Loading插件($mount)

    1. <div id="root">
    2. <button @click="showLoading">显示Loadingbutton>
    3. div>
    1. function Loading(msg) {
    2. // 创建构造器
    3. const Loading = Vue.extend({
    4. template: '
      {{ msg }}
      '
      ,
    5. props: {
    6. msg: {
    7. type: String,
    8. default: '加载中'
    9. }
    10. },
    11. name: 'Loading'
    12. })
    13. // 创建挂载div
    14. const div = document.createElement('div')
    15. div.setAttribute('id', 'loading-div')
    16. document.body.append(div)
    17. // 创建实例并挂载到一个元素上
    18. new Loading().$mount('#loading-div')
    19. // 返回一个移除元素的function
    20. return () => {
    21. document.body.removeChild(document.getElementById('loading-div'))
    22. }
    23. }
    24. // 挂载到vue实例上
    25. Vue.prototype.$loading = Loading
    26. new Vue({
    27. el: '#root',
    28. methods: {
    29. showLoading() {
    30. const hide = this.$loading('正在加载,请稍等...')
    31. setTimeout(() => {
    32. hide()
    33. }, 1500)
    34. }
    35. }
    36. })

    3、Vue.extend实现信息弹窗插件(el)

     新建一个popBox.vue

    1. <template>
    2. <div id="confirm" v-if='flag'>
    3. <div class="contents" >
    4. <div class="content-top">{{ text.title }}div>
    5. <div class="content-center">{{ text.msg }}div>
    6. <div class="content-bottom">
    7. <button @click='show' class="left">{{ text.btn.ok }}button>
    8. <button @click='hide' class="right">{{ text.btn.no }}button>
    9. div>
    10. div>
    11. div>
    12. template>
    13. <script>
    14. export default {
    15. data () {
    16. return {
    17. flag: true,
    18. text: {
    19. title:'标题',
    20. msg: '这是一个信息弹出框组件',
    21. btn: {
    22. ok: '确定',
    23. no: '取消'
    24. }
    25. }
    26. }
    27. },
    28. methods: {
    29. show (){
    30. this.flag = false;
    31. },
    32. hide() {
    33. this.flag = false;
    34. }
    35. }
    36. }
    37. script>

    新建一个popBox.js

    1. import Vue from 'vue'
    2. import PopBox from './popBox.vue'
    3. // Vue.extend返回一个实例创建的构造器,但实例构造器需要进行挂载到页面中
    4. let popBox = Vue.extend(PopBox)
    5. popBox.install = (vue, text) => {
    6. // 在body中动态创建一个div元素,之后此div将会替换成整个vue文件的内容
    7. // 此时的popBoxDom通俗讲就是相当于是整个组件对象,通过对象调用属性的方法来进行组件中数据的使用
    8. let popBoxDom = new popBox({
    9. el: document.createElement('div')
    10. })
    11. // 可以通过$el属性来访问创建的组件实例
    12. document.body.appendChild(popBoxDom.$el)
    13. // 将需要传入的文本内容传给组件实例
    14. popBoxDom.text = text;
    15. // 返回一个promise,进行异步操作,成功时返回,失败时返回
    16. return new Promise((res, rej) => {
    17. popBoxDom.show = () => {
    18. res() //正确时返回的操作
    19. popBoxDom.flag = false;
    20. }
    21. popBoxDom.hide = ()=>{
    22. rej() //失败时返回的操作
    23. popBoxDom.flag = false;
    24. }
    25. }
    26. vue.prototype.$popBox = popBox
    27. })
    28. }
    29. // 将逻辑函数进行导出和暴露
    30. export default popBox

    页面使用

    1. import PopBox from './popBox.js'
    2. Vue.use(popBOx);
    3. this.$popBox({
    4. title:'标题',
    5. msg:'内容',
    6. btn:{ ok:'确定', no:'取消'}
    7. }).then(()=>{
    8. console.log('ok')
    9. }).catch(()=>{
    10. console.log('no')
    11. })

    其他

    1. import toastCom from "./Toast";
    2. const toast = {};
    3. toast.install = vue => {
    4. const ToastCon = vue.extend(toastCom);
    5. const ins = new ToastCon();
    6. ins.$mount(document.createElement("div"));
    7. document.body.appendChild(ins.$el);
    8. console.log(ins.toast)
    9. vue.prototype.$toast = ins.toast;
    10. };
    11. const globalComponent = {
    12. install: function(Vue) {
    13. Vue.use(toast);
    14. }
    15. };
    16. export default globalComponent;

  • 相关阅读:
    SpringSecurity6从入门到上天系列第七篇:讲明白SpringBoot的自动装配完善上篇文章中的结论
    【Python基础篇020】网络编程初识
    QT聊天室阶段性记录(完善中:注册功能,数据库存储)
    golang——slice避坑
    iOS 展示网络GIF 图片
    电脑上出现应用程序无法正常启动0xc0000142的解决方法
    使用企业订货软件的担忧与考虑|网上APP订货系统
    配置 iSCSI 服务并实现客户端自动挂载块设备
    ubuntu安装freeswitch 1.10.10
    (经典dp) hdu 递推求解专题练习
  • 原文地址:https://blog.csdn.net/qq_31851435/article/details/126341198