关于render函数的总结

一般情况下封装一个导航组件的写法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="app" v-cloak>
    <button @click=‘exchange_nevigation‘>点击切换</button>
    <v-anchor :title="title" :level=‘level‘>{{title}}</v-anchor>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script type="text/x-template" id=‘template1‘>
  <div>
      <h1 v-if="level===1" :title=‘title‘>
          <a :href="‘#‘+title">
              <slot></slot>
          </a>
      </h1>
      <h2 v-if=‘level===2‘>
          <a :href="‘#‘+title">
             <slot></slot>
          </a>
      </h2>
      <h3 v-if=‘level===3‘>
        <a :href="‘#‘+title">
           <slot></slot>
        </a>
    </h3>
    <h4 v-if=‘level===4‘>
        <a :href="‘#‘+title">
           <slot></slot>
        </a>
    </h4>
  </div>
</script>
<script>
    Vue.component(‘v-anchor‘,{
        template:"#template1",
        props: {
            level:{
                type:Number,
                required:true
            },
            title:{
                type:String,
                default:""
            }
        }
    })
    new Vue({
        el:"#app",
        data:{
           title:‘一级导航‘,
           msg:"一级导航",
           level:1
        },
        methods:{
            exchange_nevigation:function(){
                var arr=[‘一‘,‘二‘,‘三‘,‘四‘];
                if(this.level===4){this.level=1;
                this.title=arr[0]+‘级导航‘}else{
                    this.title=arr[this.level]+‘级导航‘;
                    this.level+=1
                }
            }
        }
    })
</script>
</body>
</html>

 使用render函数的写法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="app" v-cloak>
    <button @click=‘exchange_nevigation‘>点击切换</button>
    <v-anchor :title="title" :level=‘level‘>{{title}}</v-anchor>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>

<script>
    Vue.component(‘v-anchor‘,{
       render: function (createElement) {
           return createElement(
               ‘h‘+this.level,
               [
                   createElement(
                       ‘a‘,{
                           domProps:{
                               href:‘#‘+this.title
                           }
                       },
                       this.$slots.default
                   )
               ]
           )
       },
        props: {
            level:{
                type:Number,
                required:true
            },
            title:{
                type:String,
                default:""
            }
        }
    })
    new Vue({
        el:"#app",
        data:{
           title:‘一级导航‘,
           msg:"一级导航",
           level:1
        },
        methods:{
            exchange_nevigation:function(){
                var arr=[‘一‘,‘二‘,‘三‘,‘四‘];
                if(this.level===4){this.level=1;
                this.title=arr[0]+‘级导航‘}else{
                    this.title=arr[this.level]+‘级导航‘;
                    this.level+=1
                }
            }
        }
    })
</script>
</body>
</html>

同上,实现了同样的效果

关于render函数

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div id="app" v-cloak>
    <v-anchor></v-anchor>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>

<script>
    Vue.component(‘v-anchor‘,{
       render: function (createElement) {
           return createElement(
                //第一个参数是标签,必须填写,形式{String|Object|Function}
               ‘div‘,
                //第二个参数是对应属性的数据对象可以选填
               {style:{
                   height:"100px",
                   width:"100px",
                   border:"1px solid black",
                   background:‘yellow‘
               }},
               //子节点,可选填
               [createElement(‘h1‘,{
                  domProps:{
                      innerHTML:‘测试‘
                  },
                  style:{
                      color:‘red‘
                  }
               })]
           )
       }
    })
    new Vue({
        el:"#app",
        data:{
        }
    })
</script>
</body>
</html>

1.render函数的内容必须return出来

2.它包括三个参数

  2-1.第一个参数是标签,可以是函数或者字符串或者对象的形式产生

  2-2.第二个参数是该标签的数据对象,也可以使用template

3.第三个参数使它的子节点,可以选填,写法和父节点一样

关于render的第二个参数

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<style>
    .a1{
        color:red
    }
</style>
<body>
<div id="app" v-cloak>
    <v-anchor></v-anchor>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue"></script>

<script>
    Vue.component(‘v-anchor‘,{
       render: function (createElement) {
           return createElement(
                //第一个参数是标签,必须填写,形式{String|Object|Function}
               ‘h1‘,
                //第二个参数是对应属性的数据对象可以选填
               {
                   //和v-bind:class一样
                   ‘class‘:{
                       a1:true
                   },
                   //和v-bind:style一样
                   style:{
                      fontSize:‘100px‘,
                      textShadow:‘2px 2px 2px black‘,
                      textAlign:‘center‘
                   },
                   //正常的HTML特性
                   attrs:{
                       id:"my_h1",
                       title:"我是render生成"
                   },
                   //自定义事件监听
                   on:{
                       click:this.popup
                   },
                   //自定义指令
                   directives:[

                   ]
                   //作用域slot

               },
               //子节点,可选填
               [createElement(‘p‘,{
                   //DOM属性
                  domProps:{
                      innerHTML:‘测试‘
                  },
                  style:{
                      color:‘red‘
                  }
               })]
           )
       },
        methods:{
           popup:function(){
               alert(‘测试‘)
           }
        }
    });
    new Vue({
        el:"#app",
        data:{
        }
    })
