vue.js - 将标记注入(inject)现有的 Vue 组件

标签 vue.js vuejs2

我想将标记注入(inject)现有组件。

这是一个简单的例子:

<!-- Arbitrary component X -->
<template>
  <div>
    <!-- I want a headline here -->
    foo!
  </div>
</template>

我知道我可以通过插入 <slot/> 来实现这一点然后使用 <X><h1>Hello world!</h1></X> .但是,我想动态地编辑原始组件。

所以这是我使用高阶组件的想法:

import X from '~/components/X';
import injectHeadline from '~/hoc/injectHeadline.js';

export default {
  components: {
    X: injectHeadline(X, 'Hello world!')
  }
}

<!-- injectHeadline.js -->
export default (component, headline) => Vue.component({
    render(createElement) {
        let result = createElement(component);

        <!-- (*) somehow insert <h1>{{ headline }}</h1> here. How? -->

        return result;
    }
})

但是,我没有运气在 (*) 中操纵渲染结果。 .我试着摆弄 result.context.$children ,但这无处可去。 任何的想法?

最佳答案

可以使用与 React 中相同的模板扩展方法,在 VNode 呈现给 DOM 之前修改 VNode 的层次结构,如 this answer 中所述。 :

export default (WrappedComponent, headline) => Vue.component({
  extends: WrappedComponent,
  render(h) {
    const elements = this.$options.extends.render.call(this, h);
    elements.children.unshift(<h1>{headline}</h1>));
    return elements;
  }
});

关于vue.js - 将标记注入(inject)现有的 Vue 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56697228/

相关文章:

vuejs2 - 使用 "v-on:"指令将事件监听器添加到 <router-link> 组件 - VueJS

javascript - 使用 Vue 创建静态左侧导航栏组件

css - Vue 和 Webpack 树抖动、副作用和 CSS : CSS of unused components being loaded

laravel - [Vue警告] : Error in v-on handler: "TypeError: Cannot read property ' fire' of undefined"

vue.js - 如何在 datepicker vuetify 上添加描述?

javascript - 如何在 TypeScript Vue 组件中访问全局 mixin 的方法?

laravel - Vuex 无法使用 npm 安装并给出错误

javascript - 使用 `Vue.extend` 和 vue-i18n 测试组件有什么解决方法吗?

php - Laravel 将访问器传递给 vue

vue.js - vue 和 vue-material : how to start?