Vue中渲染函数的使用

Vue中渲染函数的使用

      • 1. render函数
      • 2. h()的使用
      • 3. render函数和h函数的区分

  • vue中的渲染函数:
    • 1.template
    • 2.render函数
    • 3.jsx -> js extension(jsx也是编译成render函数可编程能力更强)

1. render函数

  • 1.1. 认识h函数

    • 1.1.1. Vue推荐在绝大多数情况下使用模板来创建HTML,一些特殊的场景,真的需要javaScript的完全编程的能力,
      这个时候可以使用渲染函数,它比模板更接近编译器。
    • 1.1.2. VNodeVDom的概念
      • Vue在生成真实DOM之前,会将我们的节点转换成VNode, 而VNode组合在一起形成一棵树结构,就是虚拟DOM(VDOM);

      • 事实上,之前编写的template中的HTML最终也是使用渲染函数生成对应的VNode;

      • 如果想重复利用JavaScript的编程能力,可以编写createVNode函数,生成对应的VNode;

      • Vue底层渲染流程如下图:

        <!-- HTML模板 -->            <!--  h函数 -->           <!--  虚拟节点VNode -->         <!--  真实DOM -->
        <template> <div>                      createVNode()                     VNode                          真实DOM<h2></h2>                createVNode()                   ↙      ↘                    ↙          ↘  <p></p>                  createVNode()                 VNode     VNode               h2             p  </div>
        </template>
        

        在这里插入图片描述

  • 1.2. 使用h函数

    • h() 函数是一个用于创建vnode的一个函数;
    • 其实更准确的命名是createVNode()函数,但是为了简便在Vue将之简化为h()函数(本质上是createVNode()函数)

2. h()的使用

  • h()函数接收三个参数:tag, props, children
      { String | Object | Function } tag                             {  Object } props                                    { String | Array | Object } children一个HTML标签、一个组件、一个异步组件、或                          与attribute、prop 和事件相对应的对象                    子 VNodes, 使用`h()` 构建一个函数式组件                                                  会在模板中使用                                         使用字符串获取 `文本 VNode``有插槽的对象`必需的                                                         可选的                                                 可选的例如:'div'                                                    { }                                                    [ 'some text comes first',h('h1', null, '哈哈哈哈'),h(myComponent, {someProp: 'fooBar'})]
  • 注意事项:
    • 如果没有props, 通常可以将children作为第二个参数传入;
    • 如果会产生歧义,可以将null作为第二个参数传入,将children作为第三个参数传入;
  • HTML转成VNode的调用案例:
      <div class="abc" title='内容'>h2p</div>// 转成VNode:createVNode('div', { class: 'abc', title: '内容' }[createVNode('h2', null, '我是标题'),createVNode('p', { }, '我是内容')])
  • createVNode函数的调用如下图;
    在这里插入图片描述

