Vue extend使用示例深入分析

目录
  • 一、使用场景
  • 二、补充组件注册
  • 三、深度解析

Vue.extend()虽然已近用过很多次了,但都没有深入思考过这个东西,仔细想了想,有点意思

一、使用场景

按需使用组件,也叫懒加载,性能蹭蹭往上走

扩展的组件,其自由度高到你无法想象

二、补充组件注册

平日里,我们使用组件:

黄金玩家:

<template>
    <A/>
</template>
import A from "./A.vue";
export default {
  components: {
    A
  },
}

铂金玩家

import Vue from "vue"
import A from "./A"
  Vue.component("A", A) 

钻石玩家

import Vue from "vue";
// 检索目录下的模块
const req = require.context(".", true, /\.vue$/);
req.keys().forEach(fileName => {
  // require模块
    const componentConfig = req(fileName);
    const name =
      fileName.name ||
      fileName.replace(/^\.\/(.*\/)?/, "").replace(/\.vue$/, "");
      Vue.component(name, componentConfig.default || componentConfig);
});

王者玩家

不必多说,今日主角!闪亮登场!

   // 创建一个构造器
    const Constructor = Vue.extend(test);
    // 利用构造函数创建实例
    //创建过程中可 向组件中传入数据
    const instance = new Constructor({
      propsData:{
        age:'23'
      }
    });
    // instance.age = 29
    // 挂载到某个dom上
    instance.$mount(this.$refs.container)

三、深度解析

聊聊天

为什么我会对其赞不绝口,我收了钱吗?也有可能。

回归正题,开始聊这个之前先提一下vue的工作机制,尤其是cli的打包运作。在项目完成后,执行命令打包,只会将项目里用到的 .vue、.js、.css、.json、.svg等等文件进行打包,所以如果你是从老项目迁移开发,原本几百兆的文件夹,打包后可能只有十几二十兆,当然这需要你的懒加载做的比较好。

上面说的还是有点抽象,说点我们能感知到的。假设你写了下面这么一个组件test.vue,但是你脑子转太快了,以至于手速都跟不上,所以,你犯错了,age没定义你就使用了,那势必会报错对吧?其实并不会,你不导入,不使用它,一点事情没有,它只会在那错下去孤独终老。

<template>
  <div class="container">
    我是扩展,挂接外面的div的组件啦
    <div>{{ age }}</div>
  </div>
</template>
<script>
export default {
  data() {
    return {};
  }
};

但是你只要一导入,使用,立马报错:

再次回到刚刚那个点:你不引入它,就不会报错。那按需引入,使用到才引入,有没有一种办法,我使用的时候再传age给test组件呢?岂不是美哉?Vue.extend()就可以完美做到!

再浅谈一下Vue.extend()是个啥

他也不是什么特别高大上的东西,官方说是个继承构造器,讲人话就是构造函数。通过构造函数可以实例化对象,这个构造函数很特殊,他是Vue构造函数的子构造函数,继承与Vue的Constructor(),所以理所当然的,他的参数就与Vue的参数一样:

上个例子瞧瞧

子组件声明props接收

<template>
  <div class="container">我是扩展,挂接外外面的div的组件啦
  <div>{{age}}</div>
  </div>
</template>
<script>
export default {
   props: {
     age: {
       type: String,
       default: ""
    }
  }
};

父组件用extend控制实例化这个对象并挂载到对应DOM上,可以使用propData进行传值

<template>
  <div ref="container" class="container">
  </div>
</template>
<script>
import Vue from "vue";
import test from "./components/Vue.extend/test";
export default {
  mounted() {
    // 创建一个构造器
    const Constructor = Vue.extend(test);
    // 利用构造函数创建实例
    //创建过程中可 向组件中传入数据
    const instance = new Constructor({
      propsData:{
        age:'23'
      }
    });
    // 挂载到某个dom上
    instance.$mount(this.$refs.container)
  },
  methods: {}
};
</script>

亮点是什么呢?这里的test组件的prop可以直接去掉:

<template>
  <div class="container">我是扩展,挂接外外面的div的组件啦
  <div>{{age}}</div>
  </div>
