vue中的render函数、h()函数、函数式组件

这篇具有很好参考价值的文章主要介绍了vue中的render函数、h()函数、函数式组件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、什么是render

官网:用于编程式地创建组件虚拟 DOM 树的函数。

在我们使用webpack脚手架创建项目时,都能在main.js中看到一个render函数

import Vue from 'vue'
import App from './App.vue'

new Vue({
  render: h => h(App)
}).$mount('#app')

对于render函数 es6中写成了箭头函数 

es5写法:

render: function (createElement) {
    return createElement(App);
}

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

二、vue中的render

字符串模板的代替方案,允许你发挥 JavaScript 最大的编程能力。该渲染函数接收一个 createElement 方法作为第一个参数用来创建 VNode

如果组件是一个函数组件,渲染函数还会接收一个额外的 context 参数,为没有实例的函数组件提供上下文信息。

Vue 选项中的 render 函数若存在,则 Vue 构造函数不会从 template 选项或通过 el 选项指定的挂载元素中提取出的 HTML 模板编译渲染函数。

h()函数用法还是比较多的

// 除了类型必填以外,其他的参数都是可选的
h('div')
h('div', { id: 'foo' })

// attribute 和 property 都能在 prop 中书写
// Vue 会自动将它们分配到正确的位置
h('div', { class: 'bar', innerHTML: 'hello' })

// props modifiers such as .prop and .attr can be added
// with '.' and `^' prefixes respectively
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')])

得到的 vnode 为如下形式:

const vnode = h('div', { id: 'foo' }, [])

vnode.type // 'div'
vnode.props // { id: 'foo' }
vnode.children // []
vnode.key // null

当然我们常见的template的形式(Vue 的模板)实际上被编译成了渲染函数。

export default { 
    render (h) {
        const p = h('p', 'hi')
        return h('div', { class: 'red' }, [p, p])
      }
}

 

三、函数式组件

函数式组件是一种定义自身没有任何状态的组件的方式。它们很像纯函数:接收 props,返回 vnodes。函数式组件在渲染过程中不会创建组件实例 (也就是说,没有 this),也不会触发常规的组件生命周期钩子。

官网函数式组件格式:

当一个组件没有管理任何状态,也没有监听任何传递给它的状态,也没有生命周期方法。实际上,它只是一个接受一些 prop 的函数。在这样的场景下,我们可以将组件标记为 functional,这意味它无状态 (没有响应式数据),也没有实例 (没有 this 上下文)。一个函数式组件就像这样:

export default Vue.component('render-component', { // 该组件抽成js文件,
  functional: true,
  // 提供第二个参数作为上下文
  render: function (createElement, context) {
    return createElement('h1', '我是函数式子组件')
  }
})

组件需要的一切都是通过 context 参数传递,它是一个包括如下字段的对象:

  • props:提供所有 prop 的对象
  • children:VNode 子节点的数组
  • slots:一个函数,返回了包含所有插槽的对象
  • scopedSlots:(2.6.0+) 一个暴露传入的作用域插槽的对象。也以函数形式暴露普通插槽。
  • data:传递给组件的整个数据对象,作为 createElement 的第二个参数传入组件
  • parent:对父组件的引用
  • listeners:(2.3.0+) 一个包含了所有父组件为当前组件注册的事件监听器的对象。这是 data.on 的一个别名。
  • injections:(2.3.0+) 如果使用了 inject 选项,则该对象包含了应当被注入的 property。

函数式组件可以像普通组件一样被注册和使用。如果你将一个函数作为第一个参数传入 h,它将会被当作一个函数式组件来对待。
 

补充 h函数使用场景

button.vue

<script>
export default {
  props: {
    type: {
      type: String,
      default: 'normal'
    },
    text: {
      type: String,
      default: 'normal'
    },
    size: {
      type: String,
      default: 'medium'
    }
  },
  computed: {
    tag () {
      switch (this.type) {
        case 'success':
          return 1
        case 'danger':
          return 2
        case 'warning':
          return 3
        default:
          return 1
      }
    }
  },
  render (h) {
    return h('div', {
      class: {
        btn: true,
        buttom: 'name',
        'btn-success': this.type === 'success',
        'btn-danger': this.type === 'danger',
        'btn-warning': this.type === 'warning',
        'btn-mini': this.size === 'mini',
        'btn-small': this.size === 'small',
        'btn-medium': this.size === 'medium'
      },
      domProps: {
        innerText: this.text
      },
      on: {
        click: this.handleClick
      }
    })
  },
  methods: {
    handleClick () {
      console.log('button')
    }
  }
}
</script>

<style lang="less" scoped>
.buttom {
  padding: 10px 0;
  margin: 5px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 10px;
}

.buttom:hover {
  background: #c9c9c9;
}

