Vue extend学习示例讲解

目录
  • 1、什么是动态创建组件
  • 2、Vue.extend()
  • 3、通过extend实现弹窗的动态创建
    • 3.1、创建动态组件
    • 3.2、编辑动态组件的逻辑
    • 3.3、在main.js中引入使用
    • 3.4、在需要的地方通过触发事件显示弹窗
    • 3.5、效果图

vue中通过extend动态创建全局组件;

1、什么是动态创建组件

只有在触发事件的时候,才产生某组件,平时它并不存在;

2、Vue.extend()

使用基础 Vue 构造器,创建一个“子类”。参数是一个包含组件选项的对象;其实就是一个子类构造器是Vue组件的核心api,实现思路就是使用原型继承的方法返回了Vue的子类,并且利用mergeOptions把传入组件的options和父类的options进行了合并。

extend创建的是一个组件构造器,而不是一个具体的实例;

接收一个对象(包含组件选项的对象)作为参数,需要使用new来创建实例,并且需要$mount手动挂载到一个元素上,才可以获取到这个元素的相应的信息。

  • 脱离填鸭式的写法;代码自由
  • 代码复用,解耦
  • 原生JS语法结合vue(jsx)
  • 通过传入参数,可以显示不同状态的模板

基础用法:

<div id="mount-point"></div>
// 创建构造器
/* Vue.extend( options )
  参数:{Object} options
  用法:使用基础 Vue 构造器,创建一个“子类”。参数是一个包含组件选项的对象;
       data 选项是特例,需要注意: 在 Vue.extend() 中它必须是函数;*/
var Profile = Vue.extend({
  template: '<p>{{firstName}} {{lastName}} aka {{alias}}</p>',
  data: function () {
    return {
      firstName: 'Walter',
      lastName: 'White',
      alias: 'Heisenberg'
    }
  }
})
// 创建 Profile 实例,并挂载到一个元素上。
new Profile().$mount('#mount-point')
// 结果如下:
<p>Walter White aka Heisenberg</p>
/*
可以看到,extend 创建的是 Vue 构造器,而不是我们平时常写的组件实例,所以不可以通过 new Vue({ components: testExtend }) 来直接使用,需要通过 new Profile().$mount('#mount-point') 来挂载到指定的元素上。
*/

3、通过extend实现弹窗的动态创建

3.1、创建动态组件

<!--动态组件的模板-->
<template>
  <!--  可以用MessageBox做蒙尘-->
  <div :class="['MessageBox',type]">
    <div class="inner">
      <header class="header">
        <h1 class="title">{{ title }}</h1>
        <span @click="$messageBox.hide()">x</span>
      </header>
      <div class="content">{{ content }}</div>
    </div>
  </div>
</template>
<script>
export default {
  name: "MessageBox",
  props: {
    title: {
      type: String,
      default: "this is title",
    },
    content: {
      type: String,
      default: "this is content",
    },
    type: {
      type: String,
      default: "primary",
      //检测传进来的类型是否是这四种,通过ES6提供的includes方法模糊查询
      validator(value) {
        return [
          "primary",
          "success",
          "warn",
          "danger"
        ].includes(value);
      }
    }
  }
}
</script>
<style scoped lang="less">
.MessageBox {
  position: fixed;
  left: 50%;
  top: 0;
  //蒙尘的大小设置
  width: 50%;
  height: 400px;
  background-color: rgba(0, 0, 0, .5);
  //不同弹窗的样式
  &.primary {
    .header {
      background-color: blue;
      color: #fff;
    }
  }
  &.success {
    .header {
      background-color: green;
      color: #fff;
    }
  }
  &.warn {
    .header {
      background-color: rgba(255, 138, 71, 0.96);
      color: #fff;
    }
  }
  &.danger {
    .header {
      background-color: red;
      color: #fff;
    }
  }
  .inner {
    position: absolute;
    top: 100px;
    left: 50%;
    width: 500px;
    margin-left: -250px;
    background-color: #fff;
    box-shadow: 1px 3px 5px #ddd;
    border-radius: 5px;
    overflow: hidden;
    .header {
      height: 44px;
      padding: 0 10px;
      line-height: 44px;
      box-sizing: border-box;
      h1 {
        margin: 0;
        font-weight: normal;
      }
      .title {
        font-size: 16px;
        float: left;
      }
      span {
        //将鼠标改为小手样式
        cursor: pointer;
        float: right;
      }
    }
    .content {
      padding: 20px;
      box-sizing: border-box;
    }
  }
}
</style>

