返回顶部
首页 > 资讯 > 前端开发 > node.js >vue中render function code有什么用
  • 935
分享到

vue中render function code有什么用

2024-04-02 19:04:59 935人浏览 八月长安
摘要

这篇文章主要介绍Vue中render function code有什么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!vue核心执行过程图vue核心的执行过程主要分为这几个阶段:&n

这篇文章主要介绍Vue中render function code有什么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

vue核心执行过程图

vue中render function code有什么用

vue核心的执行过程主要分为这几个阶段:

      1) 编译模板,生成可复用的render function code(这是今天要重点解读的),这一步在vue实例的整个生命周期中只会执行一次甚至零次,因为我们可以在打包的时候可以预编译

      2) 生成watcher等核心渲染监听,在整个vue实例的生命过程中持续发生着作用,对view和modal进行双向绑定

      3) 虚拟dom的diff比较,当watcher监听到data的变更的时候,就会根据注入新的data执行render function code,生成新的虚拟dom,跟老的虚拟dom(第一次执行的时候可能为空)进行diff比对,不同的部分将写入真实的dom

这几个过程都会以源码解析的方式分篇解读,今天我们重点讲解的是第一部分模板编译中输出的render function code

render function code解析

一、模板编译过程分解

// 生成ast语法树
const ast = parse(template.trim(), options)
// 标记静态内容(以免diff的时候需要重复比较)
optimize(ast, options)
// 生成render function code
const code = generate(ast, options)

很遗憾,上诉三步的代码今天都只是点到为止,不需要太努力,就能在网上搜到相关解析的文章,如果实在找不到同时又感兴趣,可以找到vue源码中的下面文件去读:

// 编译入口
src/compiller/index.js
// html解析
src/compiller/parser/html-parser.js
// src/compiller下的其它文件

换一个姿势读源码,今天我们要读的是generate(ast, options)生成的render function code的具体代码

二、写一个 vue demo

之前有提到过,读源码需要先了解整体的设计思想、架构,上面那个执行过程图在此列;另外,搭建一个demo执行环境进行debug单步调试,也是一个重要手段(特别是你对源码的目录结构不是特别清晰的时候)。为了让生成的render function code更为完整,写一个覆盖面尽量广的 demo :

//template
 <div id="app">
  <p>普通属性:{{ message }}</p>
  <p>{{msg()}}</p>
  <p>{{ct}}</p>
  <input v-model="message">
  <div v-for="item in items">
   {{ item.text }}
  </div>
  <button v-on:click="bindClick">点我抓同伟</button>
 </div>

 // js
 new Vue({
  el: '#app',
  data: {
  message: '以vue的名义',
  items: [{
   text: '达康书记'
  }, {
   text: '育良书记'
  }]
  },
  methods: {
  bindClick: function() {
   this.message = '这就抓同伟去';
  },
  msg: function() {
   return this.message + "这个方法每次都会执行";
  }
  },
  computed: {
  ct: function() {
   return this.message + "计算属性并不会每次都执行";
  }
  }
 })

render function code 解析

debug 拿到生成的 render function code(当然也可以通过 webpack 的 vue-loader 编译之后的 dist 文件拿到,此处省略1000字)

with(this) {
 return _c('div', {
  attrs: {
   "id": "app"
  }
 },
 [_c('p', [_v("普通属性:" + _s(message))]), _v(" "), _c('p', [_v(_s(msg()))]), _v(" "), _c('p', [_v(_s(ct))]), _v(" "), _c('input', {
  directives: [{
   name: "model",
   rawName: "v-model",
   value: (message),
   expression: "message"
  }],
  domProps: {
   "value": (message)
  },
  on: {
   "input": function($event) {
    if ($event.target.composing) return;
    message = $event.target.value
   }
  }
 }), _v(" "), _l((items),
 function(item) {
  return _c('div', [_v("\n\t\t " + _s(item.text) + "\n\t ")])
 }), _v(" "), _c('button', {
  on: {
   "click": bindClick
  }
 },
 [_v("点我出奇迹抓同伟")])], 2)
}

甭看这段代码有点怪,但是如果告诉你,这段代码,注入 data 执行,生成的就是传得玄乎其玄的虚拟 dom 树,然后再来一本正经的解(cai)读(ce)一下,你又会觉得这段代码其实没有这么晦涩难懂。ok,结合 demo
来看看,模板相关指令都被解析成什么了:

      1) {{messge}} 解析成了 _s(message) ,果断认为这个 _s 就是 toString

      2) {{msg()}} method 解析成了 _s(msg()) ,可见每一次 render, msg 方法都会被执行一遍(即使最终没有被反应到真实 dom 上),这就是计算属性存在的意义

      3) {{ct}} 计算属性依然被解析成了 _s(ct) ,虽然计算属性可以称之为属性,但是形式上毕竟还是方法,是不是觉得比较奇怪?其实 watcher 除了监听组件,还会监听计算属性依赖的属性,一旦属性发生变更,就会执行计算属性方法,并将执行结果赋值给实例作用域下与计算属性方法名相同的属性,这就是直接使用 _s(ct) 而不是 _s(ct()) 就能正确引用计算属性值的原因,计算属性快就快在了这里

      4) v-for="item in items" 被解析成了

 _l((items),
 function(item) {
  return _c('div', [_v("\n\t\t " + _s(item.text) + "\n\t ")])
 })

