首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Vue指令访问组件名称

从Vue指令访问组件名称
EN

Stack Overflow用户
提问于 2018-08-22 15:55:06
回答 2查看 3.1K关注 0票数 2

我想要创建一个自定义的Vue指令,允许我在我的页面上选择我想要补充的组件。换句话说,这就是我想要存档的

  1. 我在服务器上呈现我的Vue应用程序(ssr)
  2. 我向一些组件附加了一个指令,如: 我将被水化
  3. 我将我的代码发送给客户机,只有那些具有v-hydrate属性的组件才会在客户机上被水化(作为root元素)。

我想以这样的方式大致做到这一点:

我将创建一个标记和记住组件的指令:

代码语言:javascript
复制
import Vue from "vue";

Vue.directive("hydrate", {
  inserted: function(el, binding, vnode) {
    el.setAttribute("data-hydration-component", vnode.component.name);
  }
});

我的想法是,在我的inserted方法中,为服务器呈现的元素编写一个数据属性,我可以在客户机中读出该元素,然后用它补充我的组件。

现在我有两个问题:

  1. 这是一个可行的方法吗?
  2. 如何在el.setAttribute中获得组件名称?vnode.component.name只是虚拟代码,并不以这种方式存在。

PS:如果你想知道为什么我只想补充我的网站的部分:这是广告。他们搅乱了破坏Vue的DOM。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-23 11:41:50

我能搞清楚:

代码语言:javascript
复制
import Vue from "vue";

Vue.directive("hydrate", {
  inserted: function(el, binding, vnode) {
    console.log(vnode.context.$options.name); // the component's name
  }
});
票数 3
EN

Stack Overflow用户

发布于 2019-03-19 09:23:17

我无法使用先前发布的解决方案获取我的单个文件组件的名称,所以我查看了vue devtools的源代码,它总是能够找到名称。他们是这样做的:

代码语言:javascript
复制
export function getComponentName (options) {
  const name = options.name || options._componentTag
  if (name) {
    return name
  }
  const file = options.__file // injected by vue-loader
  if (file) {
    return classify(basename(file, '.vue'))
  }
}

其中options === $vm.$options

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51970741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档