Vue3 script setup 语法糖(升级版)

2023-05-16

序:

​ 使用了vue3后发现变量每次都必须return,不免很麻烦,所以在vue3.2添加了script setup 语法糖,本次修改主要从以下5个方面做了修改:

1.SSR:服务端渲染优化。@vue/server-renderer包加了一个ES模块创建, 与Node.js解耦,使在非Node环境用@vue/serve-render做服务端渲染成为可能, 比如(Workers、Service Workers)

2.New SFC Features:新的单文件组件特性

3.Web Components:自定义 web 组件。这个我们平时很少用到,但是应该知道

4.Effect Scope API: effect 作用域, 用来直接控制响应式副作用的释放时间(computed 和 watchers)。 这是底层库的更新,开发不用关心,但是应该知道

5.Performance Improvements:性能提升。这是内部的提升,跟开发无关

一、变量、方法不需要 return 出来

<template>
  <div class="home">
    显示的值{{flag }}
    <button @click="changeHander">改变值</button>
  </div>
</template>
<!-- 只需要在script上添加setup -->
<script setup="props, { emit }" lang="ts">
    import { ref } from 'vue';

    <!-- flag变量不需要在 return出去了 -->
    let flag=ref("开端-第一次循环")

    <!-- 函数也可以直接引用,不用在return中返回 -->
    let changeHander=():void=>{
        flag.value='开端-第二次循环'
    }

</script>

官方中文文档

二、组件不需要在注册

在 script setup 中,引入的组件可以直接使用,无需再通过components进行注册,并且无法指定当前组件的名字,它会自动以文件名为主,也就是不用再写name属性了

<!-- 这个是组件 -->
<template>
    <div>
        <h2> 你好-我是肖鹤云</h2>
    </div>
</template>


<!-- 使用的页面 -->
<template>
  <div class="home">
    <test-com></test-com>
  </div>
</template>
<script lang="ts" setup>
// 组件命名采用的是大驼峰,引入后不需要在注册,是不是爽歪歪呀!
//在使用的使用直接是小写和横杠的方式连接 test-com
import TestCom from "../components/TestCom.vue"
</script>

三、新增 defineProps、defineEmits、defineExpose

1、父传子

<!-- 父组件传递参数 -->
<template>
  <div class="home">
    <test-com :info="msg" time="42分钟"></test-com>
  </div>
</template>
<script lang="ts" setup>
// 组件命名采用的是大驼峰,引入后不需要在注册,是不是爽歪歪呀!
import TestCom from "../components/TestCom.vue"
let msg='公交车-第一次循环'
</script>


<!-- 子组件接受参数 -->
<template>
    <div>
        <h2> 你好-我是肖鹤云</h2>
        <p>信息:{{ info}}</p>
        <p>{{ time }}</p>
    </div>
</template>
<script lang="ts" setup>
import {defineProps} from 'vue'
defineProps({
    info:{
        type:String,
        default:'----'
    },
    time:{
        type:String,
        default:'0分钟'
    },
})
</script>

2、子传父

defineEmits

<!-- 子组件使用 -->
<template>
    <div>
        <h2> 你好-我是肖鹤云</h2>
        <button @click="hander1Click">新增</button>
        <button @click="hander2Click">删除</button>
    </div>
</template>

<script lang="ts" setup>
 import {defineEmits} from 'vue'
//  使用defineEmits创建名称,接受一个数组
let $myemit=defineEmits(['myAdd','myDel'])
let hander1Click=():void=>{
    $myemit('myAdd','新增的数据')
}

let hander2Click=():void=>{
    $myemit('myDel','删除的数据')
}
</script>


<!-- 父组件 -->
<template>
  <div class="home">
    <test-com @myAdd="myAddHander" @myDel='myDelHander'></test-com>
  </div>
</template>
<script lang="ts" setup>
// 组件命名采用的是大驼峰,引入后不需要在注册,是不是爽歪歪呀!
//在使用的使用直接是小写和横杠的方式连接 test-com
import TestCom from "../components/TestCom.vue"
let myAddHander=(mess):void=>{
  console.log('新增==>',mess);
}

let myDelHander=(mess):void=>{
  console.log('删除==>', mess);
}
</script>

defineExpose

<!-- 子组件 -->
<template>
    <div class="child"></div>
</template>

<script setup lang="ts">
import { ref, reactive } from "vue";
function doSth() {
    console.log(333);
}
defineExpose({ doSth });
</script>