</script>
</body>
</html>

时间: 2024-08-30 15:58:28

关于render函数的总结的相关文章

Vue2.x中的Render函数

Render函数是Vue2.x版本新增的一个函数:使用虚拟dom来渲染节点提升性能,因为它是基于JavaScript计算.通过使用createElement(h)来创建dom节点.createElement是render的核心方法.其Vue编译的时候会把template里面的节点解析成虚拟dom: 什么是虚拟dom? 虚拟dom不同于真正的dom,它是一个JavaScript对象.当状态发生变化的时候虚拟dom会进行一个diff判断/运算:然后判断哪些dom是需要被替换的而不是全部重绘,所以性能

Vue学习笔记进阶篇——Render函数

本文为转载,原文:Vue学习笔记进阶篇--Render函数 基础 Vue 推荐在绝大多数情况下使用 template 来创建你的 HTML.然而在一些场景中,你真的需要 JavaScript 的完全编程的能力,这就是 render 函数,它比 template 更接近编译器. <h1> <a name="hello-world" href="#hello-world"> Hello world! </a> </h1>

QTableView另类打印解决方案(复用render函数去解决print问题)

Qt QTableView另类打印解决方案     上回书说道Qt的model/view,我就做了个demo用于显示数据库中的内容.没想到tableview的打印竟然成了问题.我困惑了,难道Qt不应该提供一个print函数给tableview吗?这是最最常用的功能啊.    Google了半天,也没什么有用的结果.看到Qt labs有一篇blog,叫“All You Need is a little Polish”,里面给出了最新的spreadsheet demo中的tableview prin

vue render函数 函数组件化

之前创建的锚点标题组件是比较简单,没有管理或者监听任何传递给他的状态,也没有生命周期方法,它只是一个接受参数的函数 在这个例子中,我们标记组件为functional,这意味它是无状态(没有data),无实例(没有this上下文) 一个函数化组件就像这样: Vue.component('my-component', { functional: true, // 为了弥补缺少的实例 // 提供第二个参数作为上下文 render: function (createElement, context) {

Vue render函数

Vue 推荐在绝大多数情况下使用template来创建你的HTML.然而的一些场景中,你真的需要javascript的完全编程能力, 这就是render函数,它比template更接近编译器 demo Vue.component('render-demo',{ props:{ level:{ type:Number,required:true}, render:function(createElement){ return createElement('h'+this.level,this.$s

vue2.0之render函数

虽然vue推荐用template来创建你的html,但是在某些时候你也会用到render函数. 虚拟DOM Vue 通过建立一个虚拟 DOM 对真实 DOM 发生的变化保持追踪.请近距离看一下这行代码: return createElement('h1', this.blogTitle) createElement 到底会返回什么呢?其实不是一个实际的 DOM 元素.它更准确的名字可能是createNodeDescription,因为它所包含的信息会告诉 Vue 页面上需要渲染什么样的节点,及其

【转】【Html】Vuejs2.0学习之二(Render函数,createElement,vm.$slots,函数化组件,模板编译,JSX)

1.Render函数 所以直接来到Render,本来也想跳过,发现后面的路由貌似跟它还有点关联.先来看看Render 1.1 官网一开始就看的挺懵的,不知道讲的是啥,动手试了一下,一开头讲的是Render的用法,官网的栗子永远都是一个特点,tm的不贴完整,我这里是个相对完整版的:(为了看的清楚点,替换了下名字) <div id="div1"> <child :level="2">Hello world!</child> </

Vue.js(12)- 霸道的render函数渲染组件

index.html <div id="app"> <p>这是index.html</p> </div> index.js // 导入全的vue // import Vue from 'vue/dist/vue.js' // 导入阉割版的vue import Vue from 'vue' import App from './app.vue' const vm = new Vue({ el: '#app', template: `<

虚拟DOM 和 Diff 算法,key的作用,jsx,render函数

虚拟DOM 和 Diff 算法 什么是虚拟DOM? 使用javascript模拟了DOM结构的树形结构(对象表示),这个树结构包含整个DOM结构的信息 使用虚拟DOM有什么好处? 操作数据要大大的减少性能损耗,提高渲染效率 越多的真实dom操作,越损耗性能 什么是Diff 算法? 是linux的基础命令,用来比较两个文本文件的差异,是代码版本管理的基石之一 vdom中应用diff算法是为了找出需要更新的节点 diff算法的实现,关注patch,patch方法中首先判断两个节点是否相同 核心逻辑.