.btn-success {
  background: #48ff8b;
  color: #fff;
}

.btn-danger {
  background: #ff4848;
  color: #fff;
}

.btn-warning {
  background: #ffbf48;
  color: #fff;
}

.btn-small {
  width: 120px;
  height: 20px;
}

.btn-medium {
  width: 120px;
  height: 30px;
}

.btn-mini {
  width: 120px;
  height: 10px;
}
</style>

使用文章来源地址https://www.toymoban.com/news/detail-709661.html

    <Button type="danger" text="名字" size="mini"></Button>
    <Button type="warning" text="名字" size="small"></Button>
    <Button type="success" text="名字" size="mini"></Button>
    <Button type="danger" text="名字" size="medium"></Button>
    <Button type="success" text="名字" size="mini"></Button>
    <Button type="warning" text="名字" size="medium"></Button>

到了这里,关于vue中的render函数、h()函数、函数式组件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JavaScript中的时间日期函数new Date()(JS中5种获取时间戳的函数)

    简介: JavaScript 中的 new Date() 方法用于创建一个新的 Date 对象,该对象表示当前日期和时间。Date 对象提供了许多方法和属性,可以用于获取和设置日期和时间信息。 new Date([year, month, day, hour, minute, second, millisecond]) 其中,每个参数都是可选的。如果没有指定参数,则 new Dat

    2024年02月04日
    浏览(73)
  • Vue.js 中的异步组件是什么?如何使用异步组件?

    在 Vue.js 中,异步组件是一种延迟加载组件的方式,可以大大提高应用程序的性能和加载速度。本文将介绍 Vue.js 中异步组件的概念、优势以及如何使用异步组件。 在传统的 Vue.js 开发中,组件是在应用程序启动时就立即加载的。这种方式虽然简单,但是会导致应用程序的初始

    2024年02月12日
    浏览(37)
  • vue render函数的使用场景

    render函数使用和详解_render函数如何使用-CSDN博客 上面链接写的很详细,有不懂的地方可以留言互相交流哈!~~~~~~

    2024年01月16日
    浏览(42)
  • Vue-33、Vue中为什么使用render函数

    1、main.js 2、查看引入vue 引入的dist/vue.runtime.esm.js 查看vue.runtime.esm.js 大小 此时引入的是残缺的Vue 无模板解析器。打包之后体积小一点。 而render: h = h(App), 可以进行模板解析。

    2024年01月23日
    浏览(39)
  • 前端笔记之vue3 之 render函数和createVNode函数使用

    初学vue3的时候倒是扒了一点点源码,似是而非,而且一直做的工作都是很简单的功能,怎么说呢,ui框架也几乎让我很容易的就可以写出一个成型的页面,有时就忘了初学的时候的一些心得。 本内容只说createVNode函数的用法,不做源码探究 效果图: 虽然在日常中这么写特别

    2024年02月07日
    浏览(47)
  • Vue3之ref取render形式组件jsx元素节点

    [2023 年 7 月 28 日 22:16:06] 一开始注意到组件 setup 和 render 一起使用的情况,好奇怎么通过 ref 取到 render 中 jsx 里的节点,一开始试了以下的尝试,结果是 undefined 的: 后来经过大佬指点,改成以下形式: render 这一步就很像 react 里 jsx 的写法了,react 里也有回调 ref,都是一样

    2024年02月15日
    浏览(44)
  • 我们在 Vue 3 中使用 setup 函数写组件,如何获取类似于 Vue 2 中的 this?

    Vue.js 是一个非常流行的前端框架,在 Web 前端开发中有着广泛的应用。在 Vue 2 中,我们通常使用 this 来引用当前组件实例(Component Instance),并通过它来访问组件的属性、方法和生命周期钩子等。而在 Vue 3 中,由于采用了新的 Composition API,this 的作用被一定程度上取代了。

    2024年02月05日
    浏览(90)
  • 看不懂来打我,vue3如何将template编译成render函数

    在之前的 通过debug搞清楚.vue文件怎么变成.js文件 文章中我们讲过了vue文件是如何编译成js文件,通过那篇文章我们知道了,template编译为render函数底层就是调用了 @vue/compiler-sfc 包暴露出来的 compileTemplate 函数。由于文章篇幅有限,我们没有去深入探索 compileTemplate 函数是如何

    2024年04月11日
    浏览(42)
  • vue组件库开发,webpack打包,发布npm

    做一个像elment-ui一样的vue组件库 那多好啊!这是我前几年就想做的 但webpack真的太难用,也许是我功力不够 今天看到一个视频,早上6-13点,终于实现了,呜呜 感谢视频的分享-来龙去脉-大家可以看这个视频:https://www.bilibili.com/video/BV1Zf4y1u75o?p=9vd_source=125d808bbbad2b8400f221b816a0

    2024年02月09日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包