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)
  }
}
相关推荐
IT_陈寒5 分钟前
React useEffect依赖数组中埋的坑,这次终于让我逮到了
前端·人工智能·后端
FourAu1 小时前
2026 前端突围指南:从 ESR 边缘渲染到封装 Web AI SDK,聊聊 AI 时代的职业进化
前端·人工智能
Zkeq1 小时前
不止是聊天框:我用 EdgeOne Makers Agents 给烹饪 APP 加了一位能“改菜谱”的 AI 主厨
前端
咩咩啃树皮2 小时前
第32篇:前端本地存储全解——Cookie、localStorage、sessionStorage 区别与实战
前端
腻害兔3 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 框架层:15 个 Starter 到底在干什么?
前端·vue.js·产品经理·ai编程
程序员黑豆5 小时前
从零开始:编写第一个鸿蒙(HarmonyOS)程序
前端·harmonyos
lastknight5 小时前
CSS @layer
前端·css
李宸净5 小时前
Web自动化测试selenium+python
前端·python·selenium
淡海水6 小时前
06-04-YooAsset源码-Unity加密解密服务
前端·unity·性能优化·c#·游戏引擎·yooasset