Vue 组件你不知道的一个细节

2023-05-06 20:01:13 浏览数 (1)

你能确保解析出正确的DOM结构吗?

在h5的table中,什么元素可以出现在其内部是严格定义的,比如我们想要<table>中有<tbody>,<tbody>中有<tr>....,而不是<tbody>中有个其他不该属于的标签,比如自己定义一个组件,里面模板还是<tr>....</tr>,这样会失败!

我们来看看最先会遇到什么问题,代码如下

代码语言:javascript复制
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>组件细节is使用
        </title>
        <script src="https://unpkg.com/vue"></script>
    </head>
    <body>
        <div id="app">
            <table>
                <tbody>
                    <row></row>
                </tbody>
            </table>
        </div>
        <script> 
            Vue.component('row', {
                template: '<tr><td> this is a row</td></tr>'
            })
            var vm = new Vue({
                el: '#app'
            })
        </script>
    </body>
</html>

运行结果

这个可不是我们想要的,尽管能够显示结果,但是我的row组件明明写在<tbody>里面,为什么出现在了外面?

记得vue中还有动态组件,类似于<component :is="xxxx"></component>要不我们来试试?

代码语言:javascript复制
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>组件细节is使用
        </title>
        <script src="https://unpkg.com/vue"></script>
    </head>
    <body>
        <div id="app">
            <table>
                <tbody>
                    <component :is="comName"></component>
                    <!-- <tr :is="comName"></tr> -->
                </tbody>
            </table>
        </div>
        <script> 
            Vue.component('row', {
                template: '<tr><td> this is a row</td></tr>'
            })
            var vm = new Vue({
                el: '#app',
                data: {
                    comName: 'row'
                }
            })
        </script>
    </body>
</html>

这么写和刚刚是一模一样的结果,dom结构中<tr>还是在<table>之外,那到底有没有解决办法呢?当然是有的

有些 HTML 元素,诸如 <ul><ol><table> 和 <select>,对于哪些元素可以出现在其内部是有严格限制的。<table>之内,那就不能随便写一个标签,它不认的!!而有些元素,诸如 <li><tr> 和 <option>,只能出现在其它某些特定的元素内部。我们上面写的<row>和<component>都被作为无效的内容提升到<table>外部,并导致最终渲染结果出错

正确的应该怎么写的,代码如下:

代码语言:javascript复制
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>组件细节is使用
        </title>
        <script src="https://unpkg.com/vue"></script>
    </head>
    <body>
        <div id="app">
            <table>
                <tbody>
                    <tr is="row"></tr><!-- 这里is前面没有冒号 -->
                </tbody>
            </table>
        </div>
        <script> 
            Vue.component('row', {
                template: '<tr><td> this is a row</td></tr>'
            })
            var vm = new Vue({
                el: '#app'
            })
        </script>
    </body>
</html>

运行结果

比如ul、ol中只能放li,如果要用组件,就要和上面一样的写法<li is="你的组件名"></li> select中只能放option,如果要用组件,则<option is="你的组件名"></option> 这样才确保所有浏览器解析出来正确的DOM结构

0 人点赞