<style lang="scss" scoped>
</style>


<!-- 父组件 -->
<template>
<div class="father" @click="doSth1">222</div>
    <Child ref="childRef"></Child>
</template>

<script setup lang="ts">
import { ref, reactive } from "vue";
import Child from "./Child.vue";
const childRef = ref();
function doSth1() {
    childRef.value.doSth();
}
</script>

<style lang="scss" scoped>
</style>

3、小结

// 第一种不带默认值props
const props = defineProps<{
  foo: string
  bar?: number
}>()
// 第二种带默认值props

export interface ChildProps {
  foo: string
  bar?: number
}

const props = withDefaults(defineProps<ChildProps>(), {
   foo: "1qsd"
  bar?: 3
})

// 第一种获取事件
const emit = defineEmits<{
  (e: 'change', id: number): void
  (e: 'update', value: string): void
}>()

// 第二种获取事件
 
const emit = defineEmits(["dosth"])

四、新增指令 v-memo

v-memod会记住一个模板的子树,元素和组件上都可以使用。 该指令接收一个固定长度的数组作为依赖值进行[记忆比对]。 如果数组中的每个值都和上次渲染的时候相同,则整个子树的更新会被跳过。 即使是虚拟 DOM 的 VNode 创建也将被跳过,因为子树的记忆副本可以被重用。 因此渲染的速度会非常的快。

注意:正确地声明记忆数组是很重要。

<li v-for="item in listArr"  :key="item.id"  v-memo="['valueA','valueB']">
    {{ item.name   }}
</li>

作用:缓存模板中的一部分数据。只创建一次,以后就不会再更新了。也就是说用内存换取时间。一般用于前端搜索筛选。

<template>
  <div class="home">
    <input type="text" v-model="jiaoSheng">
    <!-- v-memo中值若不发生变化,则不会进行更新 -->
    <ul v-memo="[shouldUpdate]">
      <li class="licss" v-for="item in arr" :key="item">  {{ jiaoSheng }} -- {{ animalType[jiaoSheng] }}  </li>
    </ul>
  </div>
</template>
<script lang="ts" setup>
import { ref } from "@vue/reactivity"
import { watch } from "@vue/runtime-core"
const arr=new Array(10000)
const animalType={
  'mie':'🐏',
  'mo':'🐂',
  'miao':'🐱',
}
const jiaoSheng=ref('mie')
const shouldUpdate=ref(0)
// 监听jiaoSheng(输入框中的值)。
// 如果数据发生变化,并且在animalType对象中存在。试图进行更新。否则试图不进行更新。
watch(()=>jiaoSheng.value,()=>{
  if(Object.keys(animalType).includes(jiaoSheng.value)){
    shouldUpdate.value++
  }
})
</script>

五、useAttrs和useSlots

useAttrs 可以获取父组件传过来的id和class等值。 useSlots 可以获得插槽的内容

<!-- 父组件 -->
<template>
    <div class="father">{{ fatherRef }}</div>
    <Child :fatherRef="fatherRef" @changeVal="changeVal" class="btn" id="111">
      <template #test1>
        <div>1223</div>
      </template>
    </Child>
</template>

<script setup lang="ts">
import { ref } from "vue";
import Child from "./Child.vue";
const fatherRef = ref("1");
function changeVal(val: string) {
    fatherRef.value = val;
}
</script>

<style lang="scss" scoped>
.father {
    margin-top: 40px;
    margin-bottom: 40px;
}
.btn {
    font-size: 20px;
    color: red;
}
</style>


<!-- 子组件 -->
<template>
    <div v-bind="attrs">
        <slot name="test1">11</slot>
        <input type="text" v-model="inputVal" />
    </div>
</template>

<script setup lang="ts">
import { computed, useAttrs, useSlots } from "vue";
const props = defineProps<{
    fatherRef: string;
}>();
const emits = defineEmits(["changeVal"]);
const slots = useSlots();
const attrs = useAttrs();
console.log(122, attrs, slots);
const inputVal = computed({
    get() {
        return props.fatherRef;
    },
    set(val: string) {
        emits("changeVal", val);
    },
});
</script>

<style lang="scss" scoped>
</style>

六、自定义指令

<script setup lang="ts">
const vMyFocus = {
  onMounted: (el: HTMLInputElement) => {
    el.focus();
    // 在元素上做些操作
  },
};
</script>
<template>
  <input v-my-focus value="111" />