可见 _l 跟 for-each 很类似

      5) 至于 v-on:click 则解析成了

_c('button', {
  on: {
   "click": bindClick
  }
 }

      6) 再来看看 _c, c->create->createnode, 假设这个方法就是创建虚拟节点,回头看上述代码,是不是挺有道理,_c 创建根节点,传入的子节点同样需要这个方法创建。找找源码验证下 src/core/vdom/vnode.js,以下中文注释是我加的

constructor (
 tag?: string, //标签名
 data?: VNodeData, //属性数据,事件监听等
 children?: ?Array<VNode>, //子节点
 text?: string,
 elm?: Node,
 context?: Component,
 componentOptions?: VNodeComponentOptions
 ) {
 ...
 }

以上是“vue中render function code有什么用”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网node.js频道!

--结束END--

本文标题: vue中render function code有什么用

本文链接: https://lsjlt.com/news/78479.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • vue中render function code有什么用
    这篇文章主要介绍vue中render function code有什么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!vue核心执行过程图vue核心的执行过程主要分为这几个阶段:&n...
    99+
    2024-04-02
  • vue中Render函数有什么用
    vue中Render函数有什么用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。首先是v-if 的转化使用全局组件的v 值决定组件渲染的状态...
    99+
    2024-04-02
  • vue中出现function () { [native code] }错误怎么解决
    本篇内容主要讲解“vue中出现function () { [native code] }错误怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习...
    99+
    2023-06-29
  • React中Render Props模式有什么用
    这篇文章主要介绍React中Render Props模式有什么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!概述Render Props模式是一种非常灵活复用性非常高的模式,它可以...
    99+
    2024-04-02
  • vue中Render函数怎么使用
    这篇文章主要介绍“vue中Render函数怎么使用”,在日常操作中,相信很多人在vue中Render函数怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue中Render函数怎么使用”的疑惑有所帮助!...
    99+
    2023-07-04
  • javascript 中Function函数有什么用
    javascript 中Function函数有什么用,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Function函数是javascrip...
    99+
    2024-04-02
  • Yii中render和renderPartial有什么区别
    在Yii中,render和renderPartial是两种渲染视图的方式,它们有如下区别:1. render会渲染完整的视图文件,包括布局文件和视图文件。而renderPartial只会渲染指定的视图文件,不包含布局文件。2. rend...
    99+
    2023-08-11
    Yii render renderPartial
  • Vue中为什么要引入render函数的实现
    目录前言背景原理后记前言 使用Vue脚手架创建项目的入口文件main.js中,默认代码如下: import Vue from 'vue' import App from './App...
    99+
    2024-04-02
  • css中的animation-timing-function属性有什么用
    这篇文章将为大家详细讲解有关css中的animation-timing-function属性有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。   CSS3anim...
    99+
    2024-04-02
  • vue中使用render封装一个select组件
    目录使用render封装一个select组件vue另类封装--render函数封装先看看文件的结构render函数封装使用render封装一个select组件 父组件 val...
    99+
    2024-04-02
  • Python虚拟机中的Code obejct有什么作用
    这篇文章主要介绍了Python虚拟机中的Code obejct有什么作用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python虚拟机中的Code obejct有什么作用文章都会有所收获,...
    99+
    2023-07-05
  • Vue中Watcher有什么用
    本篇文章给大家分享的是有关Vue中Watcher有什么用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。接着上节Vue Watcher源码的话,...
    99+
    2024-04-02
  • vue中vuex有什么用
    小编给大家分享一下vue中vuex有什么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Vuex什么是Vuex?官方说法:Vue...
    99+
    2024-04-02
  • vue中router.push()有什么用
    这篇文章给大家分享的是有关vue中router.push()有什么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。除了使用 <router-link> 创建 a 标签...
    99+
    2024-04-02
  • vue中@click.native.prevent有什么用
    这篇文章主要介绍了vue中@click.native.prevent有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。关于@click.native.prevent的说明...
    99+
    2023-06-29
  • sql中function的用法是什么
    在SQL中,函数是一种被设计用来执行特定任务并返回一个值的命名代码块。函数可以接受输入参数,并且基于这些参数执行一系列的操作,最终返...
    99+
    2024-04-09
    sql
  • sql中function的作用是什么
    SQL中的function(函数)是一种用来返回特定值的可重用代码块。它可以接受参数并执行特定的操作,然后返回一个结果。函数可以简化...
    99+
    2024-04-09
    sql
  • method和function有什么区别
    本篇内容主要讲解“method和function有什么区别”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“method和function有什么区别”吧!函数是一段...
    99+
    2024-04-02
  • vue中auto-vue-file包有什么用
    这篇文章主要介绍vue中auto-vue-file包有什么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!auto-vue-fileauto create .vue file by ...
    99+
    2024-04-02
  • vue中组件有什么用
    这篇文章主要为大家展示了“vue中组件有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue中组件有什么用”这篇文章吧。一、递归组件组件在它的模板内可以递...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作