Vue2中的render函数

Vue 推荐在绝大多数情况下使用模板来创建你的 HTML。然而在一些场景中,你真的需要 JavaScript 的完全编程的能力。这时你可以用render渲染函数,它比模板更接近编译器

在Vue2中,render函数是一个可选的、用于生成虚拟DOM的特殊函数。它是Vue实例的一个选项,允许开发者使用JavaScript编写模板,而不是使用HTML模板。render函数接收一个h函数(h函数是createElement的别名。很多人喜欢用createElement,形参不过是个名称而已)作为参数,该函数用于创建虚拟节点(VNode)。

下面是一个render函数简单示例: 

render(h) {
  return h('h1', 'Hello, Vue!')
}

上面是一个简单写法,完整来说,h函数接受三个参数:

第一个参数:可以是字符串(表示HTML标签名或组件名)、组件对象或函数。如果是自定义组件,需要确保组件已经在当前实例或全局注册。

第二个参数:属性对象,包含传递给子组件的props、attrs、class、style等。

第三个参数:子节点,可以是字符串、数组或对象。

当第一个参数为HTML标签名的时候,常用配置如下: 

const vnode = h('div', {
  id: 'my-id', // 设置id属性
  class: 'my-class', // 设置class属性
  style: { color: 'red' }, // 设置内联样式
  onClick: function() { // 设置点击事件处理程序
    console.log('Clicked!');
  }
}, [
  h('p', { class: 'text' }, 'Hello, World!') // 子节点
]);

当第一个参数为组件名称时,配置如下:

const vnode = h('my-component', {
  // 组件的类名  使用同 :class  语法
  class: {
    aaa: true
  },
  // 组件的内联样式  使用同 :style  语法
  style: {
    color: 'blue'
  },
  // 一个对象,包含组件所需的属性。这些属性将被传递给组件,并在组件内部作为props进行访问。
  props: {
    msg: 'Hello, World!',
  },
  //一个对象,包含组件的非prop属性(例如,class、style等)。这些属性将被添加到组件的根元素上。
  attrs: {
    class: 'my-class',
    style: { color: 'red' }
  },
  // 一个对象,包含组件的事件处理程序。
  on: {
    click() {
      console.log('Clicked!!!')
    }
  },
  // 一个对象,包含组件的原生事件处理程序。与on类似,但用于监听原生DOM事件。
  nativeOn: {
    click() {
      console.log('Clicked!!!')
    }
  },
  // 一个对象,包含组件的DOM属性。
  domProps: {
    innerHTML: 'Hello, World!'
  },
  // 一个对象,包含组件的作用域插槽。
  scopedSlots: {
    default: () => h('h1', null, '我是标题1')
  },
  // 一个字符串或数组,表示组件的插槽内容
  slot: 'slot container',
  // 一个字符串或数字,表示组件的唯一标识符。
  key: 'unique-key',
  // 一个字符串,表示组件的引用标识符。
  ref: 'myComp',
  // 一个函数,返回组件实例的数据对象。
  data() {
    return {
      name: 'wft'
    }
  },
  // 一个对象,包含组件的指令。
  directives: [{ name: 'my-directive', value: 'Hello, World!' }],
  // 一个对象,包含组件的生命周期钩子。
  hooks: {
    created() {
      console.log('created!!')
    },
    mounted() {
      console.log('mounted!!')
    }
  },
  // 一个布尔值,表示是否将父组件的属性继承到子组件。
  inheritAttrs: true,
  // 一个字符串,表示组件的真实标签名。这在渲染组件时非常有用,因为它允许Vue跳过验证过程。
  is: 'my-component'
}, {
  default: () => h('p', null, '我是默认插槽')
});

我们在给子组件传递数据的时候,也就是父传子,一般写在props中, 其实也可以写在attrs中,如果写在attrs中,我们也可以在子组件中props中接受attrs中的变量,如果props中没写的变量都会在attrs中,我们在组件中通过this.$attrs中可以拿到。

