当前位置:首页 > 技术分析 > 正文内容

vue渲染函数render的使用例子(优化作用)

ruisui8818小时前技术分析2

一、数据结构和渲染效果图

1.假设的数据结构如下:

2 页面效果如下


二、实现的方式

1、template去递归

首先编写子组件,loop-page.vue文件

// loop-page.vue
<template>
  <!-- 注意此处的list-aaa 待会儿会说到 -->
  <div class="list-aaa">
    <div v-for="(item, index) in list" :key="index" class="list-item">
      <div class="item-name">
        <span>{{ item.name }}</span>
      </div>
      <template v-if="item.children">
        <loop-page :list="item.children" class="children-item" />
      </template>
    </div>
  </div>
</template>
<script>
export default {
  name: "loopPage",
  props: {
    list: Array,
    default: () => {
      return []
    }
  }
}
</script>
<style scoped></style>

再新建index.vue父组件,编写代码如下

编译程序,得到的界面如下



不难可以看出,class="list-aaa"出现了三次。

递归组件在每层次递归都会把最外层的div添加进去,虽然看着多了一层没什么问题,但是随着一些有使用到slot插槽的组件时,在父子组件或同级组件会有数据间的关联。

由于多了一层div,原本渲染后的元素层级由父子或同级层级变成了爷孙层级,从而导致一些意想不到的隐藏BUG。

所以这里不能这么写,我找到一种办法就是用到了render函数。你们还有什么办法,也可以在评论区回复,一起学习哈~~~

2、render函数递归

1.改写子组件loop-page.vue文件,如下

//loop-page.vue
// 用render函数,需要去掉template标签
<script>
export default {
  name: "loopPage",
  props: {
    list: Array,
    default: () => {
      return []
    }
  },
  methods: {
    loopH(h, list) {
      return h(
        'div',
        {
          attrs: {
            class: 'list-item'
          },
          props: {
            list: list
          }
        },
        [
          h('div', {
            attrs: {
              class: 'item-name'
            }
          }, [
            h('span', list.name)
          ]),
          (() => {
              if (!list.children || !list.children.length) return []
              return list.children.map((item) => {
                return this.loopH(h, item)
            })
          })()
        ]
      )
    }
  },
  mounted() {
  },
  render(h) {
    return this.loopH(h, this.list[0])
  }
}
</script>
<style scoped>

</style>

这样生成的界面,就没有那个重复的嵌套关系了,一目了然,见下图


感觉还是看情况去使用,毕竟个人感觉template的方式还是比较通俗易懂,容易编写的。

喜欢这篇文章的可以点赞关注哈~

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/4232.html

标签: vue递归
分享给朋友:

“vue渲染函数render的使用例子(优化作用)” 的相关文章

基于gitlab的PR操作教程

基于gitlab的PR操作教程注:该教程主要基于git命令行操作,其他图形化工具也可完成以下所有操作步骤,顺手即可。推荐工具:Source Tree ,TortoiseGit参考:gitflow一 . 基于分支的PR操作1. 本地切换到master分支1. 拉取最新代码2. 基于master创建ho...

jvm疯狂吃内存,到底是谁的锅?

jvm应该是每一个java程序员都需要掌握的内容,但是在没有遇到问题之前,很多都是基于理论的,唯有实战才能增加个人的知识储备。本文是从一个角度来分析是谁在狂吃内存,希望对你有所帮助。本文是易观技术人员注意到一台开发机上各个微服务进程占用内存很高,随即便展开了调查......ps:本文来源于:http...

js中数组filter方法的使用和实现

定义filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。语法var newArray = arr.filter(callback(element[, index[, selfArr]])[, thisArg])参数callback循环数组每个元素时调用的回调函数。回调函...

微信正开发“应用号”取代手机应用

长江商报消息用户只需关注公众号,不必下载APP就可获得相同体验本报讯(记者 陈妮希)昨日,2016微信公开课PRO版在广州举行,腾讯公司高级执行副总裁、微信事业群总裁张小龙首次公开演讲,并透露微信正在开发“应用号”,将应用和订阅号相结合。现场,微信团队还首次发布了腾讯生物识别标准“TENCENTSO...

电工也体会到英文也博大精深了意思一样字母不相同而且还经常遇到

在学习电工电路中,往往和电路图有密切关系,之前老师常说要学会看图,认识电气符号。我觉得这还是不够的。因为在一些电路中存在很多英文字母,它们并不代表电器元件。而是一种电路名称或命名。以下是我在工作中看到过字母常见的意思一样。 如:UVW=RST=ABC=T1T2T3=L1L2L3三相黄绿红 .交流火线...

能者多劳!让NVMe固态硬盘做系统盘的同时,加速SATA数据盘

不知不觉当中,固态硬盘已经取代机械硬盘成为主流。越来越多的玩家已经淘汰机械盘,使用NVMe+SATA的固态硬盘高低搭配。既然是高低搭配,就一定会有性能差距,是否能从NVMe固态硬盘中划分出一小部分空间来给SATA固态硬盘加速,实现更好地整机性能呢?答案是肯定的,而且这一功能早已隐藏在英特尔Z170、...