位置: IT常识 - 正文

Vue:extends继承&组件复用性(vue组件继承element并重写方法)

编辑:rootadmin
Vue:extends继承&组件复用性

推荐整理分享Vue:extends继承&组件复用性(vue组件继承element并重写方法),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue组件继承element并重写方法,vue组件继承element并重写方法,vue 组件继承后更改template,vue继承现有的组件,vue.extend 的详解,vue.extend 的详解,vue3继承,vue继承现有的组件,内容如对您有帮助,希望把文章链接给更多的朋友!

        提到extends继承,最先想到的可能是ES6中的class、TS中的interface、面向对象编程语言中中的类和接口概念等等,但是我们今天的关注点在于:如何在Vue中使用extends继承特性。

目录

Vue:创建Vue实例的方式

构造函数方式:new Vue

Vue.extend方式

Vue.component方式

render渲染函数方式

对象方式

Vue:extends继承特性


Vue:创建Vue实例的方式

        再开始探讨Vue继承相关的内容之前,有必要回顾一下创建Vue组件实例的几种方式,个人总结如下,

构造函数方式:new Vue

        这种方式是较为常见的,在Vue-cli脚手架构建的前端项目中,经常看到如下所示的代码段,

new Vue({ router, store, render: h => h(App)}).$mount('#app')

        这就是在以Vue构造函数的方式创建实例,然后将其挂载到id选择器为app的DOM元素上。

Vue.extend方式

        Vue.js开发库提供了Vue.extend()API,用于创建一个组件。

        Vue.extend()方法的源码如下,内部主要是创建了一个Vue组件对象,并通过外部配置项,将其props、computed、mixin等选项设置为可用,最终将对象返回,

