首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >render函数

render函数

作者头像
切图仔
发布2022-09-08 16:44:17
发布2022-09-08 16:44:17
52900
代码可运行
举报
文章被收录于专栏:生如夏花绚烂生如夏花绚烂
运行总次数:0
代码可运行

import Vue from 'vue'

代码语言:javascript
代码运行次数:0
运行
复制
const component = {
  name: 'comp',
  template: `
    <div :style="style">
      <slot></slot>
    </div>
  `,
  data () {
    return {
      style: {
        width: '200px',
        height: '200px',
        border: '1px solid #aaa'
      },
      value: 'component value'
    }
  }
}

new Vue({
  components: {
    CompOne: component
  },
  el: '#root',
  data () {
    return {
      value: '123'
    }
  },

  methods: {
    handleClick () {
      console.log('clicked')
    }
  },
  template: `
    <comp-one ref="comp">
      <span ref="span">{{value}}</span>
    </comp-one>
  `

})

如上一个简单的vue组件引用示例,通过tempalte渲染成html页面

但vue是怎样将template渲染成html的呢 这里就用到了render函数 在使用template的时候,最终会被编译成render方法

我们可以结合上面template自己实现一下render

代码语言:javascript
代码运行次数:0
运行
复制
 template: `
    <comp-one ref="comp">
      <span ref="span">{{value}}</span>
    </comp-one>
        `,
        render(){
            return  this.$createElement
        }
}
)

$createElement:vue提供的创建节点的函数,在每个实例上都有这个函数,同时在使用render方法的时候createElement也会作为参数被传入进来 createElement(NodeName,attrs) 第一个参数 string 为节点名称 第二个参数 object 为节点给属性如id、ref 第三个参数为节点内容 arrsy,可以是节点字符串等

代码语言:javascript
代码运行次数:0
运行
复制
render(createElement){
    return createElement(
        'comp-one',
        {
            ref:'comp'
        },
        [
            createElement(
                'span',
                {
                    ref:'span'
                },
                this.value
                )]
  )
}

上面的render等同于template

component组件的render写法

代码语言:javascript
代码运行次数:0
运行
复制
...
render(createElement){
    return createElement(
        'div',
        {
            style:this.style
        },
        this.$slots.default 
        //默认插槽相当于<slot >
      //具名插槽写 this.$slots.name
        )
}
...

createElement创建出来的并不是真正的html节点,而是虚拟dom(vNode)

createElement常用属性

  1. props
代码语言:javascript
代码运行次数:0
运行
复制
//vue
render(createElement){
    return createElement(
        'comp-one',
        {
            ref:'comp',
                props:{
                    prop1:this.value
                }
        },
        [
            createElement(
                'span',
                {
                    ref:'span'
                },
                this.value
                )]
  )
}
//component接收
cont component = {
    props:['props1'],
        name:'comp'
        ...

}

2.绑定事件

代码语言:javascript
代码运行次数:0
运行
复制
//vue
methods:{
    handleClick(){
        
        }
},
render(createElement){
    return createElement(
        'comp-one',
        {
            ref:'comp',
                props:{
                    prop1:this.value
                },
                    //事件
               on:{
                  click:this.handleClick
               },
                    //直接绑定到组件根节点原生dom
                nativeOn:{
                        click:this.handleClick
                }
        }, 
    
        [
            createElement(
                'span',
                {
                    ref:'span'
                },
                this.value
                )]
  )
}
//component触发事件
cont component = {
    props:['props1'],
        name:'comp'
        ...
        render(createElement){
    return createElement(
        'div',
        {
            style:this.style,
                on:{
                    click:()=>{this.$emit('click')}
                }
        },
        this.$slots.default 
        //默认插槽相当于<slot >
      //具名插槽写 this.$slots.name
        )
}

}

3.attrs

代码语言:javascript
代码运行次数:0
运行
复制
...
createElement('span',
{
    ...
        attrs:{
            id:"test"
        }
}
)
...

虽然render函数看上去比较麻烦,但我们要实现一些灵活的组件时候render函数将非常有用 如 vue 实现tab切换

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-08-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档