vue3中setup-script的应用实例
作者:MWH 发布时间:2024-04-27 16:01:01
新特性的产生背景
在了解它怎么用之前,可以先了解一下它被推出的一些背景,可以帮助你对比开发体验上的异同点,以及了解为什么会有这一章节里面的新东西。
在 Vue 3.0 的 .vue 组件里,遵循 SFC 规范要求(注:SFC,即 Single-File Component,.vue 单组件),标准的 setup 用法是,在 setup 里面定义的数据如果需要在 template 使用,都需要 return 出来。
如果你使用的是 TypeScript ,还需要借助 defineComponent 来帮助你对类型的自动推导。
<!-- 标准组件格式 -->
<script lang="ts">
import { defineComponent } from 'vue'
export default defineComponent({
setup () {
// ...
return {
// ...
}
}
})
</script>
关于标准 setup 和 defineComponent 的说明和用法,可以查阅 全新的 setup 函数 一节。
script-setup 的推出是为了让熟悉 3.0 的用户可以更高效率的开发组件,减少一些心智负担,只需要给 script 标签添加一个 setup 属性,那么整个 script 就直接会变成 setup 函数,所有顶级变量、函数,均会自动暴露给模板使用(无需再一个个 return 了)。
上次写了关于自己初次使用vue3的一些感受,同时也获取了一众大佬的教导,其中最重要的是方法的setup的语法糖,为了搞清楚这个语法糖,我自己有把之前的页面,又重新重构了一次。果然得到真香定律,使用以后发现原来vue3还可以像react那样简洁的处理方法和传值,话不多说上代码看下吧
内部变量
首先看下内部变量变化,这是单纯之前使用setup
<template>
<div>
<div>
子组件内String:{{infor}}
</div>
<div>
子组件内obj:{{obj.data}}
</div>
<div>
子组件内arry:{{arry[0]}}
</div>
<div @click="changeInfor">
改变obj
</div>
</div>
</template>
<script>
import { ref, onMounted, defineEmits, defineProps, defineExpose, reactive } from "vue";
export default {
setup(){
const infor = ref('infor')
const obj = reactive({
data:'obj'
})
const arry = reactive([111,222,333])
const changeInfor = () =>{
obj.data = 'changeObj'
}
return {
infor, obj, arry, changeInfor
}
}
}
</script>
<style>
div{
line-height: 40px;
}
</style>
这是改成语法糖之后的代码
<template>
<div>
<div>
子组件内String:{{infor}}
</div>
<div>
子组件内obj:{{obj.data}}
</div>
<div>
子组件内arry:{{arry[0]}}
</div>
<div @click="changeInfor">
改变obj
</div>
</div>
</template>
<script setup>
import { ref, onMounted, defineEmits, defineProps, defineExpose, reactive } from "vue";
const infor = ref('infor')
const obj = reactive({
data:'obj'
})
const arry = reactive([111,222,333])
const changeInfor = () =>{
infor.value = '32323'
obj.data = 'changeObj'
}
</script>
<style>
div{
line-height: 40px;
}
</style>
这里可以明显看出来,未使用setup-script的方式,跟传统的还是有很大区别的, 结构简单明了,不需要把大量的变量和方法都写在setup这个函数里面,自由度很高,有点像react的类里面的使用方法
子父级传值
这里面主要涉及到三个方法 defineEmits,defineProps,defineExpose
// 父组件
<template>
<div>
父组件
<children ref="child" @getData="sentData" :data="data"/>
<div>{{childData || '我还没收到值'}}</div>
<div @click="makeClid">点击调用子组件方法</div>
</div>
</template>
<script setup>
import { ref, onMounted, defineEmits, defineProps, defineExpose, reactive } from "vue";
import children from './components/children.vue'
const childData = ref('')
const data = ref('父组件给的值prop传值')
const sentData = (data) =>{
childData.value = data
}
const child = ref(null) // 获取子组件ref
const makeClid = () =>{
child.value.setData('子组件已调用')
}
</script>
// 子组件
<template>
<div>
{{fatherData || '父组件还未调用我'}}
<div @click="getData">触发父组件</div>
<div>fatherProps:{{fatherProps}}</div>
</div>
</template>
<script setup>
import { ref, onMounted, defineEmits, defineProps, defineExpose, reactive } from "vue";
const fatherData = ref('')
const fatherProps = ref('')
const props = defineProps({ // 父组件传值
data:String
})
fatherProps.value = props.data
const emit = defineEmits(['getData']) // 接受父组件数据
const getData = () =>{
emit('getData','给父组件的值') // 触发父组件的方法
}
const setData = (val) =>{ // 父组件调用
fatherData.value = val
}
defineExpose({ // 抛出方法
getData,
setData
})
</script>
子组件调用父组件:这点很好理解,跟vue2差不多的形式,父组件里面挂载@getData,子组件里面通过defineEmits这个方法获取,最后调用方式跟之前也是一样的
父组件调用子组件:这点区别还是很大的,需要子组件先定义好方法,然后通过defineExpose暴露出去,父组件创建ref,这里需要创建的变量名字和子组件的ref名字一直,否者获取不到,最后通过获取抛出的value找到对应的方法。
来源:https://juejin.cn/post/7051414631381745700


