详解vue3中渲染函数的非兼容变更

 更新时间:2021年03月10日 10:15:44   作者:月岛蘑菇  
这篇文章主要介绍了详解vue3中渲染函数的非兼容变更,帮助大家更好的理解和学习使用vue框架,感兴趣的朋友可以了解下

渲染函数API变更

此更改不会影响到<template>用户

  • h现在全局导入,而非作为参数传递给渲染函数
  • 渲染函数参数更改为在有状态组件和函数组件之间更加一致
  • vnode现在又一个扁平的prop结构

Render函数参数

// 2.0 渲染函数
export default {
 render(h) {
  return h('div')
 }
}

// 3.x语法
export default {
 render() {
  return h('div')
 }
}

渲染函数签名更改

// 2.x
export default {
 render(h) {
  return h('div')
 }
}

// 3.x
import { h, reactive } from 'vue'
export default {
 setup(prop, {slots, attrs, emit}) {
  const state = reactive({
   count: 0
  })
  function increment() {
   state.count++
  }
  // 返回render函数
  return () => h(
   'div',
   {
    onClick: increment
   },
   state.count
  )
 }
}

VNode Props 格式化

// 2.x
{
 class: ['button', 'is-outlined'],
 style: {color: '#fffff'},
 attr: {id: 'submit'},
 domProps: {innerHTML: ''},
 on: {click: submitForm},
 key: 'submit-button'
}
// 3.x VNode的结构是扁平的
{
 class: ['button', 'is-outlined'],
 style: { color: '#34495E' },
 id: 'submit',
 innerHTML: '',
 onClick: submitForm,
 key: 'submit-button'
}

slot统一

更改了普通slot和作用域slot

  • this.$slots现在将slots作为函数公开
  • 移除this.$scopedSlots
// 2.x
h(LayoutComponent, [
 h('div', {slot: 'header'}, this.header),
 h('div', {slot: 'header'}, this.header)
])
// 作用域slot:


// 3.x
h(LayoutComponent, {}, {
 header: () => h('div', this.header),
 content: () => h('div', this.content)
})
// 需要以编程方式引入作用域slot时,他们现在被统一在了$slots选项中
// 2.x的作用域slot
this.$scopedSlots.header
// 3.x的写法
this.$slots.header

移除$listeners

$listeners对象在vue3中已经移除,现在事件监听器是$attrs的一部分

在vue2中,可以使用this.attrs和this.attrs和this.listeners分别访问传递给组件的attribute和时间监听器,结合inheritAttrs: false,开发者可以将这些attribute和监听器应用到其他元素,而不是根元素

<template>
<label>
 <input type="text" v-bind="$attrs" v-on="$listeners">
</label>
</template>
<script>
 export default {
  inheritAttrs: false
 }
</script>

在vue的虚拟DOM中,事件监听器现在只是以on为前缀的attribute,这样就成了attrs对象的一部分,这样attrs对象的一部分,这样listeners就被移除了

<template>
 <label>
  <input type="text" v-bind="$attrs" />
 </label>
</template>
<script>
export default {
 inheritAttrs: false
}
// 如果这个组件接收一个 id attribute 和一个 v-on:close 监听器,那么 $attrs 对象现在将如下所示
{
 id: 'my-input',
 onClose: () => console.log('close Event Triggered')
}
</script>

$attrs现在包括class和style

现在的$attr包含所有的attribute,包括class和style

在2.x中,虚拟dom会对class和style进行特殊处理,所以他们不包括在$attr中
在使用inheritAttr: false的时候会产生副作用

  • $attrs 中的 attribute 不再自动添加到根元素中,而是由开发者决定在哪添加。
  • 但是 class 和 style 不属于 $attrs,仍然会应用到组件的根元素:
<template>
 <label>
  <input type="text" v-bind="$attrs" />
 </label>
</template>
<script>
export default {
 inheritAttrs: false
}
</script>
<!-- 写入 -->
<my-component id="my-id" class="my-class"></my-component>
<!-- vue2 将生成 -->
<label class="my-class">
 <input type="text" id="my-id" />
</label>
<!-- vue3 将生成 -->
<label>
 <input type="text" id="my-id" class="my-class" />
</label>

以上就是详解vue3中渲染函数的非兼容变更的详细内容,更多关于vue 渲染函数非兼容变更的资料请关注脚本之家其它相关文章!

相关文章

  • Vue.js实现简单计时器应用

    Vue.js实现简单计时器应用

    这篇文章主要为大家详细介绍了Vue.js实现简单计时器应用,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-09-09
  • Vue3实现通过axios来读取本地json文件

    Vue3实现通过axios来读取本地json文件

    这篇文章主要介绍了Vue3实现通过axios来读取本地json文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • 富文本编辑器quill.js 开发之自定义插件示例详解

    富文本编辑器quill.js 开发之自定义插件示例详解

    这篇文章主要为大家介绍了富文本编辑器quill.js 开发之自定义插件示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • vue实现高德地图添加多个点标记

    vue实现高德地图添加多个点标记

    地图多点标注其实是个非常简单的问题,这篇文章主要给大家介绍了关于vue实现高德地图添加多个点标记的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • vue 点击按钮增加一行的方法

    vue 点击按钮增加一行的方法

    今天小编就为大家分享一篇vue 点击按钮增加一行的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • Vue项目中打包优化的四种方法详解

    Vue项目中打包优化的四种方法详解

    最近入职了新公司,接手了一个新拆分出来的Vue项目,针对该项目做了个打包优化,下面这篇文章主要给大家介绍了关于Vue项目中打包优化的四种方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • vue.js 输入框输入值自动过滤特殊字符替换中问标点操作

    vue.js 输入框输入值自动过滤特殊字符替换中问标点操作

    这篇文章主要介绍了vue.js 输入框输入值自动过滤特殊字符替换中问标点操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • vue处理emoji表情占位符的操作方法

    vue处理emoji表情占位符的操作方法

    在计算字符数时,一般情况下,英文字符、数字和大部分符号都可以被视为占一个字符长度,因为它们是单个字节,然而,对于某些特殊字符,如表情符号和部分非英文字符,会被认为占据了多个字符长度,本文给介绍了vue处理emoji表情占位符的操作方法,需要的朋友可以参考下
    2024-06-06
  • Vue 购物车案例练习

    Vue 购物车案例练习

    这篇文章主要给大家分享关于Vue 购物车案例的小练习,文章个悲剧购物车为标题需求利用HTML代码实现整个过程,需要的朋友可以参考一下文章的具体内容
    2021-10-10
  • vue实现简单无缝滚动效果

    vue实现简单无缝滚动效果

    这篇文章主要为大家详细介绍了vue实现简单无缝滚动效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04

最新评论