# Setup

  • 在 setup 中尽量避免使用 this ,因为会找不到实例。
    setup 的调用发生在 data property 、computed property 和 methods 被解析之前,所以它们无法在 setup 中被获取

# 参数

  1. props
  2. context

# props

  • 响应式的

因为 props 是响应式的,所以不能被 ES6 解构,会消除 props 响应性
如果需要解构 props ,可以使用 toRefs

import { toRefs } from 'vue'

setup(props) {
  const title = toRefs(props)
}
1
2
3
4
5
<template>
  <div>
    <h1>Setup</h1>
    
    <p>props change from father: {{ title }}</p>
    <p>isShow: {{isShow ? '显示' : '隐藏'}}</p>
  </div>
</template>

<script>
import {
  toRefs,
  ref
} from 'vue'

export default {
  // 显式声明 props
  props: {
    title: {
      type: String,
      default: ''
    },
    isShow: Boolean
  },
  setup (props, context) {
    // 需要在 props 显式声明后 这里才能获取到对应的 props
    // 如果父组件传了两个 props  但子组件只声明了其中一个 那么这里只能获取一个props
    console.log(props);
    // const { title } = props // 这里解构 title 是非响应式 父组件改变后 不会改变
    const { title } = toRefs(props) // 保持响应式 可使用 toRefs 

    const name = ref('hello')
    const age = ref(12)

    const {
      emit, // $emit
      slots, // $slots
      attrs, // $attrs 包含了父作用域中不作为组件 props 或自定义事件的 attribute 绑定和事件
      expose // 该函数允许通过公共组件实例暴露特定的 property
    } = context
    console.log(emit, slots, attrs, expose);

    console.log(attrs, 'attrs');

    const handleFatherDispatch = () => {
      alert('i am here.')
    }

    // 通过以下方式获取子组件属性或方法 在子组件中必须 expose 
    // const getSonProperty = () => {
    //   sonName.value = setupRef.value.name 
    //   setupRef.value.handleFatherDispatch()
    // }
    expose({
      name,
      age,
      handleFatherDispatch
    })

    return {
      title,
      name,
      age,
      handleFatherDispatch
    }
  }
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68