下面是一个示例:

先使用render函数封装一个组件,注意写了render函数就不要写template了,不然render函数不起作用

@/components/BasicRender.vue

<script>
import { deepClone } from '@/utils'
export default {
  props: {
    tag: {
      type: String,
      default: 'div'
    },
    option: {
      type: Object,
      default: () => null
    },
    children: {
      type: [String, Array, Object],
      default: ''
    }
  },
  render(h) {
    const opt = deepClone(this.option)
    console.log(opt, 'opt-->.')
    return h(this.tag, opt, this.children)
  }
}
</script>

上面是一个vue组件,也可以写一个.js文件,写render函数,那么它也可以跟组件一样使用(注册使用):

@/components/Render.js

import { deepClone } from '@/utils'
export default {
  props: {
    tag: {
      type: String,
      default: 'div'
    },
    option: {
      type: Object,
      default: () => null
    },
    children: {
      type: [String, Array, Object],
      default: ''
    }
  },
  render(h) {
    const opt = deepClone(this.option)
    console.log(opt, 'opt  对象 obj -->.')
    return h(this.tag, opt, this.children)
  }
}

然后是main.vue,引入封装的render组件

 

<template>
  <div class="wft-main">
    <BasicRender
      :tag="tag"
      :option="option"
      :children="children"
    />
  </div>
</template>
<script>
// import BasicRender from '@/components/Render'
import BasicRender from '@/components/BasicRender'
export default {
  data() {
    return {
      // tag: 'div',
      // option: {
      //   id: 'WFT',
      //   class: 'wft',
      //   style: {
      //     border: '1px solid red',
      //     width: '350px',
      //     height: '350px',
      //     display: 'flex',
      //     justifyContent: 'center',
      //     alignItems: 'center'
      //   },
      //   onClick() {
      //     console.log('onClicked!!!')
      //   },
      //   attrs: {
      //     msg: '456 msg'
      //   }
      // },
      // children: '呵呵呵'

      tag: 'G1',
      option: {
        class: {
          'G1-class': true
        },
        style: {
          display: 'flex',
          flexDirection: 'column',
          justifyContent: 'center',
          alignItems: 'center'
        },
        props: {
          title: 'wwwfffttt',
          age: 18,
          info: {
            name: 'wft'
          }
        },
        attrs: {
          customData: {
            id: '0000',
            name: 'JAY'
          }
        },
        scopedSlots: {
          default: () => (<BasicRender tag={'h1'} children={'66611'} />),
          content: () => '我是content'
        }
      },
      children: {
        default: '666',
        content: '我是content插槽内容'
      }
    }
  },
  components: { BasicRender }
}
</script>
<style scoped>
.wft-main {
  width: 100%;
  height: 100%;
  display: flex;
  justify-content: center;
  align-items: center
}
</style>

这是加载组件G1,注意:我们加载的组件一定是引入、注册之后的,我这里全局注册了,

然后是G1组件:

<template>
  <div class="wft-w-h-100">
    <slot></slot>
    <h1>我是G1 全局组件</h1>
    <h3>{{ title }}--{{ age }}--{{ info }}</h3>
    <slot name="content"></slot>
  </div>
</template>
<script>
export default {
  data() {
    return {

    }
  },
  props: {
    customData: {
      type: Object,
      default: () => ({})
    },
    title: {
      type: String,
      default: ''
    },
    age: {
      type: Number,
      default: 0
    },
    info: {
      type: Object,
      default: () => ({})
    }
  }
}
</script>
<style scoped>
.wft-w-h-100 {
  width: 100%;
  height: 100%;
}
</style>

下面是运行的效果图:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Leetcdoe-Day19-代码随想录-栈与队列-1047-150

1047. 删除字符串中的所有相邻重复项 题目链接 题解&#xff1a;简单题&#xff0c;最后需要注意反转字符串即可。 class Solution { public:string removeDuplicates(string s) {stack<char> z;for(int i0;i<s.size();i){if(!z.empty()){int topz.top();if(tops[i]…