</template>

父组件中以实例属性形式网上挂接数据,自由度真的太高了!!!这样运用起来,可以封装出意想不到的组件库。现在主流UI库的很多巧妙逻辑都是使用了,Vue.extend(),只不过是搭配上函数对懒加载进行控制

<template>
  <div ref="container" class="container">
  </div>
</template>
<script>
import Vue from "vue";
import test from "./components/Vue.extend/test";
export default {
  mounted() {
    // 创建一个构造器
    const Constructor = Vue.extend(test);
    // 利用构造函数创建实例
    //创建过程中可 向组件中传入数据
    const instance = new Constructor();
    //可以直接以属性方式挂接到实例上
    instance.age = 29
    // 挂载到某个dom上
    instance.$mount(this.$refs.container)
  },
};
</script>

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

(0)

相关推荐

  • 通过vue.extend实现消息提示弹框的方法记录

    前提回顾 在项目开发中我们经常使用的组件注册分为两种,一个是全局注册和另一个是局部注册,假设我们的业务场景是用户在浏览注册页面时,点击页面中的注册按钮后,前端根据用户的注册信息先做一次简单的验证,并根据验证弹出一个对应消息提示弹框 我们拿到这个需求后,便开始着手准备要通过局部注册消息弹框组件的方法来实现这个场景,在通过局部注册消息弹框组件的方法解决完这个需求后,自然是沾沾自喜,紧接着又迎来了一个需求,该需求是用户在点击该注册按钮时,点击几次就要出现几次这个消息弹框,你开始犯了难,并思考难道我要在

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

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

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

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

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

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

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

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

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

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

  • Vue extend的基本用法(实例详解)

    Vue.extend 属于 Vue 的全局 API,在实际业务开发中我们很少使用,因为相比常用的 Vue.component 写法使用 extend 步骤要更加繁琐一些. 我们创建Vue实例时,都会有一个el选项,来指定实例的根节点,如果不写el选项,那组件就处于未挂载状态.Vue.extend 的作用,就是基于 Vue 构造器,创建一个' 子类 ',它的参数跟new Vue的基本一样,但data要跟组件一样,是个函数,再配合$mount,就可以渲染组件,并且挂载到任意指定的节点上,比如body

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

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

  • Vue extend使用示例深入分析

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

  • 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使用Vue.extend创建全局toast组件实例

    目录 Vue.extend创建全局toast组件 关于vue.extend的理解应用 基本概念 官网基本示例 应用 总结 Vue.extend创建全局toast组件 src -> components -> Toast -> toast.vue <template>   <transition name="fades">     <div class="Errormes"  v-if="show"&

  • Vue.extend构造器的详解

    Vue.extend构造器的详解 1.简单介绍 Vue.extend(options) 参数:对象 用法:使用Vue构造器,创建一个"子类",参数是一个包含组件选项的对象,其中,data选项中必须是函数 描述:Vue.extend返回的是一个"扩展实例构造器",也就是预设了部分选项的Vue的实例构造器,它常常服务于Vue.component用来生成组件,可以简单理解为当在模板中遇到该组件作为标签的自定义元素时,会自动调用"扩展实例构造器"来生产组

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

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

  • 关于vue.extend和vue.component的区别浅析

    前言 最近一个朋友问我vue.extend和vue.component两者之间有什么区别?突然这么一问竟答不出来,回来想想有必要总结下,所以本文就来给大家介绍关于vue.extend和vue.component的区别,下面话不多说了,来一起看看详细的介绍吧. Vue.extend 返回的是一个"扩展实例构造器",也就是一个预设了部分选项的 Vue 实例构造器 var myVue = Vue.extend({ // 预设选项 }) // 返回一个"扩展实例构造器" /

  • vue.extend实现alert模态框弹窗组件

    本文通过Vue.extend创建组件构造器的方法写弹窗组件,供大家参考,具体内容如下 alert.js文件代码 import Vue from 'vue' // 创建组件构造器 const alertHonor = Vue.extend(require('./alert.vue')); var currentMsg = {callback:function(){ }} export default function(options){ var alertComponent = new alert

  • 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 实

随机推荐