当前位置: 首页 > wzjs >正文

石家庄大型网络公司宁波网站排名优化seo

石家庄大型网络公司,宁波网站排名优化seo,wordpress 内容格式,怎么与其他网站做友情链接Vue.extend 是 Vue 2 中的一个重要 API,用于基于一个组件配置对象创建一个“可复用的组件构造函数”。它是 Vue 内部构建组件的底层机制之一,适用于某些高级用法,比如手动挂载组件、弹窗动态渲染等。 ⚠️ 在 Vue 3 中已被移除,V…

Vue.extend 是 Vue 2 中的一个重要 API,用于基于一个组件配置对象创建一个“可复用的组件构造函数”。它是 Vue 内部构建组件的底层机制之一,适用于某些高级用法,比如手动挂载组件、弹窗动态渲染等。

⚠️ 在 Vue 3 中已被移除,Vue 3 使用 defineComponent 替代组件定义方式,推荐改用 Composition API 和函数式组件模式。

🧩 Vue.extend 的基本用法

const MyComponent = Vue.extend({template: '<div>Hello {{ name }}</div>',data() {return {name: 'World'};}
});

这个 MyComponent 是一个构造函数,你可以像创建 Vue 实例一样使用它:

const vm = new MyComponent();
vm.$mount('#app'); // 或者不传参数,使用 vm.$mount() + DOM 操作手动插入

📦 使用场景举例

✅ 动态创建组件实例(如弹窗)

const Popup = Vue.extend({template: '<div class="popup">我是弹窗</div>'
});const instance = new Popup();
instance.$mount(); // 不传参数,不插入页面
document.body.appendChild(instance.$el); // 手动挂载

✅ 结合 propsData 动态传值

const Alert = Vue.extend({props: ['message'],template: '<div class="alert">{{ message }}</div>'
});const alertInstance = new Alert({propsData: {message: '操作成功'}
});
alertInstance.$mount();
document.body.appendChild(alertInstance.$el);

✅ 用于组件库或插件封装(如 Message、Toast)

很多组件库(如 Element UI)内部使用 Vue.extend 构建弹窗或消息提示组件。

🔍深入理解:Vue.extend 做了什么?

本质上:

Vue.extend(ComponentOptions)

会返回一个新的组件构造函数,该构造函数是基于你传入的选项创建的,继承自 Vue 构造器,具备 Vue 实例的能力。

相当于内部做了:

function SubComponent() {Vue.call(this); // 继承 Vue 构造器// ...
}
SubComponent.prototype = Object.create(Vue.prototype);

所以你可以这样理解:

  • Vue.extend 类似于类的继承
  • 生成的构造器可以多次 new 实例化
  • 实例是完整的 Vue 实例,具备 data、methods、watch、生命周期等功能

❗ 注意事项

问题原因
this.xxx 报错未通过 $mount 激活组件
propsData 无效只能传给 Vue.extend 的实例,而不是组件本身
内存泄漏手动创建的组件需要手动 $destroy() 和移除 DOM

🚫 Vue 3 替代方案

Vue.extend 在 Vue 3 被移除,推荐使用:

✅ defineComponent + createApp

import { createApp, defineComponent } from 'vue';const Alert = defineComponent({props: ['message'],template: '<div>{{ message }}</div>'
});const app = createApp(Alert, { message: '你好 Vue 3' });
const container = document.createElement('div');
document.body.appendChild(container);
app.mount(container);

✅ 总结

内容Vue.extend
定义方式const Ctor = Vue.extend(options)
本质返回继承自 Vue 的构造函数
常见用途弹窗、动态组件、组件库
Vue 3 替代defineComponent + createApp()

例子

Vue 2 弹窗组件的样式增强版,加入了:

  • ✅ 遮罩层(点击遮罩可关闭)
  • ✅ 居中弹出 + 阴影 + 圆角
  • ✅ 动画效果(淡入、淡出)
  • ✅ 简洁现代风格(仿 Element UI)

🗂️ 目录结构

├── index.html
├── main.js
├── MyDialog.js

📄 MyDialog.js — 定义弹窗组件

