在 Vue 中保留 <span> 之间的空格

Tob*_*ann 8 html vue.js vuejs3

在我的 Vue 3 应用程序中,我想突出显示文本中的单词,例如以下 HTML 中的单词:

span {
  background-color: yellow;
}
Run Code Online (Sandbox Code Playgroud)
<span>foo</span> 
<span>bar</span> 
baz 
qux
Run Code Online (Sandbox Code Playgroud)

然而,Vue 删除了标签之间的空格,因此 s 之间的间隙<span>消失了:

span {
    background-color: yellow;
}
Run Code Online (Sandbox Code Playgroud)
<span>foo</span><span>bar</span> baz qux
Run Code Online (Sandbox Code Playgroud)

如何保留<span>s 之间的空白?我无法使用&nbsp;,因为空格应该被打破,并且其他空白实体都没有与通常空间相同的大小。

san*_*zti 13

IMO 这完全是一个错误,因为:

  1. 原生 html 的行为方式不同。
  2. 文档中的行为应默认保留空格。
  3. vue 2没有这个问题。

有一个 vuecompilerOptions选项whitespace,根据文档,它应该默认为'preserve',但事实并非如此。

要在 webpack 中设置它,'preserve'请使用以下配置:

{
    test: /\.vue$/,
    loader: 'vue-loader',
    options: {
        compilerOptions: {
            // preserve is supposed to be the default
            // see: https://github.com/vuejs/vue/tree/dev/packages/vue-template-compiler#options
            // but as of 2022-01-13 (vue 3.2.26)
            whitespace: 'preserve',
        },
    },
},
Run Code Online (Sandbox Code Playgroud)

或者,如果您要动态渲染组件(使用 dom 模板),请使用以下命令:

const app = Vue.createApp({...});
app.config.compilerOptions.whitespace = 'preserve';
app.mount('#app');
Run Code Online (Sandbox Code Playgroud)

文档(在撰写本文时):

whitespace

  • 类型:字符串
  • 有效值:“保留”| '凝结'
  • 默认值:“保留”

默认值'preserve'按如下方式处理空格:

  • 元素标签之间的纯空白文本节点被压缩为单个空格。
  • 所有其他空白均按原样保留。

如果设置为'condense'

  • 如果元素标签之间的纯空白文本节点包含新行,则该节点将被删除。否则,就会被压缩成一个空间。
  • 非纯空白文本节点内的连续空白将压缩为单个空格。

使用压缩模式将导致编译后的代码大小更小并且性能略有提高。然而,在某些情况下,与纯 HTML 相比,它会产生细微的视觉布局差异。

  • 我可能参考了 vue 2 的文档,我找不到 vue 3 的编译器选项文档,但在这次提交中,他们向 vue 3 添加了空白功能,并默认为“condense”https://github.com/vuejs /vue-next/pull/1600/commits/1c42f3a37db3e1da19653d8294c30f251ea16bc8 (3认同)

Tob*_*ann 7

好吧,显然,我不是第一个偶然发现这种行为的人,我将其命名为错误:

https://github.com/vuejs/vue-next/pull/1600

默认情况下,Vue 会出于压缩目的删除元素之间的空格 - 浏览器除外,浏览器会将此类空格减少为单个空格。在 Vue 2 中,可以更改配置以保留空格。在 Vue 3 中这是不可能的(目前)。

然而,有一些解决方法,正如评论 [1] 中提到的,只有包含换行符的空格才会被删除。因此,通过删除上面示例源代码中的换行符,该代码片段的行为符合预期:

<span>foo</span> <span>bar</span> 
baz
qux
Run Code Online (Sandbox Code Playgroud)

[1] https://github.com/vuejs/vue-next/pull/1600#issuecomment-747162894