美文网首页
vue 的 render 函数

vue 的 render 函数

作者: liwuwuzhi | 来源:发表于2019-02-12 12:07 被阅读0次

    render 函数的基本用法

    什么是render函数
    vue通过 template 来创建你的 HTML。但是,在特殊情况下,这种写死的模式无法满足需求,必须需要js的编程能力。此时,需要用render来创建HTML。实际上用template来创建html 在 webpack 做编译时 template 会被编译成 render 来运行的。



    语法
    render(createElement){ return createElement() }
    createElement() 有三个参数:
    第一个参数,必选,为 HTML 标签或组件或函数;
    第二个参数,可选,为数据对象,标签属性等;
    第三个参数,可选,该标签内容或子节点;

    看下面简单的例子:

    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <style>
            .bg{
                background:#abcdef;
            }
        </style>
    </head>
    <body>
        <div id="dome">
            <div>{{message}}</div>
        </div>
        <script>
            new Vue({
                el:"#dome",
                data:{
                    message:"hello world"
                },
                methods:{                  
                    mouseOverLog(){
                        console.log(this.message)
                    }
                },
                 render(createElement){
                      // createElement(html标签, 标签属性, 子元素)。
                     return createElement(
                        "span", //第1个参数 - html 标签
                        {       //第2个参数 - 在一个对象里设置该标签属性
                        
                            style: { marginLight: "8px", padding: "10px 20px", background: '#abcdef' },
                            on: {
                                click: () => {
                                    console.log('click')
                                },
                                mouseover: () => {
                                    console.log('mouseover');
                                    this.mouseOverLog();
                                }
                            }
                        }, 
                        '我是内容' //第3个参数 - 该标签的子元素
                        )
                    }
    
               
            });
        </script>
    </body>
    </html>
    



    当 createElement 的第三个元素为多个子元素时应用数组来包裹。

    new Vue({
                el:"#dome",
                data:{
                    message:"hello world"
                },
                render(createElement){
                    return createElement(
                        "ul",
                        {
                           class:{bg:true},
                        },
    
                        [
                            createElement("li", this.message),
                            createElement("li",'hello world 2'),
                        ]
                    );
                }
            });
    

    什么时候会用到render函数

    情景1: https://juejin.im/post/5a715ec96fb9a01cad7c7958
    情景2:
    当用 vue-cli 创建项目时,在main.js文件能看到如下代码

    import Vue from 'vue'
    import App from './App.vue'
    new Vue({
          el: '#app',
          render: h => h(App)
     })
    
    

    这里的 render: h => h(App) 是什么意思呢?
    转换为es5语法后如下:

    render: function(h) {
            return h(App);
        }
    

    当把h参数换成 createElement后

    render: function(createElement) {
            return createElement(App);
        }
    

    再来看一个例子

    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
    </head>
    <body>
        <div id="app"></div>
        <script type="text/javascript" src="https://unpkg.com/vue"></script>
        <script type="text/javascript">
            var app = new Vue({
                el: '#app', // 提供一个在页面上已经存在的 DOM 元素作为 Vue 实例挂载目标
                render: function (createElement) {
                    return createElement('h2', 'Hello Render!');
                }
            });
        </script>
    </body>
    </html>
    

    是不是回到上面熟悉的场景了。
    既创建一个 内容为 ‘Hello Render’ 的 h2 标签,替换到id为app的容器上。


    注意不管是 template 还是 render 都是挂载(替换)到 el 所指定的元素,而不是在放在该元素里面。



    参考文章:
    https://juejin.im/post/5a715ec96fb9a01cad7c7958


    希望这篇文章能帮助到你。
    END

    \color{#ccc}{liwuwuzhi}

    相关文章

      网友评论

          本文标题:vue 的 render 函数

          本文链接:https://www.haomeiwen.com/subject/maiheqtx.html