如果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去继承一个组件,现在我需要在新创建的组件中适当改变继承组件的某些具名插槽,该如何做到呢?

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

相关推荐
程序员黑豆11 小时前
Java 注释详解:单行、多行与文档注释的完整指南
java·前端·ai编程
剪刀石头布啊11 小时前
antd中可编辑表格中巧用useWatch实现联动高性能效果,以及定制延伸学习
前端
油丶酸萝卜别吃12 小时前
前端转全栈学习路线
前端·学习
浮生望12 小时前
前端路由进阶:History API原理与手写HistoryRouter
前端
陆枫Larry12 小时前
JavaScript 中的竞态是什么,为啥会有竟态?
前端
上海安当技术15 小时前
半天接入:USBKey RESTful API + C 动态库,Web 和 C/S 两套集成路径实战
前端·后端·restful·集成·usbkey
DevUI团队15 小时前
从“即兴创作”到“规格先行”,华为云码道(CodeArts)代码智能体持续深耕企业级规范驱动开发能力
前端·人工智能·后端
weixin_4316004416 小时前
NestJS 入门(3):Guard 如何挡住未登录请求?
前端·后端·学习·nest.js
kyriewen16 小时前
我用Claude Code两天干完了团队两周的排期——周报发出去那一刻我就后悔了
前端·javascript·ai编程
IT_陈寒17 小时前
JavaScript类型转换把我坑惨了,这破玩意真该早点搞明白
前端·人工智能·后端