vue使用render来写组件


vue使用render来写组件

博客园同步更新
ps:内容简单勿吐槽。这里的例子是跟着官网的渲染函数。

渲染函数介绍

Vue 推荐在绝大多数情况下使用模板来创建你的HTML。然而在一些场景中,你真的需要 JavaScript 的完全编程的能力。这时你可以用渲染函数,它比模板更接近编译器。

实例

让我们深入一个简单的例子,这个例子里render函数很实用。假设我们要生成一些带锚点的标题。
首先来定义一个简单的组件:

<template>
  <div>
     <h1 v-if="level === 1">
    <slot></slot>
  </h1>
  <h2 v-else-if="level === 2">
    <slot></slot>
  </h2>
  <h3 v-else-if="level === 3">
    <slot></slot>
  </h3>
  <h4 v-else-if="level === 4">
    <slot></slot>
  </h4>
   <h5 v-else-if="level === 5">
    <slot></slot>
  </h5>
  <h6 v-else>
     <slot></slot>
  </h6>
  </div>
</template>
<script>
export default {
  props:{
    level:{
      type:Number,
      default:1
    }
  },
  data(){
    return {

    }
  }
}
</script>

组件完成,来引用组件:

<template>
  <div>
    <heading :level='level'>这里是插槽内容 现在的leave={{2}}</heading>
  </div>
</template>
<script>

import heading from './heading.vue'
export default {
  components:{
    heading:heading
  },
  data() {
    return {
      level:2
    }
  },

}
</script>


效果如图,如果打开控制台也是可以看见标签元素是h2。
这样写显得很麻烦,如果我们来试试render函数写一波新组件

<script>
export default {
  name: 'heading',
  props: {
    level: {
      type: Number,
      default: 1,
    },
  },
  data() {
    return {}
  },
  computed: {},
  methods: {},
  render(createElement) {
    let arr = [1,2,3,4,5]
    return createElement('div', {
      class: {
        // 这里可以添加class
      },
      attrs: {
        // 添加属性的地方
      },
      domProps: {
        // 内容
      },
      on: {
          // 添加事件的地方
      },
    },
    [
    arr.includes(this.level)?createElement('h'+this.level, this.$slots.default):createElement('h6', this.$slots.default)

    ])
  },
}
</script>

这里保持和原来使用模板写的组件一样最外层一层div里面才是包这h标签,当非12345的时候,使用h6标签。
所以这里可以简单看出createElement(Element,options,childrens);Element是要渲染的元素标签,options这里是该标签的一些配置也可以添加事件比如class/attrs/domProps属性,childres是一个数组里面放着子内容也可以由多个createElement(Element,options,childrens)这样的内容,具体的话看具体情况。

结语

关于渲染函数还是要多使用,孰能生巧,肯定没错,写多了就理解的快。第一次使用markdown写文章 还是很爽的,只是学到一些简单的语法。之后应该会分享一些ts和vue3的实践,因为最近写的最多的就这个。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM