当前位置: 首页 > Web前端 > vue.js

如何使用render函数封装高扩展组件

时间:2023-03-31 20:05:49 vue.js

如何使用render函数封装高扩展组件上一篇文章中提到,Vue官网给出的render函数示例只能体现优雅的一面render函数,但是没有看到它的扩展性,今天我们来封装一个体现其扩展性的组件。需求后台管理经常有如下布局的数据展示需求:像表而不是表,像表而不是表,实际上看起来像表,呈现的数据是一个对象,和绑定是一样的形式的价值。称为表格形式。深列是标题,浅列是标题对应的值。数据往往由服务器返回,标题往往是固定宽度的。值可能不同。比如显示一张图片,值为01,需要显示yes或者no,有时候需要添加一个修改按钮,让用户修改某些值,还需要设置某个列来span几列。我们来看一个基于elementui的糟糕实现。在我接手的一个项目中看到一个实现。我们先看看用法{{data.presentedHours}}编辑

{{data.gifts}}Modify
lessonPackageInfo对象的结构如下://一个对象,用于配置title列和对应的字段titlecolumn//type指定了value的类型,现在组件内部设置可能会显示哪些类型的values//对于service来说,返回10来显示是否需要提供number一个map_data来映射//跨列的column属性设置//需要自定义显示内容到provideslotlessonPackageInfo:{orderType:{type:'option',desc:'classpackagecategory',map_data:{1:'firstorder',2:'Renewal',5:'免费课程'}},combo:{type:'text',desc:'Packagename'},presentedHours:{type:'text',desc:'Giveawayhours',slot:true},price:{type:'text',desc:'StandardPrice'},gifts:{type:'text',desc:'Gifts',column:3,slot:true},}道具不够直观,配置items怎么不完全数据驱动呢?为什么组件的配置项不好?这种需求是非常固定的。组件的输入,也就是props,应该最小化,组件的功能应该最大化。尽量为props提供默认值,以提高团队的开发效率。为什么它不是完全数据驱动的?该组件并非完全由数据驱动。如果需要自定义显示栏目,需要自己写一个模板。如果需要自定义很多列,就需要写很多模板代码。如果要再次提取,只能重新打包组件。如果您不提取它,模板代码可能会扩展。你可能经常看到每行500行的模板?臃肿的模板代码导致组件维护困难,需要在模板和js代码之间来回切换。此外,要添加一列自定义数据,至少需要修改两个地方。为什么需要完全数据驱动?虽然有扩展组件的槽,但是我们在写业务组件的时候要少用,而要尽量使用数据驱动的模板。因为数据是js代码,当组件代码展开时,很容易将js代码提取到一个单独的文件中,但是如果要提取槽代码,只能将组件重新打包。三大前端框架的设计理念都是数据驱动模板,这是区别于jQuery的重要特征,也是我们封装业务组件时首先遵循的原则。看了组件使用的问题,再看组件的代码:{{field.map_data[data[key]]}}{{field.map_data[data[key]]}}{{field.map_data[data[键]]}}{{field.map_data[data[key]]}}
暂无数据有什么问题?模板条件判断过多,自定义展示栏不优雅,需要引入TableColContent,增加了组件的复杂度。在TableColContent内部,依然会进行配置项类型的条件判断。部分代码分析完上面的实现问题,让我们看看好的实现见用法:组件说明:titleList为的列配置组件,一个数组,元素title属性为标题,prop指定从数据中取值的字段,span指定列值跨越的行数prop支持字符串,也支持函数。这就是实现自定义显示的方式。当功能比较大的时候,可以抽出来单独的js文件,也可以把整个titleList抽出来单独的js文件。参数h和data是怎么传入的?或者这个函数在哪里调用?h是createElement函数,data是组件内部的数据,与父组件传入的数据是同一个值。当一个普通函数的第一个参数是h时,它就是一个渲染函数。这种方式使用起来就简单多了。看内部实现实现自定义显示的方式,不是使用动态slot,而是使用一个函数组件Container,它接收一个render函数作为propexportdefault{name:'Container',functional:true,render(h,{props}){returnprops.renderContainer(h,props.data)},}在Container内部调用titleList传入的函数。安装npm体验包后有2.8M,很大。估计没人会用,所以就不做优化了。综上所述,在封装组件时,优先考虑数据驱动的公共功能。第一个参数是h,即渲染函数。有些人可能不习惯写JSX,两种写法是兼容的。