深入理解vue Render函数


Posted in Javascript onJuly 19, 2017

最近在学习vue,正好今日留个笔记,我自己还在摸索学习中,现整理出来以作记录。

会使用基本的Render函数后,就会想,这怎么用 v-for/v-if/v-model;我写个vue Render函数进阶

首先是v-if 的转化使用全局组件的v 值决定组件渲染的状态,对实例中传递的props的“nnum”值得控制可以自如的切换两种状态显示。这样就是和v-if 一样使用组件了

<div id="app"> 
    <mycom :v="nnum"> 
      <div slot="slot2">hahahhah</div> 
      <div slot="slot1">ggggggggggggg</div> 
    </mycom> 
  </div> 
  <script> 
    Vue.component('mycom',{ 
      render:function(createElement){ 
        var s=this; 
        if(this.v==1){ 
          return createElement('div', 
           { 
            domProps:{innerHTML:'component n='+this.n} 
           }) 
        }else{ 
 
          return createElement('div', 
            [this.$slots.slot1,this.$slots.slot2]) 
        } 
      }, 
      props:{ 
        v:{ 
          type:Number, 
          default:0 
        }, 
        n:{ 
          default:'hello' 
        } 
      } 
    }); 
    var app=new Vue({ 
      el:'#app', 
      data:{ 
        nnum:1 
      } 
    })

v-for 的使用需要需要使用到map

<div id="app"> 
    <mycom :v="nnum" :ar="arr"> 
      <div slot="slot2">hahahhah</div> 
      <div slot="slot1">ggggggggggggg</div> 
    </mycom> 
  </div> 
  <script> 
    Vue.component('mycom',{ 
      render:function(createElement){ 
        if(this.v==1){ 
          return createElement('div', 
              this.ar.map(function(item){ 
                return createElement('li', 
                  { 
                    domProps:{ 
                      innerHTML:item 
                    } 
                  }) 
              }) 
           ) 
        }else{ 
 
          return createElement('div', 
            [this.$slots.slot1,this.$slots.slot2]) 
        } 
      }, 
      props:{ 
        v:{ 
          type:Number, 
          default:0 
        }, 
        n:{ 
          default:'hello' 
        }, 
        ar:{ 
          type:Array, 
          default:function(){ return [1,23,4,5,6,55,65]} 
        } 
 
      } 
    }); 
    var app=new Vue({ 
      el:'#app', 
      data:{ 
        nnum:1, 
        arr:[1,2,3,4,5,6,7,8] 
      } 
    }) 
  </script> 
  </body>

只有map方法才能检测改变,其他的方法不能根据数据的改变能改变相应的状态下的例子中的arr数组   依靠 apply的方法来实现的就不能够检测this.ar 的变换来重新计算

