【问题标题】:Vue JSX bind to class nameVue JSX 绑定到类名
【发布时间】:2018-05-31 07:23:48
【问题描述】:

我正在使用 Vue + JSX 构建一个简单的 TodoMVC 应用程序,但文档似乎严重缺乏。因此,我正在写下我需要作为 CR 的一部分解决的要点,以用于适当的项目。到目前为止,我读过的唯一文档是 guide,它根本没有涵盖太多 JSX。我还不太了解框架的工作原理,但出于性能/网络原因,我肯定更喜欢使用render 方法而不是字符串模板。

问题

在 Vue + JSX 中创建类名绑定的正确方法是什么?在我的TodoItem 组件中,创建classclassName 属性会使Babel 抛出一个编译错误,抱怨API 已被弃用(并建议我添加几个看似无关的依赖项)。另外,在数据对象中包含class 属性似乎没有任何改变。

次要问题

缺乏文档,加上wording on the guide 给人的印象是 JSX 不是编写 Vue 组件的“正确”方式。是这样吗?鉴于我不想将编译器与我的应用程序一起提供,那么惯用的方法是什么?

链接

【问题讨论】:

  • v-bind:class 有什么问题?
  • Babel JSX 也会抛出:SyntaxError: undefined: Namespaced tags/attributes are not supported。 JSX 不是 XML。对于xlink:href 等属性,请改用xlinkHref

标签: vue.js jsx


【解决方案1】:

出于性能/网络原因,我肯定更喜欢使用渲染方法而不是字符串模板。

如果您正在编写 *.vue 文件并将它们与 vue-loader (Webpack) 捆绑在一起,那么 HTML 模板无论如何都会被编译为 JavaScript 渲染函数,因此从这个意义上说,实际上并没有任何类型的性能问题。

另一方面,如果您正在使用这样的字符串模板编写 Vue 组件:

new Vue({
  template: '<div>Hello</div>'
})

那么您需要在运行时使用 Vue 模板编译器将字符串转换为渲染函数。

如果人们需要做一些单独使用 HTML 模板很难/不可能做的特定事情,通常会选择手动编写渲染函数。

您可能已经阅读过文档,但以防万一,相关部分如下:

在 Vue + JSX 中创建类名绑定的正确方法是什么?

您只需像绑定任何其他属性一样绑定到class 属性:

<div class={this.klass}>
data() {
  return {
    klass: 'foo'
  }
}

缺乏文档,加上指南中的措辞给人的印象是 JSX 不是编写 Vue 组件的“正确”方式。是这样吗?鉴于我不想将编译器与我的应用程序一起提供,那么惯用的方法是什么?

绝对支持 JSX,但这不是推荐的方法。推荐的方法是编写*.vue 文件并使用vue-loader 加载它们(如果使用Webpack)。

Vue 有两个版本,一个有模板编译器,一个没有模板编译器。包含编译器的那个仅用于开发,不应用于生产构建(除非您需要字符串模板在运行时呈现函数编译,这是不太可能的)。请参阅Explanation of Build Files 了解更多信息。

通常您编写 HTML 字符串模板,然后在构建时编译它们以呈现函数(vue-loader

【讨论】:

  • > 您只需像绑定任何其他属性一样绑定到 class 属性:就像我提到的(参见链接的 Codepan),> 创建类或类名属性会使 Babel 抛出编译错误并抱怨API 已弃用这可能是他们自己设置的工件吗?或者更确切地说,任何 Webpack 设置的工件现在都是“接受”的?
  • 有趣,看起来它适用于TodoListbut not TodoItem。我想问题一定是别的什么,这增加了我的怀疑,我可能在做一些愚蠢的事情......
  • 对于原生 DOM 元素(例如 &lt;li&gt;)需要使用 nativeOnClick,对于 Vue 组件需要使用 onClickFixed
  • 这证实了我的猜想,我确实在做一些傻事。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2017-02-10
  • 1970-01-01
  • 2017-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-17
  • 2019-12-19
相关资源
最近更新 更多