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

2022-04-15 0 682
目录
  • 渲染函数API变更
    • Render函数参数 
    • 渲染函数签名更改
    • VNode Props 格式化
  • slot统一
    • 移除$listeners
      • $attrs现在包括class和style

        渲染函数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 渲染函数非兼容变更的资料请关注NICE源码其它相关文章!

        免责声明:
        1、本网站所有发布的源码、软件和资料均为收集各大资源网站整理而来;仅限用于学习和研究目的,您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。 不得使用于非法商业用途,不得违反国家法律。否则后果自负!

        2、本站信息来自网络,版权争议与本站无关。一切关于该资源商业行为与www.niceym.com无关。
        如果您喜欢该程序,请支持正版源码、软件,购买注册,得到更好的正版服务。
        如有侵犯你版权的,请邮件与我们联系处理(邮箱:skknet@qq.com),本站将立即改正。

        NICE源码网 JavaScript 详解vue3中渲染函数的非兼容变更 https://www.niceym.com/32108.html