VTable导出当前页和导出所有页数据

表格导出的是当前显示的表格&#xff0c;如果是分页表格想导出全部的数据话。有两种方法可以实现 表格先显示的全量数据&#xff0c;导出后再恢复当前页。新建一个隐藏的表格实例显示全量数据导出这个隐藏的表格实例。 下面是全量代码&#xff1a; <template><div&…

使用North自部署图床服务

图床 图床可以把图片转为链接&#xff0c;从而方便我们书写、分享博客&#xff0c;目前图床主要分为以下几类: 利用 Git 仓库存储对象存储&#xff08;OSS、COS、七牛云等&#xff09;免费公共图床&#xff08;SM.MS、聚合图床、ImgTP、Postimage等&#xff09; 但上述图床都…

2024软件设计师笔记之考点版(一考就过):11-25

软件设计师之一考就过:成绩版 考点11:防火墙、入侵检测 真题1:(专家系统、模型检测、简单匹配)属于入侵检测;而漏洞扫描不属于。 真题2:防火墙特性包括(控制进出网络的数据包和数据流向、提供流量信息的日志和审计、隐藏内部IP以及网络结构细节),但不包括提供漏洞扫…

恋爱脑?No,爱情保镖还得靠AI!

本文由 ChatMoney团队出品 你是否曾经想过&#xff0c;为什么我们会在恋爱中变得如此“上头”&#xff0c;仿佛整个世界都围绕着那个TA旋转? 恋爱脑&#xff0c;通常是指一个人在恋爱中过度投入、过度依赖对方&#xff0c;甚至无法自拔的心理状态。 你会发现自己时时刻刻都在…

屏幕翻译下载哪个软件好?好用的屏幕翻译推荐

想象一下&#xff0c;当我们在阅读外文文档或是观看外语电影时&#xff0c;如果能有一款翻译工具同步提供译文&#xff0c;那将是多么令人愉悦的体验&#xff01; 如果这种翻译服务能够在不影响其他应用的情况下进行&#xff0c;那就是double快乐了。 其实&#xff0c;现在要…

分享一套基于SSM的美食推荐管理系统(源码+文档+部署)

大家好&#xff0c;今天给大家分享一套基于SSM的美食推荐管理系统 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringSpringMvcMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 博主介绍&#xff1a; 一名Java全栈工程师&#xff0c;专注于Jav…

各大广告商竞相厮杀下,诞生了一个偏门的副业方式

前段时间&#xff0c;想买摩托车&#xff0c;但是媳妇不让买&#xff0c;所以我打算偷偷买&#xff0c;然后萌生了去摆摊赚钱的想法&#xff0c;但是还没有实施就在网上接触到了“某赚”APP&#xff0c;于是一发不可收拾&#xff0c;用我的话来说&#xff0c;我做的不是副业&am…

腾讯云 轻量应用服务器 部署私有化大模型

1. 进入控制台后,找到我们购买的服务器,然后点击登录 服务器 - 轻量云 - 控制台 (tencent.com) 2. 安装系统 面板输入 curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sudo bash quick_start.sh 命令解释: 从F…

解密城市酷选为何异军突起!打造消费新潮流的排队免单模式

一、城市酷选平台简介 在数字化浪潮席卷全球的今天&#xff0c;城市酷选作为一个前沿的消费平台&#xff0c;凭借其独特的排队免单模式&#xff0c;成功吸引了众多消费者和商家的目光。该平台不仅整合了线上线下的资源&#xff0c;更通过数字化手段&#xff0c;为消费者提供了…

一文读懂RSTP流媒体传输原理

什么是流&#xff1f; 流&#xff08;Streaming&#xff09;&#xff1a;近年在Internet上出现的新概念&#xff0c;定义非常广泛&#xff0c;主要是指通过网络传输多媒体数据的技术总称。 流式传输分为两种&#xff1a;顺序流式传输 (Progressive Streaming)和实时流式传输 (R…