3.2、编辑动态组件的逻辑

//引入需要动态创建的模板
import _MessageBox from "@/components/messageBox/MessageBox";
export default {
    //install开发插件的方法,install带有Vue的构造器,可以使用Vue.extend,和Vue.component(注册组件)
    //在Vue.use的时候就会调用这个install
    install(Vue) {
        let messageBox = null;
        //使用Vue.component全局注册组件
        Vue.component(_MessageBox.name, _MessageBox);
        //将方法添加到Vue的prototype属性中,这样实例就可以继承里面的方法
        Vue.prototype.$messageBox = {
            show, hide,
            info({title, content, type}, callback) {
                this.show({title, content, type: "primary"}, callback)
            },
            success({title, content, type}, callback) {
                this.show({title, content, type: "success"}, callback)
            },
            warn({title, content, type}, callback) {
                this.show({title, content, type: "warn"}, callback)
            },
            danger({title, content, type}, callback) {
                this.show({title, content, type: "danger"}, callback)
            }
        }
        //显示弹窗
        function show(props, callback) {
            //判断这个组件是否存在,如果不存在
            if (!messageBox) {
                //生成构造函数、构造器
                const MessageBox = Vue.extend({
                    /*
                    render该渲染函数接收一个 createElement 方法作为第一个参数用来创建 VNode(节点)。
                   如果组件是一个函数组件,渲染函数还会接收一个额外的 context 参数,为没有实例的函数组件提供上下文信息。
                  */
                    //此处传入的是一个函数组件,所以渲染的函数还可以额外接收一个参数
                    render(h) {
                        //h函数就是vue中的createElement函数,这个函数作用就是创建虚拟dom,追踪dom变化的
                        return h("MessageBox", {
                            //用于接收传递的参数
                            props: {...props}
                        })
                    }
                });
                //将动态模板组件实例化
                messageBox = new MessageBox();
                //将这个实例手动挂载,挂载后可以通过$el获取这个元素
                this.vm = messageBox.$mount();
                //将组件添加到body上,脱离了根节点,不在"id=app中"
                document.body.appendChild(this.vm.$el)
                callback && callback();
            }
        }
        //关闭弹窗
        function hide(callback) {
            //移出这个组件
            document.body.removeChild(this.vm.$el);
            //将这个实例销毁
            messageBox.$destroy();
            messageBox = null;
            this.vm = null;
            //如果存在才会执行
            callback && callback();
        }
    }
}

3.3、在main.js中引入使用

import Vue from 'vue'
import App from './App.vue'
//1、引入
import MessageBox from "@/components/messageBox";
//2、全局注册使用
Vue.use(MessageBox);
new Vue({
    render: h => h(App)
}).$mount('#app')

3.4、在需要的地方通过触发事件显示弹窗

<template>
  <div>
    <button @click="showMessageBox">show</button>
    <button @click="showInfoMessageBox">info</button>
    <button @click="showSuccessMessageBox">success</button>
    <button @click="showWarnMessageBox">warn</button>
    <button @click="showDangerMessageBox">danger</button>
  </div>
</template>
<script>
export default {
  name: "Extend",
  methods: {
    //通过this.$messageBox可以访问到Vue实例的属性和方法
    showMessageBox() {
      this.$messageBox.success({
        title: 'App',
        content: 'this is content of extend study',
        type: 'success'
      }, () => {
        console.log('show over')
      })
    },
    showInfoMessageBox() {
      this.$messageBox.info({
        title: 'App',
        content: 'this is content of extend study',
      }, () => {
        console.log('info over')
      })
    },
    showSuccessMessageBox() {
      this.$messageBox.success({
        title: 'App',
        content: 'this is content of extend study',
        type: 'success'
      }, () => {
        console.log('success over')
      })
    },
    showWarnMessageBox() {
      this.$messageBox.warn({
        title: 'App',
        content: 'this is content of extend study',
        type: 'warn'
      }, () => {
        console.log('warn over')
      })
    },
    showDangerMessageBox() {
      this.$messageBox.danger({
        title: 'App',
        content: 'this is content of extend study',
        type: 'danger'
      })
    }
  }
}
</script>

3.5、效果图

