Vue 模板中的地址标签会破坏 lint

Posted

技术标签:

【中文标题】Vue 模板中的地址标签会破坏 lint【英文标题】:address tag in Vue template breaks lint 【发布时间】:2020-09-02 09:59:43 【问题描述】:

我有一个像这样的 Vue JS 组件

<template>
    <footer class="main-footer">
        <p> <address>Some address</address> </p>
    </footer>
</template>

当我运行vue-cli-service lint 时,它会将开头的&lt;p&gt; 更改为&lt;p /&gt; 并发出以下错误

error: Parsing error: x-invalid-end-tag (vue/no-parsing-error) at src/components/Footer.vue:3:46:
  1 | <template>
  2 |     <footer class="main-footer">
> 3 |         <p /><address>Some address</address> </p>
    |                                              ^

事实上,在我的 Webstorm 中,结束的&lt;/p&gt; 标记为红色的Closing tag matches nothing

我去掉了address 标签,它运行良好。有什么原因我不能使用地址标签吗?

这是我的.eslintrc.js

module.exports = 
    root: true,
    env: 
        node: true
    ,
    extends: [
        'plugin:vue/recommended',
        '@vue/standard'
    ],
    rules: 
        'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
        'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
        indent: ['error', 4],
        'space-before-function-paren': ['warn', 'never'],
        'vue/require-default-prop': 'off',
        'vue/no-v-html': 'off',
        'vue/html-indent': ['error', 4]
    ,
    parserOptions: 
        parser: 'babel-eslint'
    ,
    overrides: [
        
            files: [
                '**/__tests__/*.j,ts?(x)',
                '**/tests/unit/**/*.spec.j,ts?(x)'
            ],
            env: 
                jest: true
            
        
    ]

【问题讨论】:

那是因为&lt;p /&gt; 本身表示单个标签。配对标签写为&lt;p&gt;something&lt;/p&gt;。现在的问题是 - 为什么它会更改 ```

`` 标签?

尝试使用 --fix 关键字自动修复此 lint 错误可能会导致此问题 @DeepakTerse 即使写成&lt;p&gt;...&lt;/p&gt; Webstorm 说closing tag matches nothing。似乎是地址标签导致了问题 这可能是因为您使用的是&lt;address&gt;,它是&lt;p&gt; 标签内的块级元素,它本身就是一个块级元素 【参考方案1】:

来自 MDN:“段落是块级元素,如果在关闭 &lt;/p&gt; 标记之前解析另一个块级元素,则会自动关闭段落”。

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/p

【讨论】:

【参考方案2】:

tl;博士:

错误是您放置了一个没有起始&lt;p&gt; 标记的&lt;/p&gt; 标记。那是因为&lt;address&gt;标签跟在&lt;p&gt;标签后面,所以你认为的起始标签会被解析器自动关闭,按照official HTML spec进行。


更长的(初始)答案:

这是官方规范 (HTML standard) 指定的预期行为。分别:

如果p 元素后面紧跟addressarticleasideblockquotedetailsdiv、@987654335,则可以省略p 元素的结束标记@,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h6,@987654346,@,@987654346 hgroup, hr, main, menu, nav, ol, p, pre, section, table, 或@9876 元素父元素中没有更多内容,并且父元素是不是 aaudiodelinsmapnoscriptvideo 元素的 HTML 元素,或者一个自主的自定义元素。

当解析器遇到&lt;address&gt; 元素时,这会导致您的&lt;p&gt; 元素自动关闭。

由于您显然不想要这种行为,因此您应该在此处使用 &lt;div&gt; 而不是 &lt;p&gt; 元素,尽管考虑到您问题中的标记,也许您应该完全放弃包装器(即:@987654370 @)。

【讨论】:

有道理。那么如果p 后面没有紧跟地址怎么办?比如&lt;p&gt;something else&lt;address&gt;...? 在这种情况下,'something else' 被认为是&lt;p&gt; 的内容,从技术上讲,它后面跟着一个&lt;address&gt; 标记。当浏览器在其“内容”中遇到&lt;address&gt; 时,应关闭&lt;p&gt; 标签。基本上您的示例与&lt;p&gt;something else&lt;/p&gt;&lt;address&gt;... 相同,规范说在这种情况下您不必使用&lt;/p&gt; 标签,它会自动添加。规范中经常遗漏的部分是:“当更具体的元素更合适时,不应使用p 元素。”

以上是关于Vue 模板中的地址标签会破坏 lint的主要内容,如果未能解决你的问题,请参考以下文章

Django 无空格模板标签会破坏 Bootstrap 呈现的内容

如何使用VUE给模板标签中的属性赋值

如何在模板标签之外访问 Vue 中的组件 HTML 输出?

在 Laravel 5 中,如何在启用 vue 的模板上转储变量?

为啥我在 Vue 中的移动标签效果不起作用?

Vue 3 警告“带有副作用的标签”正在破坏生产