Vue 3.0 选项 Data

本文介绍了Vue组件中数据管理的关键概念,包括data对象的响应式原理,props用于接收父组件数据,computed属性用于计算缓存的值,methods包含实例方法,watch用于监听数据变化,以及emits用于触发自定义事件。所有这些特性帮助构建动态和交互式的组件。
摘要由CSDN通过智能技术生成

#data

  • 类型:Function

  • 详细:

返回组件实例的 data 对象的函数。在 data 中,我们不建议观察具有自身状态行为的对象,如浏览器 API 对象和原型 property。一个好主意是这里只有一个表示组件 data 的普通对象。

一旦观察过,你就无法在根数据对象上添加响应式 property。因此推荐在创建实例之前,就声明所有的根级响应式 property。

实例创建之后,可以通过 vm.$data 访问原始数据对象。组件实例也代理了 data 对象上所有的 property,因此访问 vm.a 等价于访问 vm.$data.a

以 _ 或 $ 开头的 property 不会被组件实例代理,因为它们可能和 Vue 内置的 property、API 方法冲突。你可以使用例如 vm.$data._property 的方式访问这些 property。

  • 示例:

 
  1. // 直接创建一个实例
  2. const data = { a: 1 }
  3. // 这个对象将添加到组件实例中
  4. const vm = Vue.createApp({
  5. data() {
  6. return data
  7. }
  8. }).mount('#app')
  9. console.log(vm.a) // => 1

注意,如果你为 data property 使用了箭头函数,则 this 不会指向这个组件的实例,不过你仍然可以将其实例作为函数的第一个参数来访问。

 
  1. data: vm => ({ a: vm.myProp })

#props

  • 类型:Array<string> | Object

  • 详细:

props 可以是数组或对象,用于接收来自父组件的数据。props 可以是简单的数组,或者使用对象作为替代,对象允许配置高阶选项,如类型检测、自定义验证和设置默认值。

你可以基于对象的语法使用以下选项:

  • type:可以是下列原生构造函数中的一种:StringNumberBooleanArrayObjectDateFunctionSymbol、任何自定义构造函数、或上述内容组成的数组。会检查一个 prop 是否是给定的类型,否则抛出警告。Prop 类型的更多信息在此
  • defaultany 为该 prop 指定一个默认值。如果该 prop 没有被传入,则换做用这个值。对象或数组的默认值必须从一个工厂函数返回
  • requiredBoolean 义该 prop 是否是必填项。在非生产环境中,如果这个值为 truthy 且该 prop 没有被传入的,则一个控制台警告将会被抛出。
  • validatorFunction 自定义验证函数会将该 prop 的值作为唯一的参数代入。在非生产环境下,如果该函数返回一个 falsy 的值 (也就是验证失败),一个控制台警告将会被抛出。你可以在这里查阅更多 prop 验证的相关信息。

  • 示例:

 
  1. const app = Vue.createApp({})
  2. // 简单语法
  3. app.component('props-demo-simple', {
  4. props: ['size', 'myMessage']
  5. })
  6. // 对象语法,提供验证
  7. app.component('props-demo-advanced', {
  8. props: {
  9. // 类型检查
  10. height: Number,
  11. // 类型检查 + 其他验证
  12. age: {
  13. type: Number,
  14. default: 0,
  15. required: true,
  16. validator: value => {
  17. return value >= 0
  18. }
  19. }
  20. }
  21. })

#computed

  • 类型:{ [key: string]: Function | { get: Function, set: Function } }

  • 详细:

计算属性将被混入到组件实例中。所有 getter 和 setter 的 this 上下文自动地绑定为组件实例。

注意,如果你为一个计算属性使用了箭头函数,则 this 不会指向这个组件的实例,不过你仍然可以将其实例作为函数的第一个参数来访问。

 
  1. computed: {
  2. aDouble: vm => vm.a * 2
  3. }

计算属性的结果会被缓存,除非依赖的响应式 property 变化才会重新计算。注意,如果某个依赖 (比如非响应式 property) 在该实例范畴之外,则计算属性是不会被更新的。

  • 示例:

 
  1. const app = Vue.createApp({
  2. data() {
  3. return { a: 1 }
  4. },
  5. computed: {
  6. // 仅读取
  7. aDouble() {
  8. return this.a * 2
  9. },
  10. // 读取和设置
  11. aPlus: {
  12. get() {
  13. return this.a + 1
  14. },
  15. set(v) {
  16. this.a = v - 1
  17. }
  18. }
  19. }
  20. })
  21. const vm = app.mount('#app')
  22. console.log(vm.aPlus) // => 2
  23. vm.aPlus = 3
  24. console.log(vm.a) // => 2
  25. console.log(vm.aDouble) // => 4