408数据结构-图的应用1-最小生成树 自学知识点整理

前置知识&#xff1a;图的遍历 图的应用是408初试历年考查的重点。不过一般而言&#xff0c;这部分内容直接以算法设计题形式考查的可能性极小&#xff0c;更多的是结合图的实例来考查算法的具体操作过程&#xff0c;要求掌握的是手推模拟给定图的各个算法执行过程。此外&#…

华为Pura70支持5G功能吗?看完你就清楚了

随着 5G 技术的普及&#xff0c;现在智能手机市场中的大部分新品都已经支持 5G 网络。相较于 4G&#xff0c;5G 不仅带来了更快的网速&#xff0c;更为用户带来了全新的使用体验。 然而&#xff0c;华为作为智能手机市场的佼佼者&#xff0c;其产品线中的部分手机在配置上却有…

程序运行包与源码的区别

在软件开发和信息技术领域&#xff0c;程序运行包&#xff08;Executable Package&#xff09;与源码&#xff08;Source Code&#xff09;是两个至关重要的概念。它们各自在软件开发、部署和维护过程中扮演着不同的角色&#xff0c;且有着显著的区别。本文旨在深入探讨程序运行…

数字图像分析(第二部分)

文章目录 第8章 图像分割图像分割定义阈值分割依赖像素的阈值选取Otsus方法依赖区域的阈值选取依赖坐标的阈值选取变化阈值法区域生长法分裂合并方法分水岭算法聚类分割算法K-meansAP算法Graph cut第9章 图像特征表达基于全局特征的图像表达直方图GIST基于局部特征的图像表达简…

【ppt技巧】有哪些方法可以实现?PPT转换为图片!

将ppt文件转换为图片都有哪些方法可以实现&#xff1f;其实很简单&#xff0c;一起来看一下如何操作吧&#xff01; 方法一&#xff1a; 使用格式转换器&#xff0c;有些文件格式转换器&#xff0c;支持ppt转换为图片。 方法二&#xff1a; 不需要转换器&#xff0c;直接在…

最长上升子序列模型——AcWing 272. 最长公共上升子序列

最长上升子序列模型 定义 给定一个序列&#xff0c;如整数序列或字符序列&#xff0c;最长上升子序列是指其中最长的子序列&#xff0c;满足子序列中的元素依次递增。最长上升子序列模型是一种在给定序列中寻找最长上升子序列的问题模型。 运用情况 该模型常用于解决与序列…

44岁过气港姐晚晚熬通宵开直播,情路坎坷生两胎老公身份成迷

曾经的「9料」港姐冠军杨思琦近年将工作重心转向内地&#xff0c;狠心抛下一儿一女在香港&#xff0c;只身一人定居广州靠当主播维持生计。 相信有不少网友都留意到&#xff0c;杨思琦几乎晚晚都通宵直播&#xff0c;睡觉前看她在卖力劲歌热舞与其他直播主PK赚钱&#xff0c;一…

jenkins环境搭建--关于jenkins在Ubuntu下的安装篇(一)

在ubuntu下使用命令进行下载安装包&#xff1a; 关于jenkins的安装有多种&#xff0c;可以借助docker容器进行安装&#xff0c;也可以通过传统方法手动一步步的进行安装&#xff0c;以下介绍手动一步步的安装方法&#xff0c;后续我们将解释关于jenkins的相关配置以及实战使用…

Linux系统中文件权限详解

一、Linux文件权限设计 Linux系统中任何内容都可以用文件表示&#xff0c;其对文件设计了一套权限进行管理&#xff1b;文件权限共有11个字符&#xff0c;从左向右共分为5段&#xff08;每段的具体说明如下表Linux权限设计说明所示&#xff09;&#xff1a; Linux权限设计说明 …