Vue 渲染函数 JSX

 Vue 提供一个h()函数用于创建vnodes,用于渲染网页。

JSX是JS的一个类似XML的扩展,与h()函数类似,也是可以创建vnodes,用于渲染网页。

1 渲染函数 & JSX

1.1 渲染函数

组合式API,setup()钩子的返回值是用于暴露数据给模版,使用渲染函数时,可以直接把渲染函数返回,确保setup 返回是一个函数而不是一个值。这个函数的返回值可以是一个字符串、单个h(),或者有h()构成的数组。

setup(props, { slots,emit }) {return () => 'hello'
}return () => h('div','hello')
return () => [h('div','hello'),h('span','js')]

1.2 JSX

可以通过以下方式定义vnode:

const vnode = <div>hello</div>

在JSX表达式中,使用大括号来嵌套动态值:

export default defineComponent({setup(props,{ emit,slots }) {const count = ref(0)return () => <div><input value={props.modelValue} onInput={(event) => emit('update:modelValue',event.target?.value)}/></div>}
})

使用事件修饰符,可以使用withModifiers(事件处理器,[修饰符])函数。

使用自定义指令时,可以使用withDirectives(vnode,[[自定义指定]])。

// <div v-show-element:top.animate="200">hello</div>
withDirectives(h('div','hello'),[[showElement,200,'top', { animate: true }]])// <div @onClick.self='() => {}'>hello</div>
h('div', {onClick: withModifiers(() => {}, ['self'])
},'hello')

1.2.1 插槽

插槽可以通过setup(props,{ slots })的上下文来访问。每个slots对象中的插槽都是一个返回vnodes数组的函数。

传递插槽需要传递一个插槽函数或者一个包含插槽函数的对象。插槽函数的返回值同一个正常渲染函数的返回值一样。

作用域插槽,在子组件通过slots对象放回插槽的函数传递具体的值,父组件则在定义插槽函数时,使用这个函数的变量来获取从子组件传递过来的值。

// JSXView.tsx 子组件
export default defineComponent({setup(props,{ emit,slots }) {const count = ref(0)return () => <div><h2>JSXView</h2>{ slots && slots.default ? <div><h3>default</h3><div>{ slots.default() }</div></div> : ''}{slots && slots.footer ? <div><h3>footer</h3><div>{ slots.footer(count) }</div></div> : ''}</div>}
})// 父组件
export default defineComponent({setup(props, ctx) {const text = ref('haha')return () => withDirectives((<div><JSXView>{{default: () => <h3>jsx Show Default: { text.value }</h3>,footer: (count: Ref<number>) => <h3 onClick={ () => count.value++ }>jsx Show Footer { count.value }</h3>}}</JSXView></div>),[[showElement]])}
})
// 子组件
export default {setup(props, { slots,emit }) {const count = ref(0)return () => h('div',[h('h2','VNodeView'),slots && slots.default ? h('div',[h('h3','default'),h('div',slots.default())]) : '',slots && slots.footer ? h('div',[h('h3',"footer"),h('div','传递给父组件的值:' + count.value),h('div',slots?.footer(count))]) : ''])},
}// 父组件
export default {setup(props, ctx) {const text = ref('hi')return () => withDirectives(h(VNodeView,null,{default: () => h('h3','vNode Show Default,值' + text.value),footer: (count:Ref<number>) => h('h3',{onClick: () => { count.value++ }},'vNode Show Footer,count:' + count.value),}),[[showElement]])},
}

1.2.2 v-model

v-model 指令扩展为modelValue 和onUpdate:modelValue,在模版编译过程中,我们需要提供这些props。

// 子组件
export default defineComponent({props: ['modelValue'],emits: ['update:modelValue'],setup(props,{ emit,slots }) {const count = ref(0)return () => <div><input value={props.modelValue} onInput={(event) => emit('update:modelValue',event.target?.value)}/></div>}
})// 父组件
export default defineComponent({setup(props, ctx) {const text = ref('haha')return () => <div><JSXView onUpdate:modelValue={(val) => text.value = val} modelValue={ text.value } /></div>}
})

1.3 函数式组件

