vue可复用性 & 组合
前言
俗话说「懒是程序员的美德」。
在越来越注重前端工程化的今天,「Ctrl+C」、「Ctrl+V」的代码,虽然用起来一时爽,一旦需要修改就如同面临火葬场。如何「懒」出效率,是值得思考的问题。
减少代码的拷贝,增加封装复用能力,实现可维护、可复用的代码,无疑是我所认为的「懒」的高级境界。
react的高阶组件、自定义hooks等等来实现组件复用。当然vue也有对应的方案
所以就借此机会,谈谈 Vue 中各种基于组件的复用与实现方式
继承
继承是vue2提供的一个特性,vue3中已经给移除了。
通过关键字extends,我们可以让允许声明扩展另一个组件
var CompA = { ... }
var CompB = {
extends: CompA,
data(){return{...}}
}
如上 CompB组件便可以直接访问CompA组件的属性和方法,非常的方便
Vue.extend 和这个原理一样,不过Vue.extend主要是用于编写全局插件用,如Toast
如果看过vue源码,就能知道extend的方法实现其实就是js组合式继承方案
混淆
目前vue2和vue3均支持
// 定义一个混淆对象
const myMixin = {
created: function () {
this.hello()
},
methods: {
hello: function () {
console.log('hello from mixin!')
}
}
}
// 组件局部混入
export default {
mixins: [myMixin],
data() { return {...} },
}
在vue3中之所以依然保留,是因为vue3推崇的混合式函数继承方案(不懂得下边有说明),无法做到混入复用钩子函数。
混合式函数
此方案只能用在vue3的混合式api的组件中
此方案解决最大的问题就是 响应式数据(状态)的复用。
在次之前,普通方法复用我可以提取出去一个js文件,钩子复用我可以用mixins,唯独状态复用只能extends或 mixins。
extends是基于js继承方案之组合式继承,它的弊端大家都知道
mixins弊端,在vue3文档有说明
在 Vue 2 中,mixin 是将部分组件逻辑抽象成可重用块的主要工具。但是,他们有几个问题:
Mixin 很容易发生冲突:因为每个 mixin 的 property 都被合并到同一个组件中,所以为了避免 property 名冲突,你仍然需要了解其他每个特性。
可重用性是有限的:我们不能向 mixin 传递任何参数来改变它的逻辑,这降低了它们在抽象逻辑方面的灵活性。
为了解决这些问题,我们添加了一种通过逻辑关注点组织代码的新方法:组合式 API。
/src/composables/use-student.js
import axios from "axios";
import { ref } from "vue";
const useStudent = () => {
const student = ref([]);
const syncStudent = async () => {
const res = await axios.get("/getStudent");
student.value = res.data.list;
};
return { student, syncStudent };
};
export default useStudent;
/src/App.vue
<script setup>
import useStudent from '../composables/use-student';
const { student, syncStudent } = useStudent();
</script>
<template>
<div id="app">
{{ JSON.stringify(student) }}
<button @click="syncStudent">测试</button>
</div>
</template>
附赠一个上边例子的mock
Mock.mock("/getStudent",options=>{
return Mock.mock({
"list|2":[{
id:()=>Random.guid(),
name: ()=>Random.cname(),
age:()=>Random.integer(1,100)
}]
})
})

