v-for嵌套v-for问题

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script type="text/javascript" src="../vue.js"></script>
</head>
<body>
    <table class="demo">
        <tr is="my-tr" v-for="trItem in trItems">
            <td is="my-td" v-for="tdItem in trItem.tdItems">
                {{ tdItem.number }}
            </td>
        </tr>
    </table>

    <script>
        var aTr = {
                template: '<tr></tr>'
            },
            aTd = {
                template: '<td></td>'
            };

        var demo = new Vue({
            el: '.demo',
            data: {
                trItems: [
                    { 
                        tdItems: [{ number: 1 },{ number: 2 },{ number: 3 }] 
                    },
                    { 
                        tdItems: [{ number: 4 },{ number: 5 },{ number: 6 }] 
                    },
                    { 
                        tdItems: [{ number: 7 },{ number: 8 },{ number: 9 }] 
                    }
                ]
            },
            components: {
                'my-tr': aTr,
                'my-td': aTd
            }
        });
    </script>
</body>
</html>

可是td没出来

clipboard.png

诸位前辈帮看看是哪里错了

阅读 6.3k
1 个回答

首先,两个组件中要加 slot 插槽才能实现内容分发!
其次,tr 里加 slot 的时候,由于 HTML 对 tr 内可插入元素的限制,里面的 slot 会被移走。
因此,首先把 aTd 的模板改为 <td><slot></slot></td>,然后再把 <tr is="my-tr" v-for="trItem in trItems"> 中的 is="my-tr" 去掉就可以了。
以上是 Vue.js 1.0 的情况。

由于 Vue.js 2.0 中使用 Virtual DOM 通过 render 函数处理模板,因此不受 HTML 对 tr 内可插入元素的限制影响,只要在两个模板都加上 slot 就可以了。

var aTr = {
    template: '<tr><slot></slot></tr>'
},
aTd = {
    template: '<td><slot></slot></td>'
};
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题