函数式组件是一种定义自身没有任何状态的组件方式。是一个纯函数,接收props及上下文(与setup()钩子相同),返回vnodes。

props和emits通过为函数添加对应的属性来声明它们:

function MyComponent(props) {}
MyComponent.props = [‘length’]
MyComoonetn.emits = [‘click’]

如果这个props选项没有被定义,那么被传入函数的props对象就会像attrs一样包含所有attribute。

export default function FunctionView(props,{ slots, emit, attrs }) {return <div>Hello FunctionView</div>
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/50203.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国防科技大学深圳地区新生欢送会圆满举行

2024年7月28日&#xff0c;第97个八一建军节来临之际&#xff0c;在这个充满希望的盛夏时节&#xff0c;深圳地区迎来了13名即将踏入国防科技大学的优秀学子。 为了庆祝这一荣耀时刻&#xff0c;并表达对新生的深切祝福&#xff0c;在国防科技大学深圳校友会黄丹会长的积极倡议…

书生大模型实战营--L1关卡-Llamaindex RAG实践

一、安装llamaindex库 pip install llama-index pip install llama-index-embeddings-huggingface 二、问2024年巴黎奥运会 中国队获得几枚金牌&#xff0c;无法回答该问题 三、构建Llamaindex RAG 1、初始化llm 2、构建词向量模型 下载模型&#xff1a;git clone https://…

基于k8s快速搭建docker镜像服务的demo

基于k8s快速搭建docker镜像服务的demo 一、环境准备 如标题&#xff0c;你需要环境中有和2个平台&#xff0c;并且服务器上也已经安装好docker服务 接下来我来构建一个docker镜像&#xff0c;然后使用harbork8s来快速部署服务demo 二、部署概述 使用docker构建镜像&#x…

【学习笔记】Redis学习笔记——第17章 集群

第17章 集群 17.1 节点 使用cluster meet命令将其他节点添加到当前节点集群中 17.1.1 启动节点 通过cluster-enabled设置来决定是否启用集群 17.1.2 集群数据结构 每个节点都保存了自己及其他节点的IP端口号等信息 17.1.3 cluster meet命令的实现 是收到命令的节点和新…

flatpak vscode

解决集成终端无法使用主机命令和字体的问题 Shift Ctrl P&#xff1a;搜索user set&#xff0c;点击带JSON的&#xff0c;把这些加进去 {"terminal.integrated.defaultProfile.linux": "bash","terminal.integrated.profiles.linux": {"…

(2024,通用逼近定理(UAT),函数逼近,Kolmogorov–Arnold定理(KAT),任意深度/宽度的网络逼近)综述

A Survey on Universal Approximation Theorems 公和众与号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 1. 简介 2. 神经网络&#xff08;NN&#xff09; 3. 通用逼近定理&#xff0…

我的NAS是怎么连接Amazon Web Services S3的

作为IT爱好者&#xff0c;很多家庭都配备了Network Attached Storage&#xff08;NAS&#xff09;&#xff0c;用于存储和管理大量数据。一个常见的挑战是如何实现异地备份&#xff0c;以确保数据的安全性和可恢复性。以下是一些解决方案和工具&#xff0c;可以帮助用户有效地管…

“手撕”MySQL的索引

目录 二、索引的作用 三、索引的缺点 四、如何使用索引 查看索引&#xff1a; 创建索引&#xff1a; ​编辑 删除索引&#xff1a; 五、索引的底层原理 那什么是B树&#xff0c;什么是B树呢&#xff1f; B树的好处&#xff1a; 总结&#xff1a; 一、什么是索引 索…

C语言的周末小练习(贰)

周末小练习&#xff1a; 5、输入身高和体重&#xff0c;计算BMI指数(BMI w/(h*h))。 #include <stdio.h>int main() {float w,h,BMI;/*printf("请输入体重\n");scanf("%f",&w);printf("请输入身高\n");scanf("%f",&h…

vue3 快速入门 (五) : Flex布局

1. 如何变成Flex布局 变成Flex容器&#xff0c;只需在容器布局的节点的CSS中&#xff0c;增加display : flex .mylayout {/* 省略了其他代码 */display: flex; }2. flex direction : 方向 row : 以行排列 row-reverse &#xff1a; 以行反向排列 column &#xff1a;以列排列…

Matlab编程资源库(11)多项式计算

一、多项式的四则运算 1&#xff0e;多项式的加减运算 2&#xff0e;多项式乘法运算 函数conv(P1,P2)用于求多项式P1和P2的乘积。 这里&#xff0c;P1、P2是两个多项式系数向量。 3&#xff0e;多项式除法 函数[Q,r]deconv(P1,P2)用于对多项式P1和P2作除法运算。其中Q返回多项…

Hive第四天

3.HIVE 调优&#xff1a; 需要调优的几个方面&#xff1a; 1.HIVE语句执行不了 2.HIVE查询语句&#xff0c;在集群中执行时&#xff0c;数据无法落地 HIVE执行时&#xff0c;一开始语句检查没有问题&#xff0c;生成了多个JOB&#xff0c; …

【前端 09】JavaScript中的对象与JSON

JavaScript中的对象与JSON 在JavaScript中&#xff0c;对象和JSON&#xff08;JavaScript Object Notation&#xff09;是两个紧密相连但又有区别的概念。它们都在数据处理和交换中扮演着重要角色。本文将详细讲解JavaScript中的自定义对象以及JSON对象的基本概念、格式、用法…

基于微信小程序+SpringBoot+Vue的教务管理系统(带1w+文档)

基于微信小程序SpringBootVue的教务管理系统(带1w文档) 基于微信小程序SpringBootVue的教务管理系统(带1w文档) 在目前的情况下&#xff0c;可以引进一款基于web的高校教务管理系统这样的现代化管理工具&#xff0c;这个工具就是解决上述问题的最好的解决方案。它不仅可以实时完…

python拼接字符串方法

文章目录 1. 使用加号&#xff08;&#xff09;2. 使用str.join()方法3. 使用格式化字符串&#xff08;f-strings, % 操作符, .format() 方法&#xff09;4. 使用列表推导式和join()结合 性能对比 在Python中&#xff0c;字符串拼接是将两个或多个字符串合并成一个新字符串的过…

AJAX(3)——请求方法

请求方法 请求方法&#xff1a;对服务器资源&#xff0c;要执行的操作 请求方法操作GET获取数据POST提交数据PUT修改数据&#xff08;全部&#xff09;DELETE删除数据PATCH修改数据&#xff08;部分&#xff09; 数据提交 当数据需要在服务器上保存 axios请求配置 URL&…

IPython的SVG展示台:%%svg命令全解析

IPython的SVG展示台&#xff1a;%%svg命令全解析 在IPython和Jupyter Notebook中&#xff0c;%%svg是一个魔术命令&#xff0c;它允许用户直接在Notebook中嵌入和显示SVG&#xff08;Scalable Vector Graphics&#xff09;图像。SVG是一种基于XML的矢量图形格式&#xff0c;非…

EasyUI 的 DataGrid 插件,通过扩展属性的方式给序号列增加个性化标题

在 EasyUI 的 DataGrid 中&#xff0c;没有直接的属性可以设置行号列的标题&#xff0c;但是你可以通过扩展的方法来实现这一功能。通过扩展 EasyUI 的 DataGrid 插件&#xff0c;来增加一个 ​​rownumberTitle​​ 属性&#xff0c;以便通过属性来设置行号列的标题。 以下是…

生成RSA公钥的n值

简介&#xff1a;RSA算法是一种非对称加密算法&#xff0c;与对称加密算法不同的是,RSA算法有两个不同的密钥,一个是公钥,一个是私钥。 原理是&#xff1a;根据数论&#xff0c;寻求两个大素数比较简单&#xff0c;而将它们的乘积进行因式分解却极其困难&#xff0c;因此可以将…

速盾:CDN是什么?CDN的原理和作用是什么?

随着互联网的飞速发展&#xff0c;越来越多的网站和应用程序需要处理大量的数据和用户请求。在面临高并发流量和网络延迟的情况下&#xff0c;为了提供更快、更稳定的网站访问体验&#xff0c;CDN&#xff08;Content Delivery Network&#xff0c;内容分发网络&#xff09;应运…