Vue3函数式编程

2023-09-19 04:13:08


前言

本文主要记录vue3中的函数式编程以及其他编程风格的简介


一、三种编程风格

1.template

Vue 使用一种基于 HTML 的模板语法,使我们能够声明式地将其组件实例的数据绑定到呈现的 DOM 上。所有的 Vue 模板都是语法层面合法的 HTML,可以被符合规范的浏览器和 HTML 解析器解析。
也就是HTML的书写方式。

 <template>
         <div>
           <template v-if="reverse">
             <div class="bar">Bar DOM...</div>
             <div class="foo">Foo DOM...</div>
           </template>
           <template v-else>
             <div class="foo">Foo DOM...</div>
             <div class="bar">Bar DOM...</div>
           </template>
         </div>
       </template>

2.jsx/tsx

这是一种DOM标签和JS混用的方式,对DOM操作更加灵活,发挥出JS的完全编程能力,但是需要手动实现渲染优化,Vue在模板语法中做的优化在此方式中不适用
如:根据 props 上的 reverse 属性,来决定是否要调换两块内容的渲染顺序。

jsx:

const renderContent = () => {
       const Content = [
         <div class="foo">Foo DOM...</div>,
         <div class="bar">Bar DOM...</div>,
       ];
       if (props.reverse) {
         Content.reverse();
       }
       return <div>{Content}</div>;
     }

template:

<template>
         <div>
           <template v-if="reverse">
             <div class="bar">Bar DOM...</div>
             <div class="foo">Foo DOM...</div>
           </template>
           <template v-else>
             <div class="foo">Foo DOM...</div>
             <div class="bar">Bar DOM...</div>
           </template>
         </div>
 </template>

3.函数式编写风格

vue中提供了h函数,h 函数是一个重载函数,支持多种调用方式,但在内部会处理为符合 createVNode 函数的入参,然后交给 createVNode 来创建虚拟 DOM。在此可以利用vue3提供的render函数将此虚拟DOM创建成真实DOM并挂载到指定结点。
可以直接跳过模板的编译过程

parser函数 -> ast抽象语法树 -> transform -> js 可描述api -> generate生成 -> render

<div><span>1</span></div>

转换函数式为:

let render = () =>{
       return h('div),{},[
         h('span),{},'1']
     }

二、函数式编程

1.使用场景

封装一些小组件(弹窗、按钮等)

2.参数

h 函数有三个参数

  • 第一个是创建的结点
  • 第二个是节点属性
  • 第三个是节点内容

3.例子

代码如下(示例):

interface Props {
  type: 'success' | 'error'
}
const Btn = (props:Props,ctx:any) =>{
  return h('button',
      {
        style: {
          color:props.type === 'success'? 'green': 'red'
        },
        onClick:()=>{
          ctx.emit('click','smz')
          console.log('点击了按钮',props.type)
        }
      },
      ctx.slots.default()
  )
}
<template>
<Btn type="success">编辑</Btn>
  <Btn type="error">删除</Btn>
</template>

3.render渲染函数

该函数由vue内部提供,可以将标签或者虚拟DOM转换成真实DOM并挂载到指定结点
该函数接收两个参数:

  • 标签或虚拟dom
    当该参数为null时,会将此组件移除
  • 挂载结点

例子:(提示组件)

export const message = (message, duration = 2000) =>{
    const handleDestroy = () =>{
        render(null,document.body)
    }
    const vNode = h(
        'messageComponent',
        {
            style:{
                width: '200px',
                height: '100px',
                border: '2px solid',
                float: 'left',
                position: 'relative',
                left: '50%',
                'margin-left': '-50px'
            },
            message,
            duration,
            destroy:handleDestroy
        },message)
    render(vNode,document.body);
        (function () {
          setTimeout(()=>render(null,document.body),duration)
        })()
}

使用:直接以API的形式调用

const messages = () =>{
  message('这是一个提示窗')
}

弹窗提示


总结

以上就是三种编码风格以及vue3中h函数和render函数的简单实用。

更多推荐

Linux网络编程

一.协议1.1什么是协议从应用的角度出发,协议可理解为“规则”,是数据传输和数据的解释的规则。假设,A、B双方欲传输文件。规定:第一次,传输文件名,接收方接收到文件名,应答OK给传输方;第二次,发送文件的尺寸,接收方接牧到该数据再次应答一个OK;第三次.传输文件内容。同样.接收方接收数据完成后应答OK表示文件内容接收成

【HCIE】04.网络安全技术

端口隔离在同一VLAN中可以隔离二层与三层通信,让同VLAN内的设备可以通信或者不可以通信。定义一个端口隔离组,在一个组内无法互访,不在一个组里面可以进行互访port-isolateenablegroup1//使能端口隔离功能port-isolatemdoeall//全局模式实现二层隔离,三层互访intg0/0/1po

207. 课程表

207.课程表题目-中等难度示例1.bfs题目-中等难度你这个学期必须选修numCourses门课程,记为0到numCourses-1。在选修某些课程之前需要一些先修课程。先修课程按数组prerequisites给出,其中prerequisites[i]=[ai,bi],表示如果要学习课程ai则必须先学习课程bi。例如

MySQL面试题——隔离级别相关面试题

隔离级别相关面试题MySQL事务隔离级别未提交读——可以读到其他事务未提交的数据(最新的版本)错误现象:脏读、不可重复读、幻读的现象提交读(RC)——可以读到其他事务已提交的数据(最新已提交的版本)错误现象:不可重复读、幻读现象使用场景:希望看到最新的有效值可重复读(RR)——在事务范围内,多次读能够保证一致性(快照建

69、Spring Data JPA 的 @Query查询 和 命名查询(半自动:提供 SQL 或 JPQL 查询)

1、方法名关键字查询(全自动,既不需要提供sql语句,也不需要提供方法体)2、@Query查询(半自动:提供SQL或JPQL查询)3、自定义查询(全手动)@Query查询和命名查询的区别:命名查询与直接用@Query来定义查询的本质是一样,只不过它们定义SQL或JPQL语句的位置不同。直接用@Query来定义查询,写S

MyBatisPlus使用自定义JsonTypeHandler实现自动转化JSON

个人主页:金鳞踏雨个人简介:大家好,我是金鳞,一个初出茅庐的Java小白目前状况:22届普通本科毕业生,几经波折了,现在任职于一家国内大型知名日化公司,从事Java开发工作我的博客:这里是CSDN,是我学习技术,总结知识的地方。希望和各位大佬交流,共同进步~背景在项目中使用了Mybatis-Plus框架,调用了Mapp

Android Jetpack解析之——LiveData

LiveData是一种可观察的数据存储器类。与常规的可观察类不同,LiveData具有生命周期感知能力,意指它遵循其他应用组件(如activity、fragment或service)的生命周期。这种感知能力可确保LiveData仅更新处于活跃生命周期状态的应用组件观察者。如果观察者(由Observer类表示)的生命周期

变量和配置文件

文章目录变量和配置文件1.变量1.1系统变量1.1.1系统变量分类1.1.2查看系统变量1.1.3修改系统变量的值1.2用户变量2.配置文件的使用2.1配置文件格式2.2启动命令与选项组2.3特定的MYSQL版本的专用选项组2.4同一个配置文件中多个组的优先级2.5命令行和配置文件中启动选项的区别变量和配置文件1.变量

ITR服务体系的常见问题和华为构建ITR的经验分享

大家好!前两天有一个企业负责客户服务、售后部门的朋友和华研荟探讨,企业的服务体系如何搭建,以及如何像华为一样构建ITR流程他的苦恼是,自己所带领的部门叫做客户服务中心,但是在公司内部不受重视,公司总觉得你们就是去现场安装、调试,出了问题去救个火,赶紧解决就好了,没什么难度嘛。在客户那边,每次出现问题总是一肚子抱怨,有的

Socks5代理、IP代理与网络安全:保护你的爬虫和隐私

在数字时代,数据是黄金,网络安全成为至关重要的问题。无论是保护个人隐私还是进行爬虫数据采集,代理技术已经成为网络工程师的必备工具。本文将深入探讨Socks5代理、IP代理以及它们在网络安全和爬虫应用中的重要性。1.了解Socks5代理Socks5代理是一种网络协议,允许应用程序通过中间服务器与目标服务器通信。与HTTP

分布式系统的 38 个知识点

天天说分布式分布式,那么我们是否知道什么是分布式,分布式会遇到什么问题,有哪些理论支撑,有哪些经典的应对方案,业界是如何设计并保证分布式系统的高可用呢?1.架构设计这一节将从一些经典的开源系统架构设计出发,来看一下,如何设计一个高质量的分布式系统;而一般的设计出发点,无外乎冗余:简单理解为找个备胎,现任挂掉之后,备胎顶

热文推荐