如果vue使用高阶组件,那么能起飞吗?

前言

  1. 首先你需要知道什么是高阶组件?
  2. 高阶组件能解决什么问题呢?
  3. 如果你了解并使用过react,那么我想这个概念你不会觉得很陌生
  4. 好像vue解决的方案会很多,高阶组件真的需要去扩展吗?
  5. 高阶组件就真的很完美吗?
  6. 源码

高阶组件是什么

我觉得可以这么理解高阶组件,讲的直白点,就是一个组件通过一个函数处理,并返回一个组件,看上去也不是很拗口,就像是某个组件需要经过一个管道,而这个管道说简单了就是一个中间件,其实这可以说是一种开发思想,我们用代码标识新组件 = Hoc函数(传递的组件)
React中,诸如Redux、React-router等都有这类思想贯穿着,React.context这类Api我想大概率都很熟悉才是

高阶组件能解决什么问题呢

  • 属性代理
  • 条件渲染
  • 权限鉴权
  • 反向代理
  • 组件的继承与扩展...

咱们就直接开门见山就着上面几点详细的说下吧,也希望小伙伴们补充留言,一起交流学习。

项目介绍

  • 本次我会以一个小demo的形式展现这次分享
  • 项目中我才用的技术栈是vue3 + jsx的形式
  • 详情请参阅下面的源码一起造轮子
  • 本小节代码

属性代理

属性代理这个按照我的理解,可能就是如果有一个基础组件已经完成,可是这个时候想要扩展些属性,比如我们需要透传一些额外的属性方案等,那么前提还不影响基础组件的功能

我会以截图的形式跟大家分享思路,具体的源码还是请大家自己查阅

那么基础组件是PopsTransfer.vue,通过HocOne.jsx这个方法包裹

js 复制代码
HocOne.jsx

export default function HocOne(Comp) {
  const userInfo = {
    username: 'chrisworkalx',
    hobbies: ['eat', 'playing']
  };

  // return setup(props, { attrs, emit, expose, slots }) {},
  return ({ ...defaultProps }) => {
    return <Comp user={userInfo} {...defaultProps} />;
  };
}

总结:这里只是透传一个额外属性userInfo,日常开发中可能会涉及更加复杂的场景比如可能会有http请求携带一些额外的数据
事实上确实一定程度上实现了逻辑的复用

条件渲染

这里我只是举了一个例子,比如我们日常在开发中,页面多多少少会涉及到一些http请求,那么我们在考虑一种没有工程化处理好http的一些钩子函数(举个例子,如果你使用过axios这个工具类,一般会将拦截器统一配置好,现在是我们没有做这一层),比如说请求中、请求结束一些状态控制,其实也可以采用高阶组件的形式设计

请参照HocTwo.jsx这个文件

loading.vue

总结:事实上除了可以做一些条件渲染,比如我们日常开发中如果封装一层Error(错误边界)组件,其实也可以才用高阶组件的形式;甚至是做做一些性能监控都是可以的

权限鉴权

Q:一般你在开发一些后台管理系统时候,如果采用vue框架去开发的话,比如一些页面权限,按钮权限,路由权限等怎么去控制呢?

A:今天我们就说一个按钮权限控制吧,其实大概率一般采用指令比较多

我在这个文件下面写了一个简单的指令,这个指令在main.js注册

AuthButton-dir.vue使用

所以如果我们换种思路可以实现吗?答案是当然

指令是vue模板编译的优势,现在如果我们使用高阶组件怎么实现呢?

请参照HocAuth.jsx

在这里这样使用

组件的复用

  1. 我想通过不管你通过怎样的方式都能实现这个功能,比如说代理模式、适配器模式、vue提供一些比较好用的方法
  2. vue2的时候我们可以使用mixin, extend等实现
  3. 今天分享下vue3中一些不同用法吧

请参照HocExtend.jsx

这样使用

文章结尾,遇到一个问题,查阅了一些资料暂时没找到解决方案,就是vue3 setup语法下如果通过extend去继承一个组件,现在我需要在新创建的组件中适当改变继承组件的某些具名插槽,该如何做到呢?

这里标红的打印,如果按照上面操作,好像并没有真的概念被继承组件的插槽使用,期待您的回复

相关推荐
To_OC4 小时前
别再串行写 await 了,Promise.all 才是并行请求的正确打开方式
前端·javascript·promise
vipbic4 小时前
中后台越做越乱后,我用插件化把它救回来了
前端·vue.js
Hyyy4 小时前
Computer Use 适合做什么,不适合做什么——一次真实使用后的思考
前端
小和尚同志5 小时前
前端 AI 单元测试思考与落地
前端·人工智能·aigc
invicinble6 小时前
c端系统,其实更像一个信息展示平台
前端
李姆斯7 小时前
管理是否可以被完全量化
前端·产品经理·团队管理
名字还没想好☜7 小时前
Next.js 中间件实战:鉴权、重定向与 A/B 分流
开发语言·前端·javascript·中间件·react·next.js
广州灵眸科技有限公司7 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) INI文件操作
java·前端·javascript·网络·人工智能
kaiking_g8 小时前
vue项目中,静态导入 vs 动态导入 详解
前端·javascript·vue.js
江华森8 小时前
Web 开发基础:HTTP 与 REST
前端·网络协议·http