#methods

  • 类型:{ [key: string]: Function }

  • 详细:

methods 将被混入到组件实例中。可以直接通过 VM 实例访问这些方法,或者在指令表达式中使用。方法中的 this 自动绑定为组件实例。

注意

注意,不应该使用箭头函数来定义 method 函数 (例如 plus:() => this.a++)。理由是箭头函数绑定了父级作用域的上下文,所以 this 将不会按照期望指向组件实例,this.a 将是 undefined。

  • 示例:

 
  1. const app = Vue.createApp({
  2. data() {
  3. return { a: 1 }
  4. },
  5. methods: {
  6. plus() {
  7. this.a++
  8. }
  9. }
  10. })
  11. const vm = app.mount('#app')
  12. vm.plus()
  13. console.log(vm.a) // => 2

#watch

  • 类型:{ [key: string]: string | Function | Object | Array}
  • 详细:

一个对象,键是需要观察的表达式,值是对应回调函数。值也可以是方法名,或者包含选项的对象。组件实例将会在实例化时调用 $watch(),参阅 $watch,了解更多关于 deepimmediate 和 flush 选项的信息。

  • 示例:

 
  1. const app = Vue.createApp({
  2. data() {
  3. return {
  4. a: 1,
  5. b: 2,
  6. c: {
  7. d: 4
  8. },
  9. e: 'test',
  10. f: 5
  11. }
  12. },
  13. watch: {
  14. a(val, oldVal) {
  15. console.log(`new: ${val}, old: ${oldVal}`)
  16. },
  17. // 字符串方法名
  18. b: 'someMethod',
  19. // 该回调会在任何被侦听的对象的 property 改变时被调用,不论其被嵌套多深
  20. c: {
  21. handler(val, oldVal) {
  22. console.log('c changed')
  23. },
  24. deep: true
  25. },
  26. // 该回调将会在侦听开始之后被立即调用
  27. e: {
  28. handler(val, oldVal) {
  29. console.log('e changed')
  30. },
  31. immediate: true
  32. },
  33. // 你可以传入回调数组,它们会被逐一调用
  34. f: [
  35. 'handle1',
  36. function handle2(val, oldVal) {
  37. console.log('handle2 triggered')
  38. },
  39. {
  40. handler: function handle3(val, oldVal) {
  41. console.log('handle3 triggered')
  42. }
  43. /* ... */
  44. }
  45. ]
  46. },
  47. methods: {
  48. someMethod() {
  49. console.log('b changed')
  50. },
  51. handle1() {
  52. console.log('handle 1 triggered')
  53. }
  54. }
  55. })
  56. const vm = app.mount('#app')
  57. vm.a = 3 // => new: 3, old: 1

注意

注意,不应该使用箭头函数来定义 watcher 函数 (例如 searchQuery: newValue => this.updateAutocomplete(newValue))。理由是箭头函数绑定了父级作用域的上下文,所以 this 将不会按照期望指向组件实例,this.updateAutocomplete 将是 undefined。

#emits

  • 类型:Array<string> | Object

  • 详细:

emits 可以是数组或对象,从组件触发自定义事件,emits 可以是简单的数组,或者对象作为替代,允许配置和事件验证。

在对象语法中,每个 property 的值可以为 null 或验证函数。验证函数将接收传递给 $emit 调用的其他参数。如果 this.$emit('foo',1) 被调用,foo 的相应验证函数将接收参数 1。验证函数应返回布尔值,以表示事件参数是否有效。

  • 用法:

 
  1. const app = Vue.createApp({})
  2. // 数组语法
  3. app.component('todo-item', {
  4. emits: ['check'],
  5. created() {
  6. this.$emit('check')
  7. }
  8. })
  9. // 对象语法
  10. app.component('reply-form', {
  11. emits: {
  12. // 没有验证函数
  13. click: null,
  14. // 带有验证函数
  15. submit: payload => {
  16. if (payload.email && payload.password) {
  17. return true
  18. } else {
  19. console.warn(`Invalid submit event payload!`)
  20. return false
  21. }
  22. }
  23. }
  24. })

注意

emits 选项中列出的事件不会从组件的根元素继承,也将从 $attrs property 中移除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值