Vue组件内的方法如何添加装饰器Decorator

发布于 2022-09-05 07:44:53 字数 1039 浏览 18 评论 0

想要给Vue组件内的某方法增加Decorator,发现并不能很好支持。

<template>
  <div id="app">
    <img src="./assets/logo.png" @click="foo">
    <hello></hello>
  </div>
</template>

<script>
import Hello from './components/Hello'
import Vue from 'vue'
import Component from 'vue-class-component'

const log = (target, name, descriptor) => {
  const method = descriptor.value
  descriptor.value = (...args) => {
    console.log(target, descriptor)
    method.apply(target, args)
  }
  return descriptor
}

@Component({
  components: {
    Hello
  }
})
class App extends Vue {

  str = 'Hello'

  @log
  foo () {
    console.log(this.str)
  }
}

console.info('App', App)
export default App
</script>

<style>
#app {
  font-family: 'Avenir', Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>

foo添加装饰器log之后,this不能正确的指向Component本身。。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

流绪微梦 2022-09-12 07:44:53

问题在于log方法里面。

//descriptor.value = (...args) => {
//    console.log(target, descriptor)
//    method.apply(target, args)
//  }
//修改如下:

descriptor.value = function(...args){ //这里不要用箭头函数, 会在执行环境中丢失正确的this指向
    console.log(target, descriptor)
    method.apply(this, args) //因为descriptor.value的运行环境是在Class App中,所以这里的this会指向App。如果写成箭头那this就是log了
  }

正常的Class在加装饰器的时候使用method.apply(target, args)是没有问题的。但是vue在注册组件的时候会进行初始化,this在这个时候被改变了(class内部的的this变了,此时 this !== target了

单身狗的梦 2022-09-12 07:44:53

稍微改造一下就好了,针对vue实例做一下适配

const log = (target, name, descriptor) => {
  const method = descriptor.value
  descriptor.value = (...args) => {
    // 判断一下应该使用的this指向
    const _this = this.isVue ? this : target;
     
    console.log(target, descriptor)
    method.apply(_this, args)
  }
  return descriptor
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文