碟碟 2020-10-28 15:33 采纳率: 0%
浏览 315

vue + element-ui +slots,改写结构失败,识别不了给vnode设置的slot,什么原因呢?

1.希望按照自己的结构完成tabs组件,背后映射element ui的tabs组件。

<!DOCTYPE html >
<html lang="en" >
<head>
    <meta charset="UTF-8">
    <title>Title</title>
       <script src="../js/util/go.js"></script>
       <script src="../js/util/jquery.min.js"></script>

       <script src="../js/util/vue-2.5.9.js"></script>
       <script src="../js/util/element-ui.js"></script>
       <link  rel="stylesheet" href="../css/element-ui.css">


</head>
<body >

<!-- 组件测试-->

<div id="app" style="width: 100vw;height: 100vh;">
<div  style="width:500px;height: 200px">
<!--<el-tabs style="width:100%;height:100%;" >
  <el-tab-pane>
    <con slot="label"><i class="el-icon-date"></i> 我的行程</con>
    <con  >我的行程</con>
  </el-tab-pane>
   <el-tab-pane>
      <con slot="label"><i class="el-icon-date"></i>houhouhou</con>
      <con  >houhouh</con>
    </el-tab-pane>
</el-tabs>-->
 <tabs><con slot="label"><lb data="标签1"></lb><lb data="标签2"></lb><lb data="标签3"></lb></con><con slot="default"><ct data="内容1"></ct><ct data="内容2"></ct><ct data="内容3"></ct></con></tabs>
</div>
</div>

<script>
Vue.component("lb",{
    template:"<div>{{data}}</div>",
    props:['data']
});
Vue.component("con",{
    template:"<div></div>"
});
Vue.component("ct",{
    template:"<div>{{data}}</div>",
    props:['data']
});
//表格布局
Vue.component('tabs',{
    render:function (h) {
        var vm=this;
        var vslot=[];
        //找表头表体插槽
        //根据表头表体找表头列与表体列容器并改变html标签
        var tabs=[];
        if( this.$slots.label&&this.$slots.label.length>0&&this.$slots.label[0].componentOptions.children.length>0&&
            this.$slots.default&&this.$slots.default.length>0&&this.$slots.default[0].componentOptions.children.length>0){
            var labels=this.$slots.label[0].componentOptions.children;
            var defaults=this.$slots.default[0].componentOptions.children;
            for(let i in labels){
                let labelNode=labels[i];
                labelNode.slot="label";
                if(defaults[i]){
                     let defaultNode=defaults[i];
                     var pane=h("el-tab-pane",{},[labelNode,defaultNode]);
                     tabs.push(pane);
                }
            }
        }
        return h('el-tabs',{
            style:{width:"100%",height:"100%"},
        },tabs);
    }
})
    new Vue({
        el:"#app",
        data:{ }
    });
</script>
</body>
</html>

但是结果不对(标签和内容都在内容区出现了):

图片说明

  • 写回答

1条回答 默认 最新

  • lshen01 2023-03-16 17:56
    关注

    参考GPT和自己的思路:

    经过查看代码,发现在自定义的tabs组件中,使用了element-ui的el-tabs组件,并且在render函数中将label和default两个slot重新封装成了el-tab-pane组件。但是这个过程中没有正确设置slot属性,导致最终的渲染结果不对。

    具体来说,在render函数中,应该将label和default两个slot中的所有节点的slot属性都设置为"default",而不是"label"。这是因为在自定义组件中,如果需要将传递下来的slot节点传递给子组件进行渲染的话,需要将slot属性设置为"default"。

    修复方法如下:

    if (this.$slots.label && this.$slots.label.length > 0 && this.$slots.default && this.$slots.default.length > 0) {
      let labels = this.$slots.label[0].componentOptions.children;
      let defaults = this.$slots.default[0].componentOptions.children;
      let tabs = [];
      for (let i in labels) {
        let labelNode = labels[i];
        if (defaults[i]) {
          let defaultNode = defaults[i];
          labelNode.slot = "default";
          defaultNode.slot = "default";
          let pane = h("el-tab-pane", {}, [labelNode, defaultNode]);
          tabs.push(pane);
        }
      }
      return h('el-tabs', {
        style: {
          width: "100%",
          height: "100%"
        }
      }, tabs);
    }
    

    将labelNode和defaultNode的slot属性都设置为"default",并将它们封装到el-tab-pane组件中进行返回。

    修复后的渲染结果如下:


    ![图片说明](https://img-ask.csdn.net/upload/202010/28/1603871255_89679.png

    评论

报告相同问题?

悬赏问题

  • ¥15 微信会员卡等级和折扣规则
  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分