百科狗-知识改变命运!
--

setup() - vue 响应式 API

百变鹏仔1年前 (2023-11-21)阅读数 13#技术干货
文章标签组件

setup()

此页面记录了setup组件选项的使用。如果您将 Composition API 与单文件组件一起使用,建议使用 {{ count }}

请注意,在模板中访问时,从返回的refs,setup会自动浅展开.value,因此您在访问它们时不需要使用。当在组件上访问时,它们也以相同的方式展开this

setup()本身无权访问组件实例。在setup()
内,this的值不存在。您可以从 Options API 访问 Composition-API 公开的值,但反之则不行。


访问 props

setup()函数中的第一个参数是props,它是响应式的,并且会在传入新的props时更新。

export default {
  props: {
    title: String
  }, setup(props) {
    console.log(props.title)
  }
}

注意:如果您对props对象进行解构,则被解构的变量将失去反应性。因此建议始终以props.xxx形式访问。

如果您确实需要解构props,或者需要将props传递给外部函数同时保持反应性,您可以使用toRefs()toRef()实用程序 API 执行此操作:

import { toRefs } from 'vue'

export default {
  setup(props) {
    // turn `props` into an object of refs, then destructure
    const { title } = toRefs(props)
    // `title` is a ref that tracks `props.title`
    console.log(title.value)

    // OR, turn a single property on `props` into a ref
    const title = toRef(props, 'title')
  }
}


设置上下文 context

传递给setup()函数的第二个参数是一个设置上下文context对象。上下文对象暴露了其他可能在setup()内部有用的值:

export default {
  setup(props, context) {
    // Attributes (Non-reactive object, equivalent to $attrs)
    console.log(context.attrs)

    // Slots (Non-reactive object, equivalent to $slots)
    console.log(context.slots)

    // Emit events (Function, equivalent to $emit)
    console.log(context.emit)

    // Expose public properties (Function)
    console.log(context.expose)
  }
}

setup() - vue 响应式 API

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

export default {
  setup(props, { attrs, slots, emit, expose }) {
    ...
  }
}

attrs、slots是在组件本身更新时,始终更新的有状态对象。这意味着您应该避免对它们进行解构,并始终将属性引用为attrs.x或slots.x。

另请注意,与props不同,attrs、slots属性不是响应式的。如果您打算根据对其的更改应用副作用,则应在生命周期onBeforeUpdate挂钩中执行此操作。


暴露公共属性

默认状态下,本组件实例的属性方法,不能被父组件访问。expose()函数,可用于显式暴露:

export default {
  setup(props, { expose }) {
    // make the instance "closed"
    // i.e. do not expose anything to the parent expose() const publicCount = ref(0)
    const privateCount = ref(0)
    // selectively expose local state expose({ count: publicCount })
  }
}


与渲染函数一起使用

setup()还可以返回一个渲染函数,该函数可以直接使用在同一范围内声明的反应状态:

import { h, ref } from 'vue'

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

返回一个渲染函数,可以防止我们返回其他任何东西。在内部这应该不是问题,但是如果我们想通过模板引用将此组件的方法公开给父组件,则可能会出现问题。

我们可以通过调用expose()来解决这个问题:

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)
  }
}

然后,该increment方法将通过模板引用在父组件中可用。

鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com

免责声明:我们致力于保护作者版权,注重分享,当前被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!邮箱:344225443@qq.com)

图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)