// MyDialog.js
import Vue from 'vue';const MyDialog = Vue.extend({props: ['message'],data() {return {visible: false};},mounted() {// 延迟显示以触发动画setTimeout(() => this.visible = true, 10);},methods: {close() {this.visible = false;setTimeout(() => {this.$destroy();if (this.$el && this.$el.parentNode) {this.$el.parentNode.removeChild(this.$el);}}, 300); // 延迟移除以匹配动画},onMaskClick(e) {if (e.target === this.$el) {this.close();}}},template: `<div class="dialog-mask" @click="onMaskClick"><div class="dialog-box" :class="{ 'dialog-show': visible, 'dialog-hide': !visible }"><p class="dialog-message">{{ message }}</p><button class="dialog-close" @click="close">关闭</button></div></div>`,style: `.dialog-mask {position: fixed;top: 0; left: 0;width: 100vw; height: 100vh;background: rgba(0, 0, 0, 0.4);display: flex;align-items: center;justify-content: center;z-index: 9999;}.dialog-box {background: white;border-radius: 8px;padding: 20px 24px;box-shadow: 0 8px 20px rgba(0, 0, 0, 0.2);transform: scale(0.9);opacity: 0;transition: all 0.3s ease;min-width: 300px;}.dialog-show {transform: scale(1);opacity: 1;}.dialog-hide {transform: scale(0.9);opacity: 0;}.dialog-message {font-size: 16px;margin-bottom: 16px;}.dialog-close {background-color: #409eff;border: none;color: white;padding: 8px 16px;border-radius: 4px;cursor: pointer;}.dialog-close:hover {background-color: #66b1ff;}`
});// 注入样式(确保样式在页面中)
const style = document.createElement('style');
style.textContent = MyDialog.options.style;
document.head.appendChild(style);export default MyDialog;

📄 main.js — 使用 Vue.extend 创建实例并挂载

// main.js
import Vue from 'vue';
import MyDialog from './MyDialog.js';new Vue({el: '#app',methods: {showDialog() {const DialogConstructor = MyDialog;const instance = new DialogConstructor({propsData: {message: '这是一个提示弹窗'}});instance.$mount(); // 手动挂载组件document.body.appendChild(instance.$el); // 插入到页面}},template: `<div><button @click="showDialog">打开弹窗</button></div>`
});

📄 index.html — 引入脚本

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><title>增强版 Vue.extend 弹窗示例</title><style>/* 弹窗遮罩层样式 */.dialog-overlay {position: fixed;top: 0;left: 0;width: 100%;height: 100%;background: rgba(0, 0, 0, 0.6);display: flex;align-items: center;justify-content: center;z-index: 1000;}/* 弹窗内容样式 */.dialog-content {background: #fff;padding: 20px;border-radius: 5px;text-align: center;min-width: 300px;box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);}/* 过渡动画 - 淡入淡出 */.dialog-fade-enter-active,.dialog-fade-leave-active {transition: opacity 0.3s;}.dialog-fade-enter,.dialog-fade-leave-to {opacity: 0;}</style>
</head>
<body><div id="app"></div><!-- Vue 2 官方 CDN --><script src="https://cdn.jsdelivr.net/npm/vue@2/dist/vue.js"></script><!-- 使用 type="module" 加载我们的脚本 --><script type="module" src="./main.js"></script>
</body>
</html>
http://www.dtcms.com/wzjs/82978.html

相关文章:

  • 扬州建设工程信息网站关键信息基础设施安全保护条例
  • 网站建设的客户在哪里网站优化企业排名
  • 廊坊建设网站沧州网络推广公司
  • 做网站哪个便宜杭州百度推广电话
  • 建筑模板多少钱一块手机优化
  • 网站建设花多少钱智能网站推广优化
  • 云南昆明网站建设公司香飘飘奶茶软文
  • 沈阳设计网站公司哪家好广告策划
  • wordpress在本地打开很慢搜索引擎优化seo专员招聘
  • 网站平台建设做好公司宣传中央常委成员名单
  • 网站建设前景怎么样重庆网站排名优化教程
  • 微信开发者平台登录网站seo网络优化
  • 静态网站开发项目实验报告逆冬seo
  • 做网站为什么要买服务器专业外贸网络推广
  • 公司做网站注意什么现在做推广的新渠道有哪些
  • 群晖nas怎样做网站微信腾讯会议
  • fireworks8做网站负面口碑营销案例
  • 传媒公司可以做网站么网站seo排名优化
  • 做企业云网站的企业网站推广优化c重庆
  • 网站的建设流程具体有哪些游戏推广员平台
  • 重新做系统后怎么没有wordpress百度seo搜索引擎优化方案
  • 国外做外贸的小网站网络营销的六大特征
  • 怎么创建网站 优帮云如何做网站推广优化
  • 北京建委网站查询系统建立网站的基本步骤
  • 做黄色网站被抓了怎么处理代运营竞价公司
  • 汽车网站建设策划方案百度图片搜索
  • 企业网站的基本内容网站推广的平台
  • 有关外贸的网站有哪些内容国内搜索引擎排名2022
  • wordpress改变域名武汉seo技术
  • 学校学院网站建设意义seo分析是什么意思