透传,好东西啊

240 阅读3分钟

「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战

XX网二手车,没有中间商赚差价。但是往往就是有中间商造成了差价。 我们这篇文章的主题是透传, 意思就是虽然有个中间人,但是不赚差价。

透传就是说在传递一些东西时,经过某个节点之后,没有发生变化。就像传球一样,在某个球员传之前,它是个球,经过球员之后,它依然是个球,而且各项性质几乎没有变化。 像我们的前后端交互就不是这样,且不说http从物理层到应用层这之间数据包的增减,我们就但看,一个日期数据从前端到后端。 一般来说,一个日期数据在前端应该是个Date对象,往后端传递时,必然要转化为字符串,到了后端再转回日期对象。如果后端也是js的话,还可以说是100%还原Date, 如果是其他语言,显然就不可能具有jsDate的全部的特性。 当然,一般来说,这不影响,我们只要日期的毫秒数是一致就行了。

我主要想说的是, 透传在前端组件上的应用。一般我们用vue会用到ui组件库,比如element. 然后,由于业务需要,要对组件做一些简单的改造,又会重复用到,于是干脆把魔改后的组件又封装一次,二次封装。 但是二次封装有二次封装的麻烦

二次封装组件的麻烦

我们可能只是需要做一点小小的改动,往往这些小改动又是组件api并未提供的。 但是,因为这一点小小的改动,我们的代码可能就会大量重复这个组件本身已经具有的特性。 因为,所谓小改动就是尽可能维持原样。保持原样也就意味着,这个组件原本可以接收什么参数,二次的也要能接收,原本的事件监听,二次的也要可以监听。 这不就是在重复组件的源码吗。

要是能自动让根组件的属性和事件监听都传到目标子组件多好!

这显然不可能,必须得手动,不然谁知道你要给哪个子组件传。 不过,vue中有个可以批量传参的方式。

首先要开启根组件的 inheritAttrs: fasle ,禁用组件继承,以便把非prop属性给留下来。

然后使用 $attrs, $attrs, image.png; 因为 v-bind 本身就是一个对象,平常我们写的v-bind:title是绑定具体的title属性, 这样写表示绑定包含要绑定的属性的对象。

<!-- 绑定一个全是 attribute 的对象 -->
<div v-bind="{ id: someProp, 'other-attr': otherProp }"></div>

同样 v-on, $listener 也是这样。 结果就是

image.png

vue文档

补充:

react的透传也是类似的。

image.png