当前位置: 首页 > news >正文

Vue中渲染函数

why?

在绝大多数情况下,Vue 推荐使用模板语法来创建应用。然而在某些使用场景下,我们真的需要用到 JavaScript 完全的编程能力。这时渲染函数就派上用场了。

例如:下方要在多个模型上方设置对话框,如果使用Vue模板语法相对较困难(要确保对话框位置相对正确,要产生多个实例),用渲染函数相对更加简单[JS循环]

Vue模板语法、渲染函数两种方式,选择恰当的一个就行!

 渲染管线

从高层面的视角看,Vue 组件挂载时会发生如下几件事:

  1. 编译:Vue 模板被编译为渲染函数:即用来返回虚拟 DOM 树的函数。这一步骤可以通过构建步骤提前完成,也可以通过使用运行时编译器即时完成。

  2. 挂载:运行时渲染器调用渲染函数,遍历返回的虚拟 DOM 树,并基于它创建实际的 DOM 节点。这一步会作为响应式副作用执行,因此它会追踪其中所用到的所有响应式依赖。

  3. 更新:当一个依赖发生变化后,副作用会重新运行,这时候会创建一个更新后的虚拟 DOM 树。运行时渲染器遍历这棵新树,将它与旧树进行比较,然后将必要的更新应用到真实 DOM 上去。

 渲染函数

Vue3

渲染函数 & JSX | Vue.js

import { h } from 'vue'const vnode = h('div', // type{ id: 'foo', class: 'bar' }, // props[/* children */]
)

h() 是 hyperscript 的简称——意思是“能生成 HTML (超文本标记语言) 的 JavaScript”。这个名字来源于许多虚拟 DOM 实现默认形成的约定。一个更准确的名称应该是 createVnode(),但当你需要多次使用渲染函数时,一个简短的名字会更省力。

h() 函数的使用方式非常的灵活:

// 除了类型必填以外,其他的参数都是可选的
h('div')
h('div', { id: 'foo' })// attribute 和 property 都能在 prop 中书写
// Vue 会自动将它们分配到正确的位置
h('div', { class: 'bar', innerHTML: 'hello' })// 像 `.prop` 和 `.attr` 这样的的属性修饰符
// 可以分别通过 `.` 和 `^` 前缀来添加
h('div', { '.name': 'some-name', '^width': '100' })// 类与样式可以像在模板中一样
// 用数组或对象的形式书写
h('div', { class: [foo, { bar }], style: { color: 'red' } })// 事件监听器应以 onXxx 的形式书写
h('div', { onClick: () => {} })// children 可以是一个字符串
h('div', { id: 'foo' }, 'hello')// 没有 props 时可以省略不写
h('div', 'hello')
h('div', [h('span', 'hello')])// children 数组可以同时包含 vnodes 与字符串
h('div', ['hello', h('span', 'hello')])

Vue模板语法多数可以直接用渲染函数(更底层)直接实现 

 Vue2

在 Vue 2 中,渲染函数(Render Functions)同样提供了一种比模板(Templates)更底层、更灵活的方式来描述组件的输出。不过,与 Vue 3 稍有不同的是,Vue 2 的渲染函数直接接收一个名为 createElement 的函数作为参数,虽然 Vue 2 的社区中也经常使用 h 作为 createElement 的别名(这需要通过额外的配置或插件来实现,比如 Babel 插件),但 Vue 2 的官方文档和默认配置中并没有直接提供 h 作为 createElement 的别名。

在 Vue 2 的组件中,你可以通过定义一个 render 函数来使用渲染函数,该函数接收一个 createElement 参数,并返回一个虚拟节点(VNode)。这个虚拟节点描述了组件的 DOM 结构。

下面是一个 Vue 2 组件中使用渲染函数的例子:

// 假设没有使用 h 作为 createElement 的别名  
export default {  data() {  return {  message: 'Hello, Vue 2!'  };  },  render(createElement) {  // 使用 createElement 创建 VNode  return createElement('div', this.message);  }  
}

createApp()函数

createApp函数是Vue 3中用于创建一个新的Vue应用实例的API。它是Vue 3的入口点,允许你定义根组件,并挂载这个Vue应用到DOM中的某个元素上

import { createApp } from 'vue'  
import App from './App.vue'  const app = createApp(App)  
//挂载
app.mount('#app')

  在Vue2中使用new Vue()构建Vue实例

const createDialog = (opts) => {if (parentNode) {document.body.removeChild(parentNode);parentNode = null;}const instance=new Vue({render: (h) => {// let properties={...opts}// console.log(properties)return h(dialog,{...opts})}})parentNode = document.createElement('div');// 挂载instance.$mount(parentNode)document.body.appendChild(parentNode);// vue3中新建一个vm实例// const app = createApp({//   //   render() {//   //     // 这个是属性传递入口//     return h(dialog, {//       ...opts,//     });//   },// });// parentNode = document.createElement('div');// const instance = app.mount(parentNode);// document.body.appendChild(parentNode);return {vmInstance: instance,};
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Elasticsearch:Java ECS 日志记录 - log4j2
  • GMSSL2.x编译鸿蒙静态库和动态库及使用
  • 【ELK】window下ELK的安装与部署
  • 【算法专题】双指针算法之LCR 179. 查找总价格为目标值的两个商品(力扣)
  • 【已解决】服务器无法联网与更换镜像源
  • JavaScript之WebAPIs-BOM
  • TCP重传机制详解
  • 【BUG】已解决:requests.exceptions.ProxyError: HTTPSConnectionPool
  • Python自动化DevOps任务入门
  • go语言Gin框架的学习路线(七)
  • python调用chrome浏览器自动化如何选择元素
  • 函数(递归)
  • 【JAVA】数据类型及变量
  • Android Navigation 组件原理和使用教程
  • 面试问题:React基本概念,和所遇到的CPU和IO问题
  • CSS 三角实现
  • django开发-定时任务的使用
  • js ES6 求数组的交集,并集,还有差集
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • magento 货币换算
  • MYSQL 的 IF 函数
  • Vue官网教程学习过程中值得记录的一些事情
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 全栈开发——Linux
  • 通过npm或yarn自动生成vue组件
  • 物联网链路协议
  • 新手搭建网站的主要流程
  • 优化 Vue 项目编译文件大小
  • 源码安装memcached和php memcache扩展
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • python最赚钱的4个方向,你最心动的是哪个?
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • # dbt source dbt source freshness命令详解
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #NOIP 2014# day.2 T2 寻找道路
  • (1)Android开发优化---------UI优化
  • (1)Jupyter Notebook 下载及安装
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (二)学习JVM —— 垃圾回收机制
  • (二)丶RabbitMQ的六大核心
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (一)模式识别——基于SVM的道路分割实验(附资源)
  • *p++,*(p++),*++p,(*p)++区别?
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .htaccess 强制https 单独排除某个目录
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .NET6实现破解Modbus poll点表配置文件
  • .NET开发人员必知的八个网站
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • @RequestBody与@ModelAttribute
  • @开发者,一文搞懂什么是 C# 计时器!