如何将类从父组件应用到 Vue.js 功能组件?

Posted

技术标签:

【中文标题】如何将类从父组件应用到 Vue.js 功能组件?【英文标题】:How to apply classes to Vue.js Functional Component from parent component? 【发布时间】:2018-10-25 13:45:37 【问题描述】:

假设我有一个功能组件:

<template functional>
    <div>Some functional component</div>
</template>

现在我在一些带有类的父级中渲染这个组件:

<parent>
    <some-child class="new-class"></some-child>
</parent>

结果 DOM 没有将 new-class 应用于功能子组件。现在据我了解,Vue-loaderFunctional 组件针对 render 函数 context 编译为 explained here。这意味着类不会被直接应用和智能合并。

问题是 - 在使用模板时如何使函数式组件与外部应用的类很好地配合?

注意:我知道通过渲染功能很容易做到这一点:

Vue.component("functional-comp", 
    functional: true,
    render(h, context) 
        return h("div", context.data, "Some functional component");
    
);

【问题讨论】:

【参考方案1】:

你必须使用 props 将属性传递给组件 https://vuejs.org/v2/guide/components.html#Passing-Data-to-Child-Components-with-Props

【讨论】:

【参考方案2】:

TL;DR;

使用data.staticClass获取类,使用data.attrs绑定其他属性

<template functional>
  <div class="my-class" :class="data.staticClass || ''" v-bind="data.attrs">
    //...
  </div>
</template>

解释:

v-bind 绑定所有其他的东西,你可能不需要它,但它会绑定像idstyle 这样的属性。问题是你不能将它用于class,因为这是一个保留的js对象所以vue使用staticClass,所以必须使用:class="data.staticClass"手动完成绑定。

如果父级未定义 staticClass 属性,这将失败,因此您应该使用 :class="data.staticClass || ''"

示例:

我无法将其显示为小提琴,因为只有 “在 *.vue 文件中定义为单文件组件的功能组件也接收正确的模板编译”

不过,我有一个有效的代码框:https://codesandbox.io/s/z64lm33vol

【讨论】:

从父级应用静态和动态类,例如&lt;some-child class="a" :class="b: true"/&gt; 在孩子中使用:class="[data.staticClass, data.class]" 如何在 childComponent 上绑定所有常规静态属性:(1) 使用 :class="data.staticClass" 用于类 (2) 使用 :style="data.staticStyle" 用于样式 (3) 使用 v-bind="data.attrs" 用于 id 等。【参考方案3】:

在功能组件示例中渲染函数,以补充@Daniel 的回答:

render(createElement,  data  
  return createElement(
    'div',
    
      class: 
        ...(data.staticClass && 
          [data.staticClass]: true,
        )
      ,
      attrs: 
        ...data.attrs,
      
    
  )

我们可以使用 ES6 计算属性名称来设置静态类。

【讨论】:

以上是关于如何将类从父组件应用到 Vue.js 功能组件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Vue JS 中将更新的值从父组件发送到子组件?

将数据从父模式传递到子模式 - Vue.js

Vue js:如何在两个组件中使用 mixin 功能?通过执行错误

如何将道具从父组件添加到子组件的子组件

在Vue.js中从父组件执行子方法

将一串数据从父组件传递给子组件。 Vue.js 2