Vue2中extend 的作用

Vue extend 的作用

Vue extend 是一个全局的api,基于vue 的构造函数去生成一个用于基于 Vue 构造函数创建一个"子类"(组件构造器),而这个子类也是一个 可以创建实例构造函数,所以在使用时也需要进行实例化操作

javascript 复制代码
const MyComponent = Vue.extend({
  // 组件选项
  template: '<div>A custom component!</div>'
})

// 创建并挂载实例
new MyComponent().$mount('#app')

主要特点

  1. 创建可复用的组件构造器‌:

    • 返回的不是组件实例,而是一个可以创建实例的构造函数
    • 类似于 ES6 中的类继承机制
  2. 继承基础选项‌:

    • 会继承传入选项对象中的所有 Vue 选项
    • 可以添加新的选项或覆盖父类选项
  3. 与组件注册的关系‌:

    • Vue.component() 内部使用了 Vue.extend
    • 直接注册组件对象时,Vue 会自动调用 Vue.extend

使用场景

  1. 编程式创建组件
javascript 复制代码
const Alert = Vue.extend({
        template:`<div>Alert-Componend</div>`
})
new Alert().$mount(document.CreateElement('div'))
  1. 扩展已有组件
javascript 复制代码
// 基础按钮组件
const BaseButton = Vue.extend({ 
        template: `<button class="base-btn" @click="onClick">{{ text }}</button>`, 
        props: ['text'], 
        methods: {
            onClick() { 
                this.$emit('click'); 
            }
        } 
    }); 
    // 扩展出危险按钮(覆盖样式和文本) 
    const DangerButton = BaseButton.extend({ 
        template: `<button class="base-btn danger-btn" @click="onClick">{{ text }}</button>`,   
        props: { text: { default: '危险操作' } } 
    }); 
    // 全局注册扩展后的组件 
    Vue.component('danger-button', DangerButton);
  1. 高阶函数
javascript 复制代码
function withLogger(WrappedComponent) {
  return Vue.extend({
    extends: WrappedComponent,
    mounted() {
      console.log('Component mounted')
    }
  })
}

4.与 Vue 实例结合的复杂场景

javascript 复制代码
// 基础按钮组件
const BaseButton = Vue.extend({
  template: `<button class="base-btn" @click="onClick">{{ text }}</button>`,
  props: ['text'],
  methods: {
    onClick() {
      this.$emit('click');
    }
  }
});

// 扩展出危险按钮(覆盖样式和文本)
const DangerButton = BaseButton.extend({
  template: `<button class="base-btn danger-btn" @click="onClick">{{ text }}</button>`,
  props: {
    text: {
      default: '危险操作'
    }
  }
});

// 全局注册扩展后的组件
Vue.component('danger-button', DangerButton);

注意事项

  • vue3 已经移除了,defineComponent +steup 取代
  • 返回的是组件实例的构造函数,需要通过 new 关键字实例化,在通过 $mount 挂载
相关推荐
程序员杨工1 小时前
【原创】SpringBoot3+Vue3客户管理系统
vue.js·springboot
theOtherSky2 小时前
element+vue3 table上下左右键切换input和select
javascript·vue.js·elementui·1024程序员节
Pu_Nine_93 小时前
Vue 3 + TypeScript 项目性能优化全链路实战:从 2.1MB 到 130KB 的蜕变
前端·vue.js·性能优化·typescript·1024程序员节
一个处女座的程序猿O(∩_∩)O4 小时前
Vue CLI 插件开发完全指南:从原理到实战
前端·javascript·vue.js
姜至4 小时前
el-calendar实现自定义展示效果
前端·vue.js
拉不动的猪4 小时前
webpack分包优化简单分析
前端·vue.js·webpack
麦麦大数据5 小时前
F035 vue+neo4j中医南药药膳知识图谱可视化系统 | vue+flask
vue.js·知识图谱·neo4j·中医·中药·药膳·南药
麦麦大数据5 小时前
F037 vue+neo4j 编程语言知识图谱可视化分析系统vue+flask+neo4j
vue.js·flask·知识图谱·neo4j·可视化·编程语言知识图谱
Sheldon一蓑烟雨任平生6 小时前
Vue3 组件 v-model
vue.js·vue3·v-model·definemodel·v-model修饰符·自定义双向绑定组件·多个v-model绑定
OpenTiny社区6 小时前
如何使用 TinyEditor 快速部署一个协同编辑器?
前端·vue.js