return createElement('div',
              Array.apply(null,this.ar.map(function(item){
                return createElement('li',
                  {
                    domProps:{
                      innerHTML:'item'
                    }
                  })
              }))
<body> 
  <div id="app"> 
    <mycom :v="nnum" :ar="arr"> 
      <div slot="slot2">hahahhah</div> 
      <div slot="slot1">ggggggggggggg</div> 
    </mycom> 
  </div> 
  <script> 
    Vue.component('mycom',{ 
      render:function(createElement){ 
        if(this.v==1){ 
          return createElement('div', 
              this.ar.map(function(item){ 
                return createElement('li', 
                  { 
                    domProps:{ 
                      innerHTML:item 
                    } 
                  }) 
              }) 
            ) 
        }else{ 
           return createElement('div', 
              Array.apply(null,this.ar.map(function(item){ 
                return createElement('li', 
                  { 
                    domProps:{ 
                      innerHTML:'item' 
                    } 
                  }) 
              })) 
            ) 
        } 
      }, 
      props:{ 
        v:{ 
          type:Number, 
          default:0 
        }, 
        n:{ 
          default:'hello' 
        }, 
        ar:{ 
          type:Array, 
          default:function(){ return [1,23,4,5,6,55,65]} 
        } 
 
      } 
    }); 
    var app=new Vue({ 
      el:'#app', 
      data:{ 
        nnum:2, 
        arr:[1,2,3,4,5,6,7,8] 
      } 
    }) 
  </script> 
  </body>

v-model 使用domProps来实现双向绑定

使用对value:赋值可以将数据绑定给 input 的默认值,但是对input 的修改并不能传递给vue  这涉及到组件的通信问题,
所以想实现双向绑定,只能自己写事件来出发  vue shu'j的传递

domProps:{value:self.v }
<body> 
  <div id="app"> 
    <mycom :v="nnum" :ar="arr"> 
      <div slot="slot2">hahahhah</div> 
      <div slot="slot1">ggggggggggggg</div> 
    </mycom> 
    <div>{{nnum}}</div> 
  </div> 
  <script> 
    Vue.component('mycom',{ 
      render:function(createElement){ 
        var self=this; 
        var inp=createElement('input', 
                  { 
                    domProps:{ 
                      value:self.v 
                    } 
                  }); 
          return createElement('div',[inp]) 
 
        }, 
      props:{ 
        v:{ 
          type:Number, 
          default:0 
        }, 
        n:{ 
          default:'hello' 
        }, 
        ar:{ 
          type:Array, 
          default:function(){ return [1,23,4,5,6,55,65]} 
        } 
 
      } 
    }); 
    var app=new Vue({ 
      el:'#app', 
      data:{ 
        nnum:100, 
        arr:[1,2,3,4,5,6,7,8] 
      } 
    }) 
  </script> 
  </body>

通过input触发undateValue来更新 app中的nnum 值(差点没转过弯来,render过于复杂后,真的是自己找罪受)

<div id="app"> 
    <mycom :v="nnum" :ar="arr" @input="updateValue"> 
 
    </mycom> 
    <div>{{nnum}}</div> 
  </div> 
  <script> 
    Vue.component('mycom',{ 
      render:function(createElement){ 
        var self=this; 
        var inp=createElement('input', 
                  { 
                    domProps:{ 
                      value:self.v 
                    }, 
                    on:{ 
                     input:function(event){ 
                      self.$emit('input',event.target.value) 
 
                     } 
                    } 
                  }); 
          return createElement('div',[inp]) 
 
        }, 
      props:{ 
        v:{ 
          type:Number, 
          default:0 
        }, 
        n:{ 
          default:'hello' 
        }, 
        ar:{ 
          type:Array, 
          default:function(){ return [1,23,4,5,6,55,65]} 
        } 
 
      }, 
      methods:{ 
        update:function(){ 
 
        } 
      } 
    }); 
    var app=new Vue({ 
      el:'#app', 
      data:{ 
        nnum:100, 
        arr:[1,2,3,4,5,6,7,8] 
      }, 
      methods:{ 
        updateValue:function(value){ 
          this.nnum=parseFloat(value); 
        } 
      } 
    }) 
 
  </script> 
  </body>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery 学习6 操纵元素显示效果的函数
Feb 07 Javascript
javascript中[]和{}对象使用介绍
Mar 20 Javascript
Jquery多选框互相内容交换的实例代码
Jul 04 Javascript
jQuery ajax调用WCF服务实例
Jul 16 Javascript
javascript中递归函数用法注意点
Jul 30 Javascript
Jquery和CSS实现选择框重置按钮功能
Nov 08 jQuery
Vue press 支持图片放大功能的实例代码
Nov 09 Javascript
jQuery位置选择器用法实例分析
Jun 28 jQuery
jquery获取并修改触发事件的DOM元素示例【基于target 属性】
Oct 10 jQuery
JavaScript相等运算符的九条规则示例详解
Oct 20 Javascript
vscode 调试 node.js的方法步骤
Sep 15 Javascript
JavaScript中的宏任务和微任务详情
Nov 27 Javascript
Vue AST源码解析第一篇
Jul 19 #Javascript
Vue之Watcher源码解析(1)
Jul 19 #Javascript
angular.js + require.js构建模块化单页面应用的方法步骤
Jul 19 #Javascript
Vue学习笔记进阶篇之多元素及多组件过渡
Jul 19 #Javascript
vue中的非父子间的通讯问题简单的实例代码
Jul 19 #Javascript
Vue之Watcher源码解析(2)
Jul 19 #Javascript
Angular.js项目中使用gulp实现自动化构建以及压缩打包详解
Jul 19 #Javascript
You might like
PHP中Session的概念
2006/10/09 PHP
php实例分享之html转为rtf格式
2014/06/02 PHP
Smarty使用自定义资源的方法
2015/08/08 PHP
PHP编程中尝试程序并发的几种方式总结
2016/03/21 PHP
js 数组操作代码集锦
2009/04/28 Javascript
javascript 表单规则集合对象
2009/07/21 Javascript
JQuery.get提交页面不跳转的解决方法
2015/01/13 Javascript
Javascript基础教程之变量
2015/01/18 Javascript
js实现Select下拉框具有输入功能的方法
2015/02/06 Javascript
ECMAScript 5严格模式(Strict Mode)介绍
2015/03/02 Javascript
js简单实现调整网页字体大小的方法
2016/07/23 Javascript
BootStrap中
2016/12/10 Javascript
JavaScript 隐性类型转换步骤浅析
2018/03/15 Javascript
webstorm和.vue中es6语法报错的解决方法
2018/05/08 Javascript
Vue ElementUi同时校验多个表单(巧用new promise)
2018/06/06 Javascript
jquery.pagination.js分页使用教程
2018/10/23 jQuery
小程序绑定用户方案优化小结
2019/05/15 Javascript
解决vue下载后台传过来的乱码流的问题
2020/12/05 Vue.js
[02:37]TI8勇士令状不朽珍藏II视频展示
2018/06/23 DOTA
python使用正则表达式分析网页中的图片并进行替换的方法
2015/03/26 Python
Python中获取对象信息的方法
2015/04/27 Python
Python3中的2to3转换工具使用示例
2015/06/12 Python
Python使用min、max函数查找二维数据矩阵中最小、最大值的方法
2018/05/15 Python
python简单区块链模拟详解
2019/07/03 Python
Python 解决OPEN读文件报错 ,路径以及r的问题
2019/12/19 Python
python实现程序重启和系统重启方式
2020/04/16 Python
python3实现名片管理系统(控制台版)
2020/11/29 Python
python 如何对logging日志封装
2020/12/02 Python
用html5的canvas画布绘制贝塞尔曲线完整代码
2013/08/14 HTML / CSS
详解如何在登录过期后跳出Ifram框架
2020/09/10 HTML / CSS
美国户外服装和装备购物网站:Outland USA
2020/03/22 全球购物
机关党员2014全国两会学习心得体会
2014/03/10 职场文书
导师评语大全
2014/04/26 职场文书
师范生见习报告范文
2014/11/03 职场文书
2014年妇联工作总结
2014/11/21 职场文书