</template>

番外:style v-bind

style v-bind将span变成红色

<template>
  <span> 有开始循环了-开端 </span>  
</template>
<script setup>
  import { reactive } from 'vue'
  const state = reactive({
    color: 'red'
  })
</script>
<style scoped>
  span {
    /* 使用v-bind绑定state中的变量 */
    color: v-bind('state.color');
  }  
</style>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue3 script setup 语法糖(升级版) 的相关文章

  • Echarts制作各省相关数据并根据特定值来进行颜色区分(含数据格式)

    以前做得中国地图展示各省相应指标数据 xff0c 效果如图 xff1a 核心文件两个Echarts js是肯定需要的 xff0c 还有一个echarts china js xff0c gittub上有 xff0c 大家可以去下载 内有相应的
  • 并查集模板题----P3367 【模板】并查集

    题目描述 如题 xff0c 现在有一个并查集 xff0c 你需要完成合并和查询操作 输入格式 第一行包含两个整数N M xff0c 表示共有N个元素和M个操作 接下来M行 xff0c 每行包含三个整数Zi Xi Yi 当Zi 61 1时 x
  • windows安装ubuntu时错误WslRegisterDistribution failed with error: 0x8007023e的解决方法

    cmd或者powershell安装 xff0c 或者打开linux时 莫名的出现了如下错误 xff1a Installing this may take a few minutes span class token punctuation
  • opencv安装时找不到cuda的错误解决方式

    编译环境 ubuntu1604 43 opencv3 2 43 cuda8 0 编译opencv时碰到如下是错误Scanning dependencies of target example gpu alpha comp CMakeFile
  • VNCViewer连接树莓派失败、显示超时的部分原因

    刚入手树莓派 xff0c 在用VNCViewer这款软件实现树莓派的图形化桌面时遇到了一些坑 xff0c 在这里分享 xff0c 希望能对大家有所帮助 1 在文本框内输入IP地址之后一定要记得加上 端号 xff0c 如下图所示 这个端号在P
  • 洛谷 - p2651 添加括号III(思维,数学)

    题目传送 题意 思路 我们首先想想如何判断一个分数是否能约分成整数 判断方法 1 我们可以分解分子的质因子和分母的质因子 xff0c 如果分母的质因子数量和种类数完全被分子的质因子包括 xff0c 那么一定可以约分成为整数 2 如果分母的所
  • 分数取模(费马小定理)

    费马小定理 若p是质数 xff0c 且p与a互质 xff0c 有等式 a p 1 p 61 61 1 p 那么我们在这上面变一下型 俩边同除a a p 2 p 61 61 a 1 p 那么我们再在俩边同乘b b a p 2 p 61 61
  • Verilog中两种位宽声明方式在赋值和例化时的思考

    文章目录 一 赋值二 例化1 大端 gt 大端 xff0c 小端 gt 小端2 大端 gt 小端 xff0c 小端 gt 大端 总结 近来在学习VHDL时发现其有TO和DOWNTO两种声明位宽的方式 xff0c 不同方式在赋值操作时存在差异
  • ROS学习笔记(2)创建ROS工作空间

    一 创建一工作空间 1 新建一个文件夹 xff0c 路径中应当没有中文 2 在文件夹中新建一个文件夹名字叫src xff0c 在ros工作空间中src文件夹是必须的 3 在文件夹中右键打开终端 xff0c 如果不是右键打开终端 xff0c
  • linux下freeswitch安装详细教程

    前言 xff1a 本次安装freeswitch为1 6 0版本 xff0c 其他版本可能出现异常 百度智能语音MRCP搭建教程参照 xff1a freeswitch呼叫中心之百度MRCP语音合成识别环境搭建 十年一梦惊觉醒的博客 CSDN博
  • Ubuntu切换lightdm后不能修改分辨率,强行修改xorg.conf重启后只能进入tty模式

    目录 出现问题 如题 问题背景 探索过程 解决办法 查看日志 出现问题 如题 问题背景 描述 因为需要使用向日葵远程控制 xff0c 发现win10不能远程控制ubuntu 百度后提示 造成的原因有如下 xff1a 1 桌面环境是否开启 x
  • pip3 指定国内源

    pip3 install index url https pypi douban com simple Image
  • 【linux】 profile和bashrc, ~/.profile ,~/.bashrc

    影响范围 1 profile和bashrc 影响范围加载 etc profile etc profile d 系统 xff08 对所有用户起作用 xff09 系统登录后 profile用户启动bash shell etc bash bash
  • sqlitespy怎么打开.db数据库文件

    百度搜索SQLiteSpy xff0c 下载 双击打开SQLiteSpy 点File Open DataBase 找到要打开的 db数据库文件 xff0c 点打开 这样数据库就打开了 xff0c 可以看到左侧表 右键点击一个表 Show D
  • OSI/ISO详解

    前段时间学习的需要 xff0c 在论坛泡了几天 xff0c 加上自己的看法 xff0c 总结出了这个详解 当然其中很多是从论坛里面搬运过来 xff0c 所以如有错误之处 xff0c 还望各位积极指正 一 OSI模型概述 xff1a 1概念
  • 使用wsl命令迁移WSL。

    1 打开CMD xff0c 查看所有WSL 执行 xff1a wsl l all v 显示 xff1a Windows Subsystem for Linux Distributions Ubuntu 20 04 Default 2 导出W
  • 使用脚本重启WSL(ubuntu)。

    1 创建 重启脚本文件 bat cmd 编辑脚本 xff0c 输入 xff1a net stop LxssManager net start LxssManager 保存关闭 2 运行脚本 脚本运行需要管理员权限 解决方法 xff1a xf
  • C# winform treeview GDI+流程连线 流程图 树形流程图

    C winform treeview GDI 43 流程连线 流程图 树形流程图 TreeView Paint的方法呈现效果 xff0c 具体如下 1 点击连线按钮开始准备连线 2 点击第一个连线的起始节点 3 再点击第二个连线的结束节点
  • 使用STM32寄存器点亮LED流水灯

    目录 一 什么是寄存器GPIO 二 使用寄存器点亮LED灯1 建立工程模板1 1 建立相关文件1 2 建立工程1 3 配置环境 2 配置GPIO端口2 1 配置时钟使能2 2 初始化结构体2 3 配置输入输出模式 3 主要函数3 1 led
  • frp内网穿透—将kali代理在公网中进行渗透测试

    文章目录 前言Frp简介准备工具实现内网穿透frp服务端配置frp客户端配置 测试HTTP服务测试ssh服务测试反弹shell测试 注意 前言 由于工作常需要用到kali xff0c 但是公网服务器并没有安装kali镜像 xff0c 本地只

