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

目录
  • render函数里定义插槽和使用插槽
    • 定义插槽
    • 定义有插槽的组件使用插槽
  • vue3 render函数小变动
    • render函数的参数
    • render函数签名
    • VNode属性格式

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(目前还没有中文版)

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

(0)

相关推荐

  • vue2从template到render模板编译入口详解

    目录 正文 1.template:模板获取 2.createCompiler:核心参数 3.createCompileToFunctionFn:缓存处理 4.compile:参数合并 小结 正文 在vue的渲染过程中,渲染核心逻辑是vm._update(vm._render(), hydrating),通过vm._render的执行获取到vNode,再通过vm._update的执行来将vNode渲染成真实视图. 其中,render函数的来源是: (1)用户手写: (2)通过vue-loader引

  • vue中template模板编译的过程全面剖析

    目录 简述过程 vue的渲染过程 parse parse过程总结 generate生成render函数 简述过程 vue template模板编译的过程经过parse()生成ast(抽象语法树),optimize对静态节点优化,generate()生成render字符串 之后调用new Watcher()函数,用来监听数据的变化,render 函数就是数据监听的回调所调用的,其结果便是重新生成 vnode. 当这个 render 函数字符串在第一次 mount.或者绑定的数据更新的时候,都会被调

  • 关于vue-admin-template模板连接后端改造登录功能

    首先修改统一请求路径为我们自己的登陆接口,在.env.development文件中 # base api VUE_APP_BASE_API = 'http://localhost:8081/api/dsxs/company' 打开登陆页面,src/views/login/index.vue <template> <div class="login-container"> <el-form ref="loginForm" :model=&

  • 详解vue中v-for和v-if一起使用的替代方法template

    目录 版本 目标效果 说明 解决方法 核心代码片段 Car.vue vue中v-for和v-if一起使用的替代方法template 版本 vue 2.9.6element-ui: 2.15.6 目标效果 说明 在 vue 2.x 中,在一个元素上同时使用 v-if 和 v-for 时,v-for 会优先作用 解决方法 选择性地渲染列表,例如根据某个特定属性(category )来决定不同展示渲染,使用计算属性computed 见https://www.jb51.net/article/24717

  • vue-admin-template解决登录和跨域问题解决

    目录 一.下载安装项目 二.修改登录访问地址 三.解决跨域问题 一.下载安装项目 git地址:https://github.com/PanJiaChen/vue-admin-template.git 二.修改登录访问地址 找到 .env.develpment文件 # just a flag ENV = 'development' # base api # VUE_APP_BASE_API = '/dev-api' VUE_APP_BASE_API = 'http://localhost:9001

  • 深入了解Vue3模板编译原理

    目录 Parse Transform cacheHandlers hoistStatic prefixIdentifiers PatchFlags hoists type 变化 Codegen 代码生成模式 静态节点 帮助函数 helpers helpers 是怎么使用的呢? 如何生成代码? Vue 的编译模块包含 4 个目录: compiler-core compiler-dom // 浏览器 compiler-sfc // 单文件组件 compiler-ssr // 服务端渲染 其中 com

  • VUE render函数使用和详解

    目录 前言 render的作用 render函数讲解 render和template的区别 render举例 总结 前言 在平时编程时,大部分是通过template来创建html.但是在一些特殊的情况下,使用template方式时,就无法很好的满足需求,在这个时候就需要 通过JavaScript 的编程能力来进行操作.此时,就到了render函数展示拳脚去时候了. render的作用 官网示例入口 在官网的这里示例中,使用组件,将相同的内容通过solt放进h1-h6的标签中,在使用传统方式时,代

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

    目录 render函数里定义插槽和使用插槽 定义插槽 定义有插槽的组件使用插槽 vue3 render函数小变动 render函数的参数 render函数签名 VNode属性格式 render函数里定义插槽和使用插槽 vue3中this.slots和vue2的区别 vue3:this.slots是一个{ [name: string]: (…args: any[]) => Array | undefined }的对象,每个具名插槽的内容都要通过函数调用.如v-slot:foo插槽分发的内容通过th

  • vue2.x中h函数(createElement)与vue3中的h函数详解

    目录 1. vue2.x的 h 函数(createElement) 2. vue3 h函数配置项 2.1 v-model实现(以下开始为官网实现) 2.2 v-on 2.3 事件修饰符 2.4 插槽 2.5 component 和 is 2.6 自定义指令 2.7 内置组件 2.8 渲染函数的返回值 2.9 JSX 总结 1. vue2.x的 h 函数(createElement) 使用方法及介绍:(参考官网提取) h函数第一个是标签名字 或者是组件名字,第二个参数是配置项,第三个参数是 inn

  • 浅析Vue 中的 render 函数

    render函数是什么 简单的说,在vue中我们使用模板HTML语法组建页面的,使用render函数我们可以用js语言来构建DOM 因为vue是虚拟DOM,所以在拿到template模板时也要转译成VNode的函数,而用render函数构建DOM,vue就免去了转译的过程. 当使用render函数描述虚拟DOM时,vue提供一个函数,这个函数是就构建虚拟DOM所需要的工具.官网上给他起了个名字叫createElement.还有约定的简写叫h, vm中有一个方法_c,也是这个函数的别名 先看官网对

  • 在vue中通过render函数给子组件设置ref操作

    正常我们的写法是,这样ref不会生效,h是作用在渲染的时候的,而ref是渲染之后才创建的,因此在h函数中使用ref是无效的. render: (h, params) => { return h(expandRow, { ref:'child', props: { row: params.row } }) } 我们常见h函数的用法是: render: (h) => { return h(ele) } => 是es6的用法,相当于 (h) => {} 相当于 function(){},

  • vue 中的 render 函数作用详解

    render 函数作用 vue渲染函数文档第一遍看的晕晕乎乎的,再看看写写终于清晰了.建议配合文档阅读,本文也是根据文档加上自己的理解. 注:本文代码都是在单文件组件中编写.代码地址 render 函数作用 render 函数 跟 template 一样都是创建 html 模板的,但是有些场景中用 template 实现起来代码冗长繁琐而且有大量重复,这时候就可以用 render 函数. 官网例子:子组件想要根据父组件传递的 level 值(1-6)来决定渲染标签 h 几.具体代码可以看文档.

  • Vue2.x中的Render函数详解

    Render函数是Vue2.x版本新增的一个函数:使用虚拟dom来渲染节点提升性能,因为它是基于JavaScript计算.通过使用createElement(h)来创建dom节点.createElement是render的核心方法.其Vue编译的时候会把template里面的节点解析成虚拟dom: 什么是虚拟dom? 虚拟dom不同于真正的dom,它是一个JavaScript对象.当状态发生变化的时候虚拟dom会进行一个diff判断/运算:然后判断哪些dom是需要被替换的而不是全部重绘,所以性能

  • vue3 中的toRef函数和toRefs函数的基本使用

    目录 这篇我们看下toRef和toRefs的基本使用 Vue3的toRef 这篇我们看下toRef和toRefs的基本使用 我们知道ref可以用于创建一个响应式数据,而toRef也可以创建一个响应式数据,那他们之间有什么区别呢?事实上,如果利用ref函数将某个对象中的属性变成响应式数据,修改响应式数据是不会影响到原始数据. import {ref} from 'vue'; export default { name:'App' setup(){ let obj = {name : 'alice'

  • vue3中的reactive函数声明数组方式

    目录 reacitve函数如何声明一个响应式数组 解决办法 使用reactive包裹数组赋值 需求 代码 reacitve函数如何声明一个响应式数组 如以下案例 <template>   <div>       <div v-for="item in arr" :key="item">            {{item}}       </div>         <button @click="ch

  • 何时/使用 Vue3 render 函数的教程详解

    什么是 DOM? 如果我们把这个 HTML 加载到浏览器中,浏览器创建这些节点,用来显示网页.所以这个HTML映射到一系列DOM节点,然后我们可以使用JavaScript进行操作.例如: let item = document.getElementByTagName('h1')[0] item.textContent = "New Heading" VDOM 网页可以有很多DOM节点,这意味着DOM树可以有数千个节点.这就是为什么我们有像Vue这样的框架,帮我们干这些重活儿,并进行大量

  • Vue中为什么要引入render函数的实现

    目录 前言 背景 原理 后记 前言 使用Vue脚手架创建项目的入口文件main.js中,默认代码如下: import Vue from 'vue' import App from './App.vue' Vue.config.productionTip = false new Vue({ render: h => h(App), }).$mount('#app') 可以看到,代码中通过import引入了App组件,但是却并没有通过components注册,还使用了一个render函数,而没有利用

随机推荐