最近使用Vue业务开发上使用的是低代码框架。 对话框表格等通过数据驱动组件实现功能, 框架表格部分适配框架搞得一塌糊涂, 用js写到行内样式上 导致无法在业务层修改。
想到用函数劫持适配方法然后不执行框架的 执行我自定义的,完美解决了这个问题。
上代码
此处是封装的两个方法,采用了劫持原方法并不执行的方式
methods: {
// getTableHeight劫持者
hijacker() {
let that = this
return function () {
that.getTableHeight()
}
},
// 劫持处理
hijackFn(obj, method, fun) {
let orig = obj[method];
obj[method] = fun(orig);
},
getTableHeight函数就是我自定义的函数。当有调用被劫持目标时 将不会执行被劫持的函数 而去执行自 己处理的函数
that.getTableHeight(){
..............
}
}
在生命周期函数中调用
因getTableHeight在组件ref名为crud内部对象源用this.$refs.crud传入。getTableHeight为劫持目标函数。this.hijacker为劫持后需要执行的函数
mounted() {
this.hijackFn(this.$refs.crud, 'getTableHeight', this.hijacker);
}
如果你希望劫持目标而且还需要执行被劫持的目标函数可以这样写
hijackFn(obj, method, fun) {
let orig = obj[method];
obj[method] = fun(orig);
},
hijacker(orig) {
let that = this
return function () {
that.getTableHeight()
orig() //劫持绑定时 未被改变this指向的函数已经传入,直接执行即可
}
},
本质上就是覆盖原函数 并在覆盖之前记录原函数,完成劫持操作的。在一些执行通用函数时在不改变原有函数的业务中 可能会有帮助。