随机推荐

  • 最小二乘法解的矩阵形式推导

    最小二乘法解的矩阵形式推导 首先 xff0c 什么是最小二乘 xff1f 维基百科给出了一个定义 xff0c 戳这里 在我看来 xff0c 最小二乘法是一种数据拟合方法 我们从矩阵的角度来理解 xff1a 首先我们给出一个矩阵中的定义 xf
  • pytesseract识别数字

    针对工程需求精度不够 xff0c 目前只能识别率为86 左右 用tesseract的深度学习可能会好一点 xff0c 没搞懂怎么用 xff1f 单张图片 import cv2 import numpy as np import matplo
  • Arduino利用NTPClient库获取网络时间,显示时间与实时时间不同步

    网络时间协议 xff08 Network Time Protocol xff0c NTP xff09 是用来使计算机时间同步化的一种协议 xff0c 它可以 使计算机对其服务器或时钟源 xff08 如石英钟 xff0c GPS等等 做同步化
  • 【C++】链表反转逆序|建立、删除、修改、插入|linux内核链表与普通链表

    目录 C 43 43 实现链表逆序 链表的建立 删除 修改 插入 linux内核链表与普通链表 C 43 43 实现链表逆序 实现链表逆序 xff0c 首先要有一个链表 xff0c 下面是链表的结构体 xff1a typedef struc
  • https 自签名SSL证书

    介绍 TLS或称传输层安全性 xff0c 及其前身SSL xff08 代表安全套接字层 xff09 是用于将正常流量包装在受保护的加密包装中的Web协议 使用这种技术 xff0c 服务器可以在服务器和客户端之间安全地发送流量 xff0c 而
  • Gitlab安装及配置

    主要内容 xff1a 使用docker运行 gitlab xff1b 配置LDAP及邮箱 xff1b 配置管理员账号 xff1b 配置邮箱通知 xff1b 关闭用户注册 xff1b 安装 我们使用docker来安装Gitlab xff0c
  • windows 文件夹正在使用 “操作无法完成,因为其中的文件夹或文件已在另一程序中打开“ 解决办法

    解决办法 xff1a 右键状态栏 gt 任务管理器 gt 性能 gt 打开资源监视器 gt CPU gt 在 关联的句柄 处搜索被占用的文件夹名称 现象 解决办法 第1步 第2步 第3步 例如搜索 test 第4步 右键找到占用的程序 第5
  • Windows服务器更新服务的配置-client

    0x01 WSUS客户端 wsus客户端可以使windows的各种系统 windows7 8 10 server 无须安装任何软件 0x02 客户端配置 wsus客户端通过配置本地组策略来实现 运行中输入 xff1a gpedit msc
  • Anime4K:目前最热的开源实时动漫放大算法,Github上一周收获2600星!

    点击我爱计算机视觉标星 xff0c 更快获取CVML新技术 今天跟大家介绍一款动漫画面放大算法Anime4K xff0c 目前最热的开源 实时 视频动漫放大算法 https github com bloc97 Anime4K 一周内该库在G
  • 统计学:离散型和连续型随机变量的概率分布

    主要随机变量一览表 随机变量概率分布均值方差一般离散型变量 p x 的 表 公 式 或 者 图 x x p x x x 2 p x 二项分布 p x 61 C x n p x
  • Stata基本功能及其函数实现

    Stata简介 xff1a Stata使用简单 xff0c 功能强大 xff0c 是数据分析中常用的统计计量软件 本人使用的是Stata14 xff0c 如若需要 xff0c 可评论留言 xff01 1 Stata基本描述 1 1主窗口 如
  • MySQL安装过程问题:服务器名无效,发生系统错误 5 拒绝访问

    1 服务器名无效 安装好MySQL之后 xff0c 使用CMD系统命令程序 xff0c 输入命令启动MySQL xff0c 提示 服务器名无效 原因1 xff1a 服务器名字错误 解决方法 检查命令行中服务器名是否正确 xff0c MySQ
  • R语言基础画图/绘图/作图

    R语言基础画图 R语言免费且开源 xff0c 其强大和自由的画图功能 xff0c 深受广大学生和可视化工作人员喜爱 xff0c 这篇文章对如何使用R语言作基本的图形 xff0c 如直方图 xff0c 点图 xff0c 饼状图以及箱线图进行简
  • 【网站】IIS配置/搭建PHP环境的网站教程

    原文 xff1a https www fujieace com php iis html 今天一位群友想新搞一个万能门店小程序网站 xff0c 由于他的服务器上面已经存在了很多的老站 xff0c 用的IIS6 0服务 xff0c 现在这个网
  • MySQL数据库事务处理

    事务处理用于有效记录某机构感兴趣的业务活动 xff08 称为事务 xff09 的数据处理 xff08 例如销售 供货的定购或货币传输 xff09 通常 xff0c 联机事务处理 OLTP 系统执行大量的相对较小的事务 百度百科 事务处理是将
  • 神农尝百草---Windows环境下为Python3.X安装basemap

    basemap是matplolib的一个插件 xff0c 提供了许多将地理位置 xff08 如经度和纬度 xff09 转化为二维matplotlib图的方式 xff0c 是地图数据可视化的重要工具 本人Python是3 6版本 xff0c
  • 机器学习之朴素贝叶斯(NB)分类算法与Python实现

    朴素贝叶斯 xff08 Naive Bayesian xff09 是最为广泛使用的分类方法 xff0c 它以概率论为基础 xff0c 是基于贝叶斯定理和特征条件独立假设的分类方法 一 概述 1 简介2 条件概率与贝叶斯定理3 朴素贝叶斯分类
  • Python批量修改文件名

    工作中经常会遇到需要批量修改文件名的情况 xff0c 比如 xff1a 有这样一个文件夹 xff0c 里面是249个国家的国家 xff0c 按照ISO 3166 1标准中的国家二位简称进行命名 xff1a 现在面临这样的需求 xff0c 需
  • Excel实战:时间转换、字符串拆分和多条件判断

    1 概述 1 1案例 有如下通话记录数据 xff0c 包括主叫 被叫和通话时长 43 43 43 43 43 span class hljs string date caller callee duration span 43 43 43
  • Vue3 script setup 语法糖(升级版)

    序 xff1a 使用了vue3后发现变量每次都必须return xff0c 不免很麻烦 xff0c 所以在vue3 2添加了script setup 语法糖 xff0c 本次修改主要从以下5个方面做了修改 1 SSR xff1a 服务端渲染