SoFunction
Updated on 2025-04-04

How to understand the specific usage of Vue's render function

This article introduces how to understand the specific usage of Vue's render function. I will share it with you. The details are as follows:

The first parameter (must) - {String | Object | Function}

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>render</title>
  <script src="/vue/2.3.4/"></script>
</head>
<body>
  <div >
    <elem></elem>
  </div>
  <script>
    ('elem', {
      render: function(createElement) {
        return createElement('div');//A HTML tag character        /*return createElement({
           template: '<div></div>'//Component Options Object
         });*/
        /*var func = function() {
           return {template: '<div></div>'}
         };
         return createElement(func());//A function that returns HTML tag characters or component option objects*/
      }
    });
    new Vue({
      el: '#app'
    });
  &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;

The second parameter (optional) - {Object}

&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
  &lt;meta charset="UTF-8"&gt;
  &lt;title&gt;render&lt;/title&gt;
  &lt;script src="/vue/2.3.4/"&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;div &gt;
    &lt;elem&gt;&lt;/elem&gt;
  &lt;/div&gt;
  &lt;script&gt;
    ('elem', {
      render: function(createElement) {
        var self = this;
        return createElement('div', {//A data object containing template-related attributes          'class': {
            foo: true,
            bar: false
          },
          style: {
            color: 'red',
            fontSize: '14px'
          },
          attrs: {
            id: 'foo'
          },
          domProps: {
            innerHTML: 'baz'
          }
        });
      }
    });
    new Vue({
      el: '#app'
    });
  &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;

The third parameter (optional) - {String | Array}

&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
  &lt;meta charset="UTF-8"&gt;
  &lt;title&gt;render&lt;/title&gt;
  &lt;script src="/vue/2.3.4/"&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;div &gt;
    &lt;elem&gt;&lt;/elem&gt;
  &lt;/div&gt;
  &lt;script&gt;
    ('elem', {
      render: function(createElement) {
        var self = this;
        // return createElement('div', 'text');// Use strings to generate text nodes        return createElement('div', [//Array constructed from the createElement function          createElement('h1', 'Main mark'),//createElement function returns VNode object          createElement('h2', 'Submark')
        ]);
      }
    });
    new Vue({
      el: '#app'
    });
  &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;

Comparison of the two components writing methods

&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
  &lt;meta charset="UTF-8"&gt;
  &lt;title&gt;render&lt;/title&gt;
  &lt;script src="/vue/2.3.4/"&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;div &gt;
    &lt;ele&gt;&lt;/ele&gt;
  &lt;/div&gt;
  &lt;script&gt;
    /*('ele', {
       template: '<div :class="{show: show}" @click="handleClick">text</div>',
       data: function() {
         return {
           show: true
         }
       },
       methods: {
         handleClick: function() {
           ('clicked!');
         }
       }
     });*/
    ('ele', {
      render: function(createElement) {
        return createElement('div', {
          'class': {
            show: 
          },
          attrs: {
            id: 'elem'
          },
          on: {
            click: 
          }
        }, 'text');
      },
      data: function() {
        return {
          show: true
        }
      },
      methods: {
        handleClick: function() {
          ('clicked!');
        }
      }
    });
    new Vue({
      el: '#app'
    });
  &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;

This.$slots usage

&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
  &lt;meta charset="UTF-8"&gt;
  &lt;title&gt;render&lt;/title&gt;
  &lt;script src="/vue/2.3.4/"&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;div &gt;
    &lt;blog-post&gt;
      &lt;h1 slot="header"&gt;&lt;span&gt;About Me&lt;/span&gt;&lt;/h1&gt;
      &lt;p&gt;Here's some page content&lt;/p&gt;
      &lt;p slot="footer"&gt;Copyright 2016 Evan You&lt;/p&gt;
      &lt;p&gt;If I have some content down here&lt;/p&gt;
    &lt;/blog-post&gt;
  &lt;/div&gt;
  &lt;script&gt;
    ('blog-post', {
      render: function(createElement) {
        var header = this.$,//Return an array composed of VNode          body = this.$,
          footer = this.$;
        return createElement('div', [
          createElement('header', header),
          createElement('main', body),
          createElement('footer', footer)
        ])
      }
    });
    new Vue({
      el: '#app'
    });
  &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;

Passing data using props

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>render</title>
  <script src="/vue/2.3.4/"></script>
</head>
<body>
  <div >
    <ele :show="show"></ele>
    <ele :show="!show"></ele>
  </div>
  <script>
    ('ele', {
      render: function(createElement) {
        if () {
          return createElement('p', 'true');
        } else {
          return createElement('p', 'false');
        }
      },
      props: {
        show: {
          type: Boolean,
          default: false
        }
      }
    });
    new Vue({
      el: '#app',
      data: {
        show: false
      }
    });
  </script>
</body>
</html>

VNodes must be unique