3. render函数和h函数的区分

  • 流程:render函数是放在对应的组件选项里面的,当渲染组件的时候,会调用render函数,一旦调用就会返回的VNode,为了去创建一系列的VNode, 所以会调用h函数并渲染成HTML

  • 区分:render函数是写到组件里面的,而h函数(createVNode函数)才是真正去创建VNode的

    1. render函数使用
      1. Options API的用法,使用render函数选项
      • 代码如下:
          <script>import { h } from 'vue'import Home from './Home.vue'export default {data () {return {counter: 0}},render () {console.log('this===', this);return h('div', { class: 'app' } , [h('h2', { class: 'title' }, `当前计数:${ this.counter }`),h('button', { onClick: this.increment }, '+1'),h('button', { onClick: this.decrement }, '-1'),// 在render函数中,引入其他组件不需要注册(components), 在template模板中需要注册h(Home)])},methods: {increment () {this.counter++},decrement() {this.counter--}}}</script>
        
      1. Composition API的用法
      • 2.1. setup函数的使用,
        • 关键点:setup()中返回一个函数,函数中返回VNode
        • setup函数默认返回一个对象 => return { counter, increment, decrement }
        • setup函数中使用render函数,不要返回对象,setup本身需要是返回一个函数类型, 箭头函数中再去返回VNode
        • 代码如如下:
          <script>import { h, ref } from 'vue'import Home from './Home.vue'export default {setup () {const counter = ref(0)const increment = () => {counter.value++}const decrement = () => {counter.value--}// setup函数默认返回一个对象 => return { counter, increment, decrement }// setup函数中使用render函数,不要返回对象,返回一个函数, 箭头函数中再去返回VNodereturn () => {return h('div', {className: 'app' }, [h('h2', { className: 'title' }, `当前计数: ${ counter.value }`),h('button', { onClick: increment }, '+1'),h('button', { onClick: decrement} , '-1'),h(Home)])}// return () => h('div', {className: 'app' }, [//   h('h2', { className: 'title' }, `当前计数: ${ counter.value }`),//   h('button', { onClick: increment }, '+1'),//   h('button', { onClick: decrement} , '-1'),//   h(Home)// ])}}</script>
        
      • 2.2. setup语法糖的使用
        • 在setup中义render函数
        • 在template模板中使用render标签
        • 代码如下;
            <template><render/></template><script setup>import { ref, h } from 'vue'import Home from './Home.vue'const counter = ref(0)const increment = () => {counter.value++}const decrement = () => {counter.value--}// 使用render函数,是为了使用js的方式去编写代码,基本上很少使用// 如果依然想使用JS的方式编写,可以使用JSX语法,JSX本质会转化成render函数// JSX的优点:1. 快速的编写元素的结构  2. 完全可以利用JS编程能力const render = () => h('div', {className: 'app' }, [h('h2', { className: 'title' }, `当前计数: ${ counter.value }`),h('button', { onClick: increment }, '+1'),h('button', { onClick: decrement} , '-1'),h(Home)])</script>
      1. render函数的使用推荐
      • 使用render函数,是为了使用js的方式去编写代码,基本上很少使用
      • 如果依然想使用JS的方式编写,可以使用JSX语法,JSX本质会转化成render函数
        • JSX的优点
            1. 快速的编写元素的结构
            1. 完全可以利用JS编程能力

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/86340.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【氮化镓】GaN HMETs器件物理失效分析进展

2021 年 5 月,南京大学的蔡晓龙等人在《Journal of Semiconductors》期刊发表了题为《Recent progress of physical failure analysis of GaN HEMTs》的文章,基于多种物理表征技术及大量研究成果,对 GaN HEMTs 的常见失效机制进行了系统分析。文中先介绍失效分析流程,包括使…

每日Prompt:治愈动漫插画

提示词 现代都市治愈动漫插画风格&#xff0c;现代女子&#xff0c;漂亮&#xff0c;长直发&#xff0c;20岁&#xff0c;豆沙唇&#xff0c;白皙&#xff0c;气质&#xff0c;清纯现代都市背景下&#xff0c;夕阳西下&#xff0c;一位穿着白色露脐短袖&#xff0c;粉色工装裤…

2025年牛客网秋招/社招高质量 Java 面试八股文整理

Java 面试 不论是校招还是社招都避免不了各种面试。笔试&#xff0c;如何去准备这些东西就显得格外重要。不论是笔试还是面试都是有章可循的。关键在于理解企业的需求&#xff0c;明确自己的定位&#xff0c;以及掌握一定的应试技巧。 笔试部分&#xff0c;通常是对基础知识、…

在UI界面内修改了对象名,在#include “ui_mainwindow.h“没更新

​原因​&#xff1a;未重新编译UI文件​​ Qt的UI文件&#xff08;.ui&#xff09;需要通过​​uic工具&#xff08;Qt的UI编译器&#xff09;​​生成对应的ui_*.h头文件。如果你在Qt Designer中修改了对象名&#xff0c;但没有​​重新构建&#xff08;Rebuild&#xff09;…

前端获取接口数据流程

一、Free-Table组件分析 <free-table v-show"showTable" v-model:page"params.pageNum" 双向绑定当前页大小&#xff0c;支持动态更新 v-model:limit"params.pageSize" 双向绑定每页大小&#xff0c;支持动态更新 v-loading&…

Linux系统防火墙之iptables

防火墙在一个系统中就好像是一个国家的军队&#xff0c;所谓国无军不安&#xff0c;在系统中也是这样&#xff0c;防火墙可以保护系统被别人攻击&#xff0c;过滤垃圾流量等&#xff0c;那么今天我们就来了解一下Linux系统中的一种防火墙iptables。 目录 iptables概述 规则 …

vue项目使用svg图标

下面是在 Vue 3 项目中完整引入和使用 vite-plugin-svg-icons 的步骤 1、安装插件 npm install vite-plugin-svg-icons -D # 或 yarn add vite-plugin-svg-icons -D # 或 pnpm add vite-plugin-svg-icons -D 2、配置 Vite 在 vite.config.ts 或 vite.config.js 中配置&…

元器件基础学习笔记——结型场效应晶体管 (JFET)

场效应晶体管&#xff08;Field Effect Transistor&#xff0c;FET&#xff09;简称场效应管&#xff0c;是一种三端子半导体器件&#xff0c;它根据施加到其其中一个端子的电场来控制电流的流动。与双极结型晶体管 &#xff08;BJT&#xff09; 不同&#xff0c;场效应晶体管 …

拆解实战案例:电商ERP管理系统从需求到原型全流程设计

ERP即企业资源计划系统&#xff0c;全称为Enterprise Resource Planning&#xff0c;其核心在于运用系统化管理思想&#xff0c;为企业员工及管理层构建一个提供决策支持的管理系统平台。它汇聚贯通企业各个业务模块产生的数据流&#xff0c;实现资源配置与业务流程高效协同。尤…

【面试题】如何保证MQ的消息不丢失、不重复

文章目录 一、消息丢失问题的解决方案&#xff08;一&#xff09;发送端丢失&#xff08;二&#xff09;存储端丢失1. 同步刷盘2. Broker 集群 &#xff08;三&#xff09;消费端丢失 二、消息重复问题的解决方案&#xff08;一&#xff09;唯一键约束&#xff08;二&#xff0…

ArcGIS Maps SDK for JavaScript:使用图层过滤器只显示FeatureLayer的部分要素

文章目录 引言1 需求场景分析2精确过滤实现方案2.1 基础过滤语法2.2 动态过滤实现 3 模糊查询进阶技巧3.1 LIKE操作符使用3.2 特殊字段处理 4. 性能优化与注意事项4.1 服务端vs客户端过滤4.2 最佳实践建议 5 常见问题解答 引言 在地图应用开发中&#xff0c;图层过滤是常见的需…

day25-计算机网络-3

1. DNS解析流程 windows host文件是否配置域名对应的ip查询本地DNS缓存是否有这个域名对应的ip询问本地DNS&#xff08;网卡配置的&#xff09;是否知晓域名对应的ip本地DNS访问根域名解析服务器&#xff0c;但是根DNS只有顶级域名的记录&#xff0c;根告诉我们.cn顶级域名的D…

中达瑞和SHIS高光谱相机在黑色水彩笔墨迹鉴定中的应用

在文件检验与物证溯源领域&#xff0c;对书写材料&#xff08;如墨水&#xff09;进行快速、准确、无损的鉴别至关重要。由陈维娜等人撰写的《高光谱技术结合化学计量法鉴别黑色水彩笔墨迹》&#xff08;发表于《光谱学与光谱分析》2023年第7期&#xff09;利用中达瑞和SHIS凝采…

华为OD机考 - 水仙花数 Ⅰ(2025B卷 100分)

import java.util.*; public static Integer get(int count,int c){if(count<3||count>7){return -1;}//存储每位数的最高位……最低位int[] arr new int[count];List<Integer> res new ArrayList<>();for(int i(int) Math.pow(10,count-1);i<(int) Math…

Go 标准库 encoding/gob 快速上手

文章目录 1.简介2.基础3.类型和值4.编码细节5.安全6.主要函数6.1 注册1. 接口的底层类型在运行时才能确定2.类型标识的唯一性3.安全性与显式意图4.与结构体的自动处理对比5.示例分析为什么不能像 JSON 那样自动处理&#xff1f;总结 6.2 编码6.3 解码 7.示例7.1 编解码结构体7.…

Ubuntu ifconfig 查不到ens33网卡

BUG&#xff1a;ifconfig查看网络配置信息&#xff1a; 终端输入以下命令&#xff1a; sudo service network-manager stop sudo rm /var/lib/NetworkManager/NetworkManager.state sudo service network-manager start - service network - manager stop &#xff1a;停止…

算法-数论

C-小红的数组查询&#xff08;二&#xff09;_牛客周赛 Round 95 思路&#xff1a;不难看出a数组是有循环的 d3,p4时&#xff0c;a数组&#xff1a;1、0、3、2、1、0、3、2....... 最小循环节为4&#xff0c;即最多4种不同的数 d4,p6时&#xff0c;a数组&#xff1a;1、5、3、…

CSS中text-align: justify文本两端对齐

text-align: justify; 是 CSS 中用于控制文本对齐方式的属性值&#xff0c;它的核心作用是让文本两端对齐&#xff08;分散对齐&#xff09;&#xff0c;使段落左右边缘整齐排列。以下是详细解析&#xff1a; 作用效果 均匀分布间距 浏览器会自动调整单词/字符之间的间距&#…

WebFuture:启动数据库提示: error while loading shared libraries: libaio.so.1问题处理

问题分析 当出现./mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory这个错误时&#xff0c;这意味着 MySQL 服务器&#xff08;mysqld&#xff09;在启动过程中无法找到libaio.so.1这个共享库文件。li…

74常用控件_QSpacerItem的使用

目录 代码⽰例: 创建⼀组左右排列的按钮. Spacer 使⽤布局管理器的时候, 可能需要在控件之间, 添加⼀段空⽩. 就可以使⽤ QSpacerItem 来表⽰. 核⼼属性 属性说明width宽度height高度hData水平方向的 sizePolicy - QSizePolicy::Ignored&#xff1a;忽略控件的尺寸&#xf…