到此这篇关于Vue extend学习示例讲解的文章就介绍到这了,更多相关Vue extend内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Vue.extend实现组件库message组件示例详解

    目录 概述 Vue.extend message 组件配置对象(就是.vue文件) message 生成组件的函数 使用方法 效果图 总结 概述 当我们使用组件库的时候,某些组件并不是直接放到模板当中进行使用,而是通过api的方式调用生成组件并且挂在到我们的页面中,其中最常见的就是message组件,我们在组件库中看到的多数都是api调用的方式生成.记录自己基本实现message组件. Vue.extend 在vue中,要实现通过api方式实现组件的使用,这个aip是必不可少的,因此我们先了解下

  • Vue extend使用示例深入分析

    目录 一.使用场景 二.补充组件注册 三.深度解析 Vue.extend()虽然已近用过很多次了,但都没有深入思考过这个东西,仔细想了想,有点意思 一.使用场景 按需使用组件,也叫懒加载,性能蹭蹭往上走 扩展的组件,其自由度高到你无法想象 二.补充组件注册 平日里,我们使用组件: 黄金玩家: <template> <A/> </template> import A from "./A.vue"; export default { components

  • Vue extends 属性的用法示例详解

    目录 引言 App.vue Son.vue HelloWorld.vue 小结 引言 最近在看抖音——<小山与 bug>,看到一个很神奇的 Vue 继承组件的方法,后来专门去翻了 element 和 iview 的源码,发现这个属性的用法好像在这些框架里还没有用到过,怀着试一试的态度,我就自己搭建了个测试项目,发现其实还是挺好用的,甚至有望代替目前我们前端框架业务代码混入的底层实现.话不多说,直接上代码: App.vue <template> <div> <Son

  • Vue.extend 登录注册模态框的实现

    模态框是我们 UI 控件中一个很重要的组件,使用场景有很多种,我们在 Vue 组件中创建模态框组件而用到的一个知识点是利用 Vue.extend 来创建. 文档中的解释是 在最近在做一个常用的类似下面的 登录/注册 业务场景时,利用 Vue.extend 来改善我们的代码,使我们代码逻辑更清晰化. 需求:点击登录或注册出现各自的模态框. 我们对于这种常见的登录注册业务,一般都是分为 Sigin.vue 和 Register.vue 两个组件,然后把两个组件写入 App.vue 组件中,或者是 l

  • vue extend+promise封装全局弹窗组件

    本文实例为大家分享了vue + element ui实现锚点定位的具体代码,供大家参考,具体内容如下 因为项目没有引入第三方UI库,所以所有的公共组件都需要自己封装现在需要一个全局的弹窗,要有promise异步处理 实现后的效果 // components/confirm文件 <template>   <div class="popup-wrap" v-if="showPopup">     <div class="popup

  • vue使用Vue.extend方法仿写个loading加载中效果实例

    目录 需求描述 效果图 代码实现 第一步,新建loading组件 第二步,新建index.js文件 第三步,在main.js中引入之 第四步,命令式调用 Vue.extend方法的理解 总结 需求描述 本文我们使用vue的extend方法实现一个全屏loading加载效果 通过命令就可以让弹框开启或关闭,比如this.$showDialog()开启,this.$hideDialog()关闭 方法可以传参更改loading中的文字 也可以传参更改loading背景色 当然这里除了文字,背景色什么的

  • vue中使用mixins/extends传入参数的方式

    目录 使用mixins/extends传入参数 vue mixins的原理 使用mixins/extends传入参数 最近做报表页面,基本都是列表页面,所以想用mixins. 但是接口的url不同,于是考虑怎么才能传入参数去适配各个页面. 后来发现mixin文件可以写个函数,接受传递过来的参数,然后return一个对象. 大概如下: mixin.js export default function(config) {     let {         listUrl="",    

  • 关于Vue-extend和VueComponent问题小结

    在一个非单文件组件中(一个文件中包含n个组件,最常见的就是单个html文件中存在多个组件),如果我们需要在这个文件中创建n个组件,然后再页面上展示,这时候我们就需要先定义组件,然后注册组件,最后使用组件.在定义组件这一步,我们就需要使用到 extend 这个方法.当然,也可以在一个html文件中使用多个 new Vue () 来注册组件,但是这么做有问题,下面再说. Vue.extend(option) 官方文档解释:使用基础 Vue 构造器,创建一个“子类”.参数是一个包含组件选项的对象. 组

  • 如何巧用Vue.extend继承组件实现el-table双击可编辑(不使用v-if、v-else)

    目录 问题描述 效果图 代码思路 代码思路中的三个问题解答 问题一:如何创建一个el-input标签? 问题二三:el-input标签和span标签的来回替换恢复 完整代码 目录结构 用于继承的el-input组件 用于继承的span组件 统一继承并暴露data.js文件 使用继承的three.vue组件 总结 问题描述 有一个简单的表格,产品要求实现双击可编辑 看了一下网上的帖子,大多数都是搞两部分dom,一块是输入框,用于编辑状态填写:另一块是普通标签,用于在不编辑显示状态下呈现单元格文字内

  • Vue extend学习示例讲解

    目录 1.什么是动态创建组件 2.Vue.extend() 3.通过extend实现弹窗的动态创建 3.1.创建动态组件 3.2.编辑动态组件的逻辑 3.3.在main.js中引入使用 3.4.在需要的地方通过触发事件显示弹窗 3.5.效果图 vue中通过extend动态创建全局组件: 1.什么是动态创建组件 只有在触发事件的时候,才产生某组件,平时它并不存在: 2.Vue.extend() 使用基础 Vue 构造器,创建一个“子类”.参数是一个包含组件选项的对象:其实就是一个子类构造器是Vue

  • Vue.js学习示例分享

    本篇和大家分享的是学习Vuejs的总结和调用webapi的一个小示例: » Vuejs - 学习大杂烩 » WebApi + Vue.js 示例 下面一步一个脚印的来分享: » Vuejs - 学习大杂烩 首先,咋们要学习一个js框架,那么肯定要引入该框架的基础库,这里我创建一个页面并且引用官网的库是: <script src="https://unpkg.com/vue/dist/vue.js"></script> 下面我们来看一段Vue的基础使用代码: va

  • vue实现微信分享朋友圈,发送朋友的示例讲解

    首先下载微信jssdk引入项目中,这里我就不说怎么去安装了,如果不会的可以看一下npm教程和es6的教程. 第一步,引入微信jssdk,此处我是通过下载微信jssdk,然后用webpack引入进项目的. 第二步,获取详情数据,渲染页面. 第三步,获取详情数据成功后再获取微信签名,token等配置信息. 第四步,通过api配置所想要的功能 代码: <template> <div class="details"> <player :videoUrl="

  • vue 2.5.1 源码学习 之Vue.extend 和 data的合并策略

    1. 子类父类 2.Vue.extend()      //创建vue的子类 组件的语法器 Vue.extend(options) Profile().$mount('#app') // 挂在app上,并替换app 新建 initExend ==> Vue.extend 3. strat.data ==> if(!vm){子组件中data的值是一个方法function ==> mergeDataorFn()} // 数据的合并 ==> else {} //通过实例绑定的data 实

  • Vue封装axios的示例讲解

    1.axios:是一个基于Promise的网络请求库.既可以在node.js(服务器端)使用,也可以在浏览器端使用 (1)在node.js中使用的原生的http模块 (2)在浏览器中使用的XMLHttpRequest 2.vue中的使用方法 (1)安装:npm install axios (2)引用方法: 原生的方式(不推荐使用) axios({ url:'http://127.0.0.1:9001/students/test', //远程服务器的url method:'get', //请求方式

  • Vue.js学习笔记之 helloworld

    Vue.js 是用于构建交互式的 Web 界面的库. Vue.js 提供了 MVVM 数据绑定和一个可组合的组件系统,具有简单.灵活的 API. 先来看一个简单的示例,Hello,World! <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Vue学习</title> <script src="/vue/1.0.11/vue.m

  • 用Vue.extend构建消息提示组件的方法实例

    前提 前段时间自己做的vue练手项目,需要一个通用的消息提示组件,但是消息提示这种组件我更想用方法来调用,而不是在各个页面上都添加个组件(那样感觉很麻烦,重度懒癌患者),于是就上网差查了查,并研究了ElementUI的message源码.自己弄出来一个简陋的消息提示组件 Vue.extend是什么 按照官方文档说法,他是一个类构造器,用来创建一个子类vue并返回构造函数,而Vue.component它的任务是将给定的构造函数与字符串ID相关联,以便Vue.js可以在模板中接收它. 了解了这点之后

  • 原生js封装运动框架的示例讲解

    昨天我们说了一下原生JS中常用的兼容性写法,今天我们来说一下运动框架. 正常情况下我们要写一个运动的效果会用到tween.js这么一个插件,这个东西不是一般人写出来的,因为里面涉及的运动效果都是经过一堆数学的函数运算出来的,我们平常人是写不出来的,所有我们就自己封装一个运动框架,有什么问题改起来也方便,下面我们就开始封装. 首先,我们先写一个div,设置一些简单的样式,我们就拿这个div举例子 如下代码: #div{ width: 100px; height: 100px; background

随机推荐