&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
  &lt;meta charset="UTF-8"&gt;
  &lt;title&gt;render&lt;/title&gt;
  &lt;script src="/vue/2.3.4/"&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;!-- VNodeMust be unique --&gt;
  &lt;div &gt;
    &lt;ele&gt;&lt;/ele&gt;
  &lt;/div&gt;
  &lt;script&gt;
    var child = {
      render: function(createElement) {
        return createElement('p', 'text');
      }
    };
    /*('ele', {
       render: function(createElement) {
         var childNode = createElement(child);
         return createElement('div', [
           childNode, childNode//VNodes must be unique, rendering fails
         ]);
       }
     });*/
    ('ele', {
      render: function(createElement) {
        return createElement('div', 
          (null, {
            length: 2
          }).map(function() {
            return createElement(child)//Correct writing          })
        );
      }
    });
    new Vue({
      el: '#app'
    })
  &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;

v-model command

&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
  &lt;meta charset="UTF-8"&gt;
  &lt;title&gt;render&lt;/title&gt;
  &lt;script src="/vue/2.3.4/"&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;div &gt;
    &lt;el-input :name="name" @input="val=&gt;name=val"&gt;&lt;/el-input&gt;
    &lt;div&gt;Your name is{{name}}&lt;/div&gt;
  &lt;/div&gt;
  &lt;script&gt;
    ('el-input', {
      render: function(createElement) {
        var self = this;
        return createElement('input', {
          domProps: {
            value: 
          },
          on: {
            input: function(event) {
              self.$emit('input', );
            }
          }
        })
      },
      props: {
        name: String
      }
    });
    new Vue({
      el: '#app',
      data: {
        name: 'hdl'
      }
    });
  &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;

Scope slots

&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
  &lt;meta charset="UTF-8"&gt;
  &lt;title&gt;render&lt;/title&gt;
  &lt;script src="/vue/2.3.4/"&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;div &gt;
    &lt;ele&gt;
      &lt;template scope="props"&gt;
        &lt;span&gt;{{}}&lt;/span&gt;
      &lt;/template&gt;
    &lt;/ele&gt;
  &lt;/div&gt;
  &lt;script&gt;
    ('ele', {
      render: function(createElement) {
        // Equivalent to <div><slot :text="msg"></slot></div>        return createElement('div', [
          this.$({
            text: 
          })
        ]);
      },
      data: function() {
        return {
          msg: 'From a child component'
        }
      }
    });
    new Vue({
      el: '#app'
    });
  &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;

Pass scope slots into subcomponents

&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
  &lt;meta charset="UTF-8"&gt;
  &lt;title&gt;render&lt;/title&gt;
  &lt;script src="/vue/2.3.4/"&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;div &gt;
    &lt;ele&gt;&lt;/ele&gt;
  &lt;/div&gt;
  &lt;script&gt;
    ('ele', {
      render: function(createElement) {
        return createElement('div', [
          createElement('child', {
            scopedSlots: {
              default: function(props) {
                return [
                  createElement('span', 'From the parent component'),
                  createElement('span', )
                ];
              }
            }
          })
        ]);
      }
    });
    ('child', {
      render: function(createElement) {
        return createElement('b', this.$({text: 'I am a component'}));
      }
    });
    new Vue({
      el: '#app'
    });
  &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;

Functional components

&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
  &lt;meta charset="UTF-8"&gt;
  &lt;title&gt;render&lt;/title&gt;
  &lt;script src="/vue/2.3.4/"&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;div &gt;
    &lt;smart-item :data="data"&gt;&lt;/smart-item&gt;
    &lt;button @click="change('img')"&gt;Switch to picture as component&lt;/button&gt;
    &lt;button @click="change('video')"&gt;Switch to video as component&lt;/button&gt;
    &lt;button @click="change('text')"&gt;Switch to text component&lt;/button&gt;
  &lt;/div&gt;
  &lt;script&gt;
    // Picture component options    var ImgItem = {
      props: ['data'],
      render: function(createElement) {
        return createElement('div', [
          createElement('p', 'Picture Component'),
          createElement('img', {
            attrs: {
              src: 
            }
          })
        ]);
      }
    }
    // Video component    var VideoItem = {
      props: ['data'],
      render: function(createElement) {
        return createElement('div', [
          createElement('p', 'Video Component'),
          createElement('video', {
            attrs: {
              src: ,
              controls: 'controls',
              autoplay: 'autoplay'
            }
          })
        ]);
      }
    };
    /*Plain text component*/
    var TextItem = {
      props: ['data'],
      render: function(createElement) {
        return createElement('div', [
          createElement('p', 'Pure text component'),
          createElement('p', )
        ]);
      }
    };

    ('smart-item', {
      functional: true,
      render: function(createElement, context) {
        function getComponent() {
          var data = ;
          if ( === 'img') return ImgItem;
          if ( === 'video') return VideoItem;
          return TextItem;
        }
        return createElement(
          getComponent(),
          {
            props: {
              data: 
            }
          },
          
        )
      },
      props: {
        data: {
          type: Object,
          required: true
        }
      }
    });
    new Vue({
      el: '#app',
      data() {
        return {
          data: {}
        }
      },
      methods: {
        change: function(type) {
           if (type === 'img') {
             = {
              type: 'img',
              url: '/iview/iview/master/assets/'
            }
          } else if (type === 'video') {
             = {
              type: 'video',
              url: '/v/oceans.mp4'
            }
          } else if (type === 'text') {
             = {
              type: 'text',
              content: 'This is a plain text'
            }
          }
        }
      },
      created: function() {
        ('img');
      }
    });
  &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;

The above is all the content of this article. I hope it will be helpful to everyone's study and I hope everyone will support me more.