其它
extends和mixins都可以用来复用状态,
但是后来被混合式函数继承给取代来,
混合式函数继承写起来更加通俗易懂和没有副作用,
因mixins可以混入钩子,而混合式函数继承却不可以,故而mixins被保留了下来(类似于达到react的高阶组件能力)
除了以上说的3种方案可以到达组合&可复用外,提取组件本身就是所谓组合的一种体现,当然还有以下
- 指令
- 插件
- teleport & render
vue可复用性 & 组合的更多相关文章
- Vue+element组合el-table-column表头宽度自定义
[本文出自天外归云的博客园] 需求 1. 某列表头文字内容过长,要对每列表头自定义宽度 2. 表格row的每一column文字不换行,超过列宽则省略,mouseover有提示 3. 对于label做滤 ...
- 三十分钟学完Vue
基础知识: vue的生命周期: beforeCreate/created. beforeMount/mounted. beforeUpdate/updated. beforeDestory/desto ...
- Vue 重点 必须要记住的
基础知识: vue的生命周期: beforeCreate/created. beforeMount/mounted. beforeUpdate/updated. beforeDestory/desto ...
- Vue 超快速学习
Vue 超快速学习 基础知识: 1.vue的生命周期: beforeCreate/created. beforeMount/mounted. beforeUpdate/updated. beforeD ...
- Vue知识点超快速学习
基础知识: vue的生命周期: beforeCreate/created.beforeMount/mounted.beforeUpdate/updated.beforeDestory/destorye ...
- Vue基础知识简介
基础知识: vue的生命周期: beforeCreate/created.beforeMount/mounted.beforeUpdate/updated.beforeDestory/destorye ...
- Vue进阶
组件深入 过渡&动画 可复用性&组合 工具&规模化&内在 ****************参考*************** vue官方教程
- Vue快速上门(3)-组件与复用
VUE家族系列: Vue快速上门(1)-基础知识 Vue快速上门(2)-模板语法 Vue快速上门(3)-组件与复用 01.component组件 1.1.component基础知识 组件是可以复用的V ...
- vue将指定区域的表格数据或element-ui中el-table的数据单笔或多笔批量导出excel
公司在后台管理系统开发中用到了 vue+element-ui 组合的框架,但随着需求的越来越复杂,前端的工作难度也呈几何倍数递增,工作量随之增大.这不,在项目中增加一个将列表数据导出为excel的需求 ...
- vue使用webpack压缩后体积过大要怎么优化
vue使用webPack压缩后存储过大,怎么优化 在生产环境去除developtool选项 在webpack.config.js中设置的developtool选项,仅适用于开发环境,这样会造成打包成的 ...
随机推荐
- .net clr 8年才修复的BUG,你让我损失太多了
一.概述 .NET社区修复问题可谓是龟速,一个BUG在.NET 7.0+版本才修复,你让我损失了几万块,我现在还记得客户那种质疑的表情,你了解那种尬尴的气氛吗?你让我一度怀疑dotnetty,我从来不 ...
- mac 系统软件推荐
幕布: https://mubu.com/home 石墨文档: https://shimo.im
- 电商商品推荐系统实战:基于TensorFlow Recommenders构建智能推荐引擎
引言:推荐系统的商业价值与实现挑战 在电商领域,推荐系统承担着提升用户转化率和平台GMV的核心使命.根据麦肯锡研究,亚马逊35%的销售额来自推荐系统,Netflix用户75%的观看行为由推荐驱动.传统 ...
- Spring纯注解的事务管理
Spring纯注解的事务管理 源码 代码测试 pom.xml <?xml version="1.0" encoding="UTF-8"?> < ...
- Java编程--接口(interface)简单用法(一)
接口是Java中的一个重要的概念. interface:定义了子类要实现的功能.由全局常量和抽象方法组成. 接口的定义 定义一个简单的interface public interface A { p ...
- Sentinel——网关限流
目录 网关限流 route维度 自定义异常 重定向 自定义结果 API维度 网关限流代码配置 网关限流 Sentinel 支持对 Spring Cloud Gateway.Zuul 等主流的 API ...
- django笔记(3)-数据库操作
一:路由系统 url 1.url(r'^index/', views.index),url(r'^home/',views.Home.as_view()), 一个url对应一个函数或一个类 ...
- K8s进阶之一文搞懂PV,PVC及SC
前言 想了解Pod的基本存储,可以参考这篇文章:K8s新手系列之Pod的基本存储 概述 官方文档: 配置Pod使用PV进行存储:https://kubernetes.io/zh-cn/docs/tas ...
- VNCTF-Misc
VNCTF-Misc VN_Lang 直接IDApro打开,shift+F12检索字符串 Echo Flowers echo_flowers.ovf文件,可以使用vmware挂载 有个imToken, ...
- 赛前十天——递归(easy)
*理论上,递归与循环是等价的,即任何循环都可以重写为递归形式 eg: package javaPractice; public class Contest { public stati ...