猜你喜欢
- 我们知道SQLSERVER的数据行的存储有两种数据结构:A: 堆 B :B树(binary 二叉树)数据按照这种两种
- 背景:准备给长辈买个手机,有关手机大小,网购平台基本只有手机尺寸和分辨率的文本数据,因而对手机屏幕大小没有直观感受,虽然网上有比较手机大小的
- 前提搭建钉钉应答机器人,需要先准备或拥有以下权限:钉钉企业的管理员或子管理员(如果不是企业管理员,可以自己创建一个企业,很方便的)有公网通信
- 大家在没有阅读本文之前先看下python的基本概念,Python是一种解释型、面向对象、动态数据类型的高级程序设计语言。Python由Gui
- 在了解装饰器之前,我们需要知道什么闭包是什么鬼!闭包:在一个函数内定义了一个函数f,并且这个函数f引用外部变量,在把这个函数f当做返回值返回
- 本文实例讲述了CodeIgniter分页类pagination使用方法。分享给大家供大家参考,具体如下:controller控制器(appl
- 之前用Crystal做了一个数字转English Word的Formula刚刚心血来潮, 大半个晚上写了JS版本的数字转换, 由于JS的Bu
- 是不是很烦每次注册网站或填写相关资料时都要重来一遍?其实会有很多自动填写工具能代劳。比如使用 Mac, 在 Safari 的表单中,它可以足
- 许多游戏玩家一定会对游戏中的动态鼠标指针有很深的印象,其实只要一句简单的CSS(层叠样式表),你也能在网页上实现这种效果。首先,你需要一个鼠
- 交代背景作为一名合格的 Python 程序员,在工作中必然会用到二维码相关操作,那如何快速的用 Python 实现呢?别着急,咱们这篇博客就
- 下面是BeforeInitialBind事件过程:<SCRIPT language=vbscript event=
- 本文实例讲述了Python使用pylab库实现画线功能的方法。分享给大家供大家参考,具体如下:pylab 提供了比较强大的画图功能,但是函数
- 这篇文章主要介绍了python有序查找算法 二分法实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要
- 阅读上一篇:一个完美网站的101项指标.第三部分.易用性 设计体现了一个网站的艺术素养,然而并不是说您应当过分设计,设计风格应结合您的行业,
- 在工控应用上,返回的数据经常会以二进制的形成存储,而这些二进制数据又是以每4个bit表示一个十六进制的数据内容。解析的时候,往往是一个字节(
- 本文实例讲述了python使用socket连接远程服务器的方法。分享给大家供大家参考。具体如下:import socketprint &qu
- 维护是什么,维护就是修改,不断的修改,但是要保证你的html和css有清晰的版本界定,有扩展性,不要因为做的太死而重新去做这个页面。一个赚钱
- 使用ASP处理XSLT转换XML比较简单,思路如下:创建一个XSLTemplate的对象,再创建一个XMLDOM对象,然后在家Xml文件和X
- 检测缺失值我们先创建一个带有缺失值的数据框(DataFrame)。import pandas as pddf = pd.DataFrame(
- 模式库在模式库里,我将列出所有电子商务网站需要的模式.以下将罗列出经典常用的模式案例,我也试图让这些模式看起来更有趣味性与实用性。(Yaho