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

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编程能力

相关文章:

  • Java编程中常见的条件链与继承陷阱
  • 华为云Flexus+DeepSeek征文|华为云一键部署知识库搜索增强版Dify平台,构建智能聊天助手实战指南
  • 【PhysUnits】15.17 比例因子模块 (ratio.rs)
  • 【在线五子棋对战】二、websocket 服务器搭建
  • 僵尸进程是什么?怎么回收?孤儿进程?
  • Spring Cloud Hystrix熔断机制:构建高可用微服务的利器
  • 今天对C语言中static和extern关键字的作用认识又深刻了
  • 174页PPT家居制造业集团战略规划和运营管控规划方案
  • SQLMesh实战:用虚拟数据环境和自动化测试重新定义数据工程
  • 高频 PCB 技术发展趋势与应用解析
  • Python 基础核心语法:输入输出、变量、注释与字符串操作
  • 数据通信与计算机网络——数字传输
  • python打卡第45天
  • electron-vite串口通信
  • go中的接口返回设计思想
  • 限流算法java实现
  • conda环境配置(一) —— 常用虚拟环境操作命令
  • 多文化软件团队的协作之道:在认知差异中寻找协同的支点
  • 网络原理5 - TCP4
  • N元语言模型 —— 一文讲懂!!!
  • 苏州网络推广苏州网站建设/优化关键词的方法正确的是
  • 招工做的网站/域名注册优惠
  • 北京网站建设降龙/东莞网络推广营销公司
  • 移动端 pc网站开发/qq推广软件
  • 沈阳做企业网站的公司/2023年6月份疫情严重吗
  • 做短租类型的网站/百度一下百度主页官网