setup语法糖

1.初始setup的使用方式
<script>
import {ref} from "vue"
import HelloWorld from "./HelloWorld.vue"
export default{
  name:"app",
  components:{
  HelloWorld
   },
  props:["name"]
  setup(props,ctx){
    const state=ref("");
    state.value=props.name;
    const add=()=>{
       //分发自定义事件的函数,
      ctx.emit("add",50)
    }
    return {state,add}
   }
}
</script>
2.setup语法糖

什么是setup语法糖?
在script标签中添加过setup,组件只需引入不用注册,属性和方法也不用返回,也不用写setup函数,也不用写export default

<template>
   <div>{{data}}</div>
   <div>{{state.name}}</div>
</template>
//当前组件名称会自动以文件名为主,不用再需要name属性了
<script setup>
//组件自动注册,
import HelloWorld from "./HelloWorld.vue"
import {ref,reactive} from "vue"
const data=ref("");
const state=reactive({name:"张三"})
</script>

问题:没有setup函数,应该怎么获取props,emit,attrs呢
setup 语法糖提供了三个新的API来供我们使用:defineProps、defineEmits和useContext

  • defineProps 用来接收父组件传来的值props
//子组件接收
<script setup>
 import {defineProps} from 'vue'
 const props=defineProps(["name"])
</script>

//父组件传值
<template>
  <div>我是父组件</div>
  <div :name="state.name"></div>
</template>
<script setup>
import {ref,reactive} from "vue"
const data=ref("");
const state=reactive({name:"张三"})
</script>
  • defineEmits 用来声明触发的事件表。
//子组件
 <script setup>
import {defineEmits,ref} from 'vue'
const name=ref("张三")
 //自定义函数,父组件可以触发
 const emit=defineEmits(['update'])
 const show=()=>{
   emit("update",name.value)
 }
</script>
<template>
  <div>我是父组件</div>
  <div  @update="update"></div>
</template>
<script setup>
import {ref,reactive} from "vue"
const update=(data)=>{
console.log(data)//张三
}
</script>
  • 获取 slotsattrs
<script setup>
import { useSlots, useAttrs } from 'vue'

const slots = useSlots()
const attrs = useAttrs()
</script>

  • defineExpose对外暴露属性

<script setup> 的组件默认不会对外部暴露任何内部声明的属性。 如果有部分属性要暴露出去,可以使用 defineExpose

使用场景:通过ref获取子组件的内容,子组件没有向外暴露是获取不到的

//子组件
<script setup>
import {ref} from 'vue'
const name=ref("张三")
const age=ref(12)
defineExpose({
 name
})
</script>
//父组件
 <template>
   <div>我是父组件</div>
   <HelloWorld ref="hello"></HelloWorld>
</template>
<script setup>
import HelloWorld from "./HelloWorld.vue"
import {ref,reactive} from "vue"
const hello=ref(null)
OnMounted(()=>{
  console.log(hello.name)//张三
  console.log(hello.age)//获取不到值
})
</script>

注意: defineProps、defineEmits、defineExpose API 不需要引入可以直接使用

总结:

<script setup>语法糖的优势

  • 更少的样板内容,更简洁的代码。
  • 能够使用纯Typescript声明 props 和抛出事件。
  • 更好的运行时性能 (其模板会被编译成与其同一作用域的渲染函数,没有任何的中间代理)。
  • 更好的 IDE 类型推断性能 (减少语言服务器从代码中抽离类型的工作)。
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue的setUp语法是一种简化Vue组件代码的语法形式。它使用了单文件组件的方式,将模板、脚本和样式放在同一个文件中,使得组件更加易读和易维护。 在setUp语法中,使用<script setup>标签来定义组件的逻辑部分。在这个标签内,我们可以使用defineProps函数来声明props,并且具备完整的类型推断。比如可以这样声明props:const props = defineProps({ foo: String })。我们也可以使用withDefaults函数来为props设置默认值,比如const props = withDefaults(defineProps<Props>(), { msg: 'hello', labels: () => ['one', 'two'] })。 同时,在<script setup>标签中,我们可以直接使用emit函数来触发父组件的事件监听器,而不需要使用this.$emit。这样可以简化代码的书写。 在模板中,我们可以直接使用组件的标签名来引入自定义组件,而不需要在component对象里进行声明。比如<template> <MyComponent /> </template>,然后在<script setup>中import MyComponent from './MyComponent.vue'。 总的来说,Vue的setUp语法能够简化组件的编写和维护,使得代码更加清晰和易读。它提供了更加简洁的语法形式来定义props、触发事件等功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Vue3中setup语法学习](https://blog.csdn.net/pdd11997110103/article/details/121438090)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值