vue3,你看setup设计详解,也是个人才

js 复制代码
setup

基本使用
访问Props
Setup 上下文
与渲染函数一起使用

基本使用

js 复制代码
<script setup> 这种语法。

响应式API:在setup()函数 返回的对象, 会暴露给 模板和组件实例。

js 复制代码
<script>
export default {
  setup() {
    const count = ref(0)
    
    // 返回值会暴露给模版和其他的选项式 API 钩子
    return {
      count // 自动浅层解包 在模版中就不需要再写.value this问也无需写
    }
  },
  
  mounted() {
    console.log(this.count) // 0
  }
}
</script>

<template>
  <button @click="count++">{{ count }}</button>
</template>

async setupSuspense组件的后裔。

访问Props

setup函数的第一参数是props

setup函数的props是响应式的,并且传入新的props时 同时更新

js 复制代码
export default {
  props: {
    title: String
  },
  setup(props) {
    console.log(props.title)
  }
}

解构props对象去用,达咩,解构出的变量会丢失响应式。用props.xxx去用其中的porps
如果,确实,要解构props对象。 或者要将某个prop传到一个外部函数中并保持响应性,那么你可以使用toRefs()toRef()这两个工具函数:

js 复制代码
import { toRefs, } from 'vue'

export default {
  setup(props) {
    // 将`props`转为一个其中全是ref的对象,然后解构
    const { title } = toRefs(props)
    
    // `title`是一个追踪着`props.title`的ref
    console.log(title.value)
    
    // 或者,将`props`的单个属性转为一个ref
    const title = toRef(props, 'title')
  }
}

Setup 上下文

第二个参数是上下文 context

js 复制代码
export default {
  setup(props, context) {
    // 透传 Attributes (非响应式的对象,等价于 $attrs)
    console.log(context.attrs)
    
    // 插槽(非响应式的对象,等价于 $slots)
    console.log(context.slots)
    
    // 触发事件(函数,等价于 $emit)
    console.log(context.emit)
    
    // 暴露公共属性(函数)
    console.log(context.expose)
  }
}

该 上下文 对象 是 非响应式的,可以安全地解构:

js 复制代码
export default {
  setup(props, { attrs, slots, emit, expose }) {
    ...
  }
}

attrs 和 slots 都是有状态的对象,它们总是会随着组件自身的更新而更新。

这意味着你应当避免解构它们,并始终通过 attrs.x 或 slots.x 的形式使用其中的属性。

此外还需注意,和 props 不同,attrs 和 slots 的属性都不是响应式的。

如果你想要基于 attrs 或 slots 的改变来执行副作用,那么你应该在 onBeforeUpdate 生命周期钩子中编写相关逻辑。

暴露公共属性

expose函数用于显式地限制该组件暴露出的属性,

js 复制代码
export default {
  setup(props, { expose }) {
    // 让组件实例处于"关闭状态"
    // 即不向父组件暴露任何都你先
    expose()
    
    const publicCount = ref(0)
    const privateCount = ref(0)
    
    // 有选择地暴露局部状态
    expose({ count: publicCount })
  }
}

与渲染函数一起使用

setup也可以返回一个渲染函数

可以用同一作用域下 声明的 响应式状态:

js 复制代码
import { h, ref } from 'vue'

export default {
  setup() {
    const count = ref(0)
    return (0 => h('div', count.value)
  }
}

通过expose暴露方法给父组件(父组件可以通过模版引用 去访问 这个 increment方法):

js 复制代码
import { h, ref } from 'vue'

export default {
  setup(props, { expose }) {
    const count = ref(0)
    const increment = () => ++count.value
    
    expose({
      increment
    })

    return () => h('div', count.value)
  }
}
相关推荐
一 乐24 分钟前
婚纱摄影网站|基于ssm + vue婚纱摄影网站系统(源码+数据库+文档)
前端·javascript·数据库·vue.js·spring boot·后端
C_心欲无痕1 小时前
ts - tsconfig.json配置讲解
linux·前端·ubuntu·typescript·json
清沫1 小时前
Claude Skills:Agent 能力扩展的新范式
前端·ai编程
yinuo2 小时前
前端跨页面通信终极指南:方案拆解、对比分析
前端
yinuo2 小时前
前端跨页面通讯终极指南⑨:IndexedDB 用法全解析
前端
xkxnq3 小时前
第二阶段:Vue 组件化开发(第 16天)
前端·javascript·vue.js
烛阴3 小时前
拒绝配置地狱!5 分钟搭建 Three.js + Parcel 完美开发环境
前端·webgl·three.js
xkxnq3 小时前
第一阶段:Vue 基础入门(第 15天)
前端·javascript·vue.js
anyup4 小时前
2026第一站:分享我在高德大赛现场学到的技术、产品与心得
前端·架构·harmonyos
BBBBBAAAAAi4 小时前
Claude Code安装记录
开发语言·前端·javascript