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)
  }
}
相关推荐
百锦再41 分钟前
Reactive编程入门:Project Reactor 深度指南
前端·javascript·python·react.js·django·前端框架·reactjs
莲华君43 分钟前
React快速上手:从零到项目实战
前端·reactjs教程
百锦再43 分钟前
React编程高级主题:测试代码
android·前端·javascript·react.js·前端框架·reactjs
易安说AI1 小时前
Ralph Loop 让Claude无止尽干活的牛马...
前端·后端
失忆爆表症3 小时前
05_UI 组件库集成指南:Shadcn/ui + Tailwind CSS v4
前端·css·ui
小迷糊的学习记录3 小时前
Vuex 与 pinia
前端·javascript·vue.js
发现一只大呆瓜3 小时前
前端性能优化:图片懒加载的三种手写方案
前端·javascript·面试
不爱吃糖的程序媛3 小时前
Flutter 与 OpenHarmony 通信:Flutter Channel 使用指南
前端·javascript·flutter
利刃大大3 小时前
【Vue】Element-Plus快速入门 && Form && Card && Table && Tree && Dialog && Menu
前端·javascript·vue.js·element-plus
NEXT063 小时前
AI 应用工程化实战:使用 LangChain.js 编排 DeepSeek 复杂工作流
前端·javascript·langchain