vue3中的render函数里定义插槽和使用插槽

 更新时间:2022年07月02日 10:59:35   作者:qq_42372534  
这篇文章主要介绍了vue3中的render函数里定义插槽和使用插槽方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

render函数里定义插槽和使用插槽

vue3中this.slots和vue2的区别

vue3:this.slots是一个{ [name: string]: (…args: any[]) => Array | undefined }的对象,每个具名插槽的内容都要通过函数调用。如v-slot:foo插槽分发的内容通过this.slots.foo( )返回

vue2:this.slots是一个{ [name: string]: ?Array }的对象,v-slot:foo的内容通过this.slots.foo来访问 , 而this.scopedSlots才是和vue3里的this.$slots作用一样.

定义插槽

this.$slots.[插槽名] 这个一个返回VNode数组的函数,用于访问静态插槽内容.

const BlogPost = defineComponent({
  render(){
    return h('div', [
      h('h1',this.$slots.header&&this.$slots.header()||'默认header插槽'),
      h('p',this.$slots.default&&this.$slots.default({message:'我是作用域插槽的message'})||'默认default插槽'),
      h('h4',this.$slots.footer&&this.$slots.footer()||'默认footer插槽'),
    ])
  }
})
// 以上代码相当于以下的template
<template>
	<div>
		<h1>
			<slot name="header">默认header插槽</slot>
		</h1>
		<p>
			<slot>默认default插槽</slot>
		</p>
		<h4>
			<slot name="footer">默认footer插槽</slot>
		</h4>
	</div>
</template>

定义有插槽的组件使用插槽

在h函数的第三个参数中使用{ [name: string]: (…args: any[]) => Array | undefined }形式的对象来定义组件的具体插槽内容

const BlogPostWrapper = defineComponent({
  render(){
    return h('div',
             {style:'background:skyblue'},
             h(
                  BlogPost,
                   null,
                   {
                  header(props){
                    return '我是传进的header插槽内容'
                  },
                    default(props){
                    // 这里的props就是作用域插槽的插槽prop
                    return 'BlogPostWrapper的default插槽内容::>>'+props.message
                  },
                  footer(props){
                    return '我是传进的footer插槽内容'
                  }
                }
            )
          )
      }
})
// 相当于template
<template>
    <div>
        <BlogPost>
            <tempalte #header>'我是传进的header插槽内容'</tempalte>
            <tempalte #default="props">
                {{'BlogPostWrapper的default插槽内容::>>'+props.message}}
            </tempalte>
            <tempalte #footer>我是传进的footer插槽内容</tempalte>
        </BlogPost>
    </div>
</template>

vue3 render函数小变动

Render function API?是不是感觉有点陌生?那恭喜你,这个改动不会对你这位 <template> 用户造成影响。

老规矩,上帝视角看一下:

  • h需要从全局导入进来(不再是 render 函数的参数了)
  • render函数的参数改变了(为了在常规组件和函数组件中表现一致)
  • VNodes具备了扁平的属性结构

render函数的参数

2.x 这么写

在 Vue 2.x 的版本中,render 函数会以参数的形式自动接收 h 函数(aka:createElement):

export default {
    render(h) {
        return h('div');
    }
}

3.x 应该这么写

在即将到来的 Vue 3.x 版本中,h 函数需要手动从全局引入进来:

import { h } from 'vue';
 
export default {
    render() {
        return h('div');
    }
}

render函数签名

2.x 这么写

上面也提到了,2.x 的 render 函数会自动接收 h 作为参数:

export default {
    render(h) {
        return h('div');
    }
}

3.x 应该这么写

在 3.x 版本中,render 函数不再接收任何参数了,它仅存的主要作用就是在 setup 函数中使用。这样方便获取作用域链中的响应式状态以及各种函数,当然了,也方便获取任何传递给 setup 函数的参数。

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

VNode属性格式

2.x 是这样的

domProps 是 VNode 属性中的一个“嵌套列表”:

{
    class: ['button', 'confirm-button'],
    style: { color: 'red' },
    attrs: { id: 'confirm' },
    domProps: { innerHTML: '' },
    on: { click: confirmCreate },
    key: 'submit-button',
}

3.x 中则是这样的

在 3.x 版本中,VNode 的所有属性都已经实现了“扁平化”的处理:

{
    class: ['button', 'confirm-button'],
    style: { color: 'red' },
    id: 'submit',
    innerHTML: '',
    onClick: confirmCreate,
    key: 'submit-button',
}

其实我也很少用 render 函数,毕竟 template 还是蛮香的。

如果想要获得更多的详细信息,请去这里:v3.vuejs.org/guide/migration/render-function-api.html(目前还没有中文版)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • vue响应式原理与双向数据的深入解析

    vue响应式原理与双向数据的深入解析

    Vue 最独特的特性之一,是其非侵入性的响应式系统。下面这篇文章主要给大家介绍了关于vue响应式原理与双向数据的相关资料,需要的朋友可以参考下
    2021-06-06
  • Vue中forEach()的使用方法例子

    Vue中forEach()的使用方法例子

    这篇文章主要给大家介绍了关于Vue中forEach()使用方法的相关资料,forEach和map是数组的两个方法,作用都是遍历数组,在vue项目的处理数据中经常会用到,需要的朋友可以参考下
    2023-09-09
  • vue如何获取光标位置

    vue如何获取光标位置

    这篇文章主要介绍了vue获取光标位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • 基于vue实现多引擎搜索及关键字提示

    基于vue实现多引擎搜索及关键字提示

    这篇文章主要为大家详细介绍了基于vue实现多引擎搜索及关键字提示的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • vuex的module模块用法示例

    vuex的module模块用法示例

    这篇文章主要介绍了vuex的module模块用法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • axios 发 post 请求,后端接收不到参数的完美解决方案

    axios 发 post 请求,后端接收不到参数的完美解决方案

    这篇文章主要介绍了axios 发 post 请求,后端接收不到参数的解决方案,场景很简单,就是一个正常 axios post 请求,本文给大家分享问题原因分析及解决方案需要的朋友可以参考下
    2022-12-12
  • vue3+ts 依赖注入provide inject的用法

    vue3+ts 依赖注入provide inject的用法

    vue3中引入新的组件传值方式,就是provide/inject依赖注入模式,本文主要介绍了vue3+ts 依赖注入provide inject的用法,感兴趣的可以了解一下
    2023-11-11
  • vue父组件与子组件之间的数据交互方式详解

    vue父组件与子组件之间的数据交互方式详解

    最近一直在做一个vue移动端商城的实战,期间遇到一个小小的问题,值得一说,下面这篇文章主要给大家介绍了关于vue父组件与子组件之间数据交互的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • vue element-ui读取pdf文件的方法

    vue element-ui读取pdf文件的方法

    这篇文章主要介绍了vue element-ui读取pdf文件的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • Vue实现登陆跳转

    Vue实现登陆跳转

    这篇文章主要为大家详细介绍了Vue实现登陆跳转,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07

最新评论