/** * Class inheritance */ Vue.extend = function (extendOptions) { extendOptions = extendOptions || {};//外部配置项-即:Vue组件的选项配置 console.log(extendOptions) var Super = this;//指向Vue自身实例的引用 var SuperId = Super.cid; var cachedCtors = extendOptions._Ctor || (extendOptions._Ctor = {}); if (cachedCtors[SuperId]) { return cachedCtors[SuperId]; } var name = getComponentName(extendOptions) || getComponentName(Super.options); if (name) { validateComponentName(name); } var Sub = function VueComponent(options) { this._init(options); }; Sub.prototype = Object.create(Super.prototype); Sub.prototype.constructor = Sub; Sub.cid = cid++; Sub.options = mergeOptions(Super.options, extendOptions); Sub['super'] = Super; // For props and computed properties, we define the proxy getters on // the Vue instances at extension time, on the extended prototype. This // avoids Object.defineProperty calls for each instance created. if (Sub.options.props) { initProps(Sub); } if (Sub.options.computed) { initComputed(Sub); } // allow further extension/mixin/plugin usage Sub.extend = Super.extend; Sub.mixin = Super.mixin; Sub.use = Super.use; // create asset registers, so extended classes // can have their private assets too. ASSET_TYPES.forEach(function (type) { Sub[type] = Super[type]; }); // enable recursive self-lookup if (name) { Sub.options.components[name] = Sub; } // keep a reference to the super options at extension time. // later at instantiation we can check if Super's options have // been updated. Sub.superOptions = Super.options; Sub.extendOptions = extendOptions; Sub.sealedOptions = extend({}, Sub.options); // cache constructor cachedCtors[SuperId] = Sub; return Sub; }Vue:extends继承&组件复用性(vue组件继承element并重写方法)

        通过查看Vue.extend()方法的源码,我们会发现,它内部是在调用Vue原型对象上面的_init()方法来完成组件初始化,通过如下图所示的一些核心配置,使其成为一个名副其实的Vue组件实例,

         那么我们自己如何调用Vue.extend()方法创建组件呢?示例代码如下,

/** * 方式1-Vue.extend-使用基础 Vue 构造器,创建一个组件 * PS:此种方式中,data必须为函数 * */ const IButton = Vue.extend({ name: "IButton", template: `<button class="btn" @click="clickBtnHandler($event)">Click</button>`, methods: { clickBtnHandler(e) { console.log(e.target.dataset) } }, }) Vue.component('i-button', IButton);//Vue.component用途之一:将组件注册到全局环境Vue.component方式

        Vue.component()方法有两个作用,其①:将组件注册全局可用的组件;其②:以给定的id,创建一个全局范围内可用的组件。使用此接口创建一个Vue组件的示例代码如下,

/** * 方式2-Vue.component-间接调用Vue.extend,创建一个组件 * PS:此种方式中,data必须为函数 * */ const IList = Vue.component('i-list', { template: `<div> <p>列表</p> <ul> <li v-for="n in number">{{n}}</li> </ul></div>`, data: function () { return { number: 5 } } }) // Vue.component('i-list', IList);//Vue.component创建的组件无需再注册render渲染函数方式

        也可以通过Vue.js提供的render()渲染函数创建一个Vue组件,如下示例代码,通过render函数的函数,根据props参数level来创建了一个级别为level的h标签,并提供插槽供开发者对其进行拓展。

//方式3:基于渲染函数构造函数式组件-[基于slot插槽方式提供组件内容1] const ITitle = Vue.component( "i-title", { render: function (createElement) { return createElement( 'h' + this.level, // 标签名称 this.$slots.default // 子节点数组 ) }, props: { level: { type: Number, required: true } } });对象方式

        通过对象的形式定义组件-这也是我们在Vue前端应用开发中最常使用的方式,然后通过export default导出。示例代码如下,

//方式4-通过对象的形式定义组件-这也是我们在Vue前端应用开发中最常使用的方式,然后通过export default导出 const InfoBox = { name: "InfoBox", template: `<div class="box" :style="styleObject">{{content}}</div>`, data() { return { content: '消息内容', styleObject: { boxSizing: "border-box", padding: "25px", width: '300px', height: '200px', backgroundColor: 'rgba(0,0,0,0.3)' } } } } Vue.component('info-box', InfoBox);//Vue.component用途之一:将组件注册到全局环境Vue:extends继承特性

        第一部分只介绍了如何创建一个组件,并没有介绍如何去提高一个组件的复用性。既然谈到复用性,可行的方法有很多,例如:slot插槽、mixix混入、Vue.directive自定义一个可复用的指令、通过Install方法开发一个可复用的插件、通过Vue.filter定义一个可复用的过滤器等。关于如上内容,Vue官网都有详细的介绍。

        而接下来要讨论的就是Vue官网里面介绍比较含蓄的一种方法:借助extends实现组件的继承。

         那么具体如何操作呢?我们先来定义一个基础列表组件IList,并以事件委托的方式为每一个列表元素注册点击事件,示例代码如下,

<!-- * @Description: IList列表组件,基于事件委托机制对列表事件回调做了优化处理 * @Author: Xwd * @Date: 2023-02-16 00:21:49 * @LastEditors: Xwd * @LastEditTime: 2023-02-19 17:03:25 * @Attention: 此列表组件的clickHandler()点击事件默认基于index下标来选择性的返回item的值,在一些场景下存在风险--><template> <div class="i-list"> <p v-if="!!title" class="i-title">{{ title }}</p> <!-- <div class="split-horizon"></div> --> <div v-if="(list || []).length > 0" class="i-content" @click="clickHandler($event)"> <div class="i-item" v-for="(item, index) in list" :key="index"> <img class="i-item-icon" :src="item.image || noImage" /> <div class="i-item-body"> <div class="i-item-title">{{ item.title }}<span class="iconfont" title="地图定位" :data-id="item.id" :data-index="index"></span></div> <div class="i-item-desc" :title="item.desc">{{ item.desc }}</div> </div> </div> </div> </div></template><script>import noImage from '@/assets/images/no.png';export default { name: "IList", props: { title: { type: String, required: false, default: "", }, list: { type: Array, required: false, default: () => [], } }, mounted() { }, methods: { /** * 列表元素点击事件-回调函数 * @param {*} event */ clickHandler(event) { const index = event.target.dataset.index; if (typeof index !== "undefined" && index !== null) { this.$emit("click", this.list[Number(index)], Number(index)); } } }}</script><style lang="less" scoped></style>

        而由于我们存在一些不确定因素,例如:props中的list是否具有唯一id、点击回调函数中的具体逻辑是什么?所以我们可以将次组件作为一个基组件,在后续使用过程中,在子组件TownList.vue中通过extends的选项,来继承IList组件,实现复用。示例代码如下,

<!-- * @Description: * @Author: Xwd * @Date: 2023-02-19 16:50:16 * @LastEditors: Xwd * @LastEditTime: 2023-02-19 16:56:57--><script>import IList from '@/components/layout/IList.vue';export default { name:"TownList", extends:IList, methods:{ /** * 列表元素点击事件-回调函数,覆写父组件方法,基于元素id值重定义处理逻辑 * @param {*} event 事件对象 */ clickHandler(event) { const id = event.target.dataset.id; console.log(`id=${id}`) if (typeof id !== "undefined" && id !== null) { const dataIndex = this.list.findIndex(item => item.id == id); dataIndex !== -1 & this.$emit("click", this.list[dataIndex], dataIndex) } } }}</script>

        此处我们通过id来区分每一个元素,并覆写了父组件中的clickHandler——点击事件回调方法。最终效果如下,

         此种方式的不足之处在于:无法在子组件中添加template节点,否则会直接覆盖掉原有的template模板。

本文链接地址:https://www.jiuchutong.com/zhishi/293773.html 转载请保留说明!

上一篇:元宇宙区块链协议Meta0宣布与Polygon建立合作关系(元宇宙产业链)

下一篇:梅萨维德国家公园的方形塔楼,美国科罗拉多州 (© lightphoto/Getty Images)(梅萨维德国家公园特点)

  • 荣耀20可以反向充电吗(荣耀20反向充电怎么关闭)

    荣耀20可以反向充电吗(荣耀20反向充电怎么关闭)

  • 苹果11充电器头型号(苹果11充电器头原装是多少w)

    苹果11充电器头型号(苹果11充电器头原装是多少w)

  • 微信光速抢票抢不到可以退吗(微信光速抢票抢不到可退费吗)

    微信光速抢票抢不到可以退吗(微信光速抢票抢不到可退费吗)

  • 华为p30耳机模式怎么关闭(华为p30耳机模式怎么取消)

    华为p30耳机模式怎么关闭(华为p30耳机模式怎么取消)

  • 小红书怎么置顶(小红书怎么置顶评论)

    小红书怎么置顶(小红书怎么置顶评论)

  • 魅族17和魅族17pro的区别(魅族17和魅族17pro屏幕通用吗)

    魅族17和魅族17pro的区别(魅族17和魅族17pro屏幕通用吗)

  • 手机后缀字母型号啥意思(手机后缀字母型号啥意思e)

    手机后缀字母型号啥意思(手机后缀字母型号啥意思e)

  • 苹果手机gsm和global是什么意思(iphone gsm)

    苹果手机gsm和global是什么意思(iphone gsm)

  • 入耳式耳机和半入耳式耳机的区别(入耳式耳机和半入耳式耳机哪个音质好)

    入耳式耳机和半入耳式耳机的区别(入耳式耳机和半入耳式耳机哪个音质好)

  • bin文件是干嘛的(bin文件怎么转换成pdf)

    bin文件是干嘛的(bin文件怎么转换成pdf)

  • 苹果指南针什么意思(苹果指南针功能)

    苹果指南针什么意思(苹果指南针功能)

  • java中的类是什么(java中类是什么)

    java中的类是什么(java中类是什么)

  • ps怎么激活(国产wps怎么激活)

    ps怎么激活(国产wps怎么激活)

  • 手机卡可以异地补卡吗(手机卡可以异地注销吗)

    手机卡可以异地补卡吗(手机卡可以异地注销吗)

  • 苹果无线耳机怎么挂电话(苹果无线耳机怎么充电是正确的)

    苹果无线耳机怎么挂电话(苹果无线耳机怎么充电是正确的)

  • ipad 一代二代区别(ipad一代二代什么意思)

    ipad 一代二代区别(ipad一代二代什么意思)

  • 苹果xsmax有高通基带吗

    苹果xsmax有高通基带吗

  • 荣耀v30什么时候上市(荣耀V30什么时候支持鸿蒙3.0)

    荣耀v30什么时候上市(荣耀V30什么时候支持鸿蒙3.0)

  • 微信如何转说说(微信说说转发怎么转)

    微信如何转说说(微信说说转发怎么转)

  • vetas是什么牌子(vETAS是什么牌子手机)

    vetas是什么牌子(vETAS是什么牌子手机)

  • iccid在哪里看(沃尔沃车的iccid在哪里看)

    iccid在哪里看(沃尔沃车的iccid在哪里看)

  • runservice.exe - runservice是什么进程 有什么用

    runservice.exe - runservice是什么进程 有什么用

  • Vue 批量上传,使用 el-upload 实现批量上传文件只调用一个请求,只需要一个上传按钮(vue批量上传图片至oss)

    Vue 批量上传,使用 el-upload 实现批量上传文件只调用一个请求,只需要一个上传按钮(vue批量上传图片至oss)

  • JS-获取网页滑动距离,并实时监听(js获取网页链接)

    JS-获取网页滑动距离,并实时监听(js获取网页链接)

  • vue返回上一页自动刷新方式(vue实现返回顶部)

    vue返回上一页自动刷新方式(vue实现返回顶部)

  • OpenCV笔记:cv2.VideoCapture 完成视频的跳帧输出操作(cv2.error:opencv(3.4.2))

    OpenCV笔记:cv2.VideoCapture 完成视频的跳帧输出操作(cv2.error:opencv(3.4.2))

  • 税后债务资本成本计算公式 中级会计
  • 业务招待费福利费怎么算超支
  • 小规模纳税人享受1%的税率
  • 备用金没有发票抵消违法吗
  • 员工培训的费用按照多少钱计入安措费
  • 资产负债表预收预付账款怎么填
  • 可以用来办理贴现的票据
  • 进口代理费取费标准
  • 技术开发免税收益方
  • 出售设备账务处理
  • 进项税超过销项怎么办?
  • 红字发票开具只能针对一份发票 不可以只冲红其中一部分吗?
  • 印花税滞纳金计算方法
  • 个人两处以上所得经营所得怎么申报
  • 房产企业可计入开发成本的利息如何确定?
  • 企业预付的固定资产折旧
  • 收到转账支票 转给下一家
  • 抵债资产会计核算办法
  • 农产品收购销售免税吗
  • 确认收入入账
  • 以物抵债的会计分录
  • 筹建期固定资产汇算清缴
  • php数组函数,选班长
  • php 注册
  • cyb2k.exe是安全进程吗 cyb2k进程危险吗
  • 职工福利费会计科目走管理费用
  • 炫龙笔记本win10系统为什么没有关闭触控板
  • php数组函数输出《咏雪》里有多少"片"字
  • PHP:imagecreatefromxbm()的用法_GD库图像处理函数
  • php打包网站并在哪里打开
  • 建筑物附属设备包括哪些
  • 退回以前年度税费
  • 请假扣款怎么做账
  • 视听结合的景物描写
  • uniapp返回上一页不刷新
  • Apsara Clouder云计算技能认证
  • PHP中spl_autoload_register()函数用法实例详解
  • 建筑业成本核算流程
  • 将外购商品用于捐赠的分录
  • 公司少申报个税
  • php判断是否为整数
  • pythongui库
  • 财务费用相关指标
  • 简述银行存款对应的业务
  • 企业所得税的营业收入怎么填
  • 新会计准则应付账款
  • sql查询语句大全实例教程
  • 购买的车位是否要交税
  • 收到采购材料发票款未付会计分录
  • 应交增值税进项税额月底怎么处理
  • 库存现金盘点表模板
  • 预计负债是暂时性差异还是永久性差异
  • 未使用和未投入使用
  • 企业间贴现手续怎么办理
  • 国税局个人所得税怎么申报
  • 年度所得税汇算清缴报告在哪打印
  • 返聘的退休人员需不需要缴纳社保
  • 残疾人就业保障金
  • 生产经营所得成本费用怎么算
  • 固定资产管理需要什么专业
  • 建账前应考虑什么问题
  • 公司怎么建
  • 删除mysql数据库中表的内容命令
  • sqlserver 查看表
  • mac怎么共享wifi密码给iphone
  • centos 7 安装
  • sentstrt.exe - sentstrt进程是什么文件 有什么用
  • win8 账户头像怎么改
  • win7如何格式化D盘
  • linux怎么禁用用户
  • qt底层绘图引擎
  • python 归并排序算法
  • oracle批处理语句
  • JavaScript中setMonth()方法的使用详解
  • 网上税务局电子发票怎么领用
  • 佛山市地方税务局与国家税务局合并没有
  • 垃圾填埋税率
  • 河北省十大杰出五四青年
  • csc联合培养博士资助标准
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设