Vue 3.0 選項(xiàng) Data

2022-04-18 14:22 更新

#data

  • 類型:Function

  • 詳細(xì):

返回組件實(shí)例的 data 對象的函數(shù)。在 data 中,我們不建議觀察具有自身狀態(tài)行為的對象,如瀏覽器 API 對象和原型 property。一個(gè)好主意是這里只有一個(gè)表示組件 data 的普通對象。

一旦觀察過,你就無法在根數(shù)據(jù)對象上添加響應(yīng)式 property。因此推薦在創(chuàng)建實(shí)例之前,就聲明所有的根級響應(yīng)式 property。

實(shí)例創(chuàng)建之后,可以通過 vm.$data 訪問原始數(shù)據(jù)對象。組件實(shí)例也代理了 data 對象上所有的 property,因此訪問 vm.a 等價(jià)于訪問 vm.$data.a

_$ 開頭的 property 不會(huì)被組件實(shí)例代理,因?yàn)樗鼈兛赡芎?Vue 內(nèi)置的 property、API 方法沖突。你可以使用例如 vm.$data._property 的方式訪問這些 property。

  • 示例:

  // 直接創(chuàng)建一個(gè)實(shí)例
  const data = { a: 1 }

  
  // 這個(gè)對象將添加到組件實(shí)例中
  const vm = Vue.createApp({
    data() {
      return data
    }
  }).mount('#app')

  
  console.log(vm.a) // => 1

注意,如果你為 data property 使用了箭頭函數(shù),則 this 不會(huì)指向這個(gè)組件的實(shí)例,不過你仍然可以將其實(shí)例作為函數(shù)的第一個(gè)參數(shù)來訪問。

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

#props

  • 類型:Array<string> | Object

  • 詳細(xì):

props 可以是數(shù)組或?qū)ο?,用于接收來自父組件的數(shù)據(jù)。props 可以是簡單的數(shù)組,或者使用對象作為替代,對象允許配置高階選項(xiàng),如類型檢測、自定義驗(yàn)證和設(shè)置默認(rèn)值。

你可以基于對象的語法使用以下選項(xiàng):

  • type:可以是下列原生構(gòu)造函數(shù)中的一種:String、Number、Boolean、Array、Object、Date、FunctionSymbol、任何自定義構(gòu)造函數(shù)、或上述內(nèi)容組成的數(shù)組。會(huì)檢查一個(gè) prop 是否是給定的類型,否則拋出警告。Prop 類型的更多信息在此。
  • defaultany 為該 prop 指定一個(gè)默認(rèn)值。如果該 prop 沒有被傳入,則換做用這個(gè)值。對象或數(shù)組的默認(rèn)值必須從一個(gè)工廠函數(shù)返回
  • requiredBoolean 義該 prop 是否是必填項(xiàng)。在非生產(chǎn)環(huán)境中,如果這個(gè)值為 truthy 且該 prop 沒有被傳入的,則一個(gè)控制臺警告將會(huì)被拋出。
  • validatorFunction 自定義驗(yàn)證函數(shù)會(huì)將該 prop 的值作為唯一的參數(shù)代入。在非生產(chǎn)環(huán)境下,如果該函數(shù)返回一個(gè) falsy 的值 (也就是驗(yàn)證失敗),一個(gè)控制臺警告將會(huì)被拋出。你可以在這里查閱更多 prop 驗(yàn)證的相關(guān)信息。

  • 示例:

  const app = Vue.createApp({})

  
  // 簡單語法
  app.component('props-demo-simple', {
    props: ['size', 'myMessage']
  })

  
  // 對象語法,提供驗(yàn)證
  app.component('props-demo-advanced', {
    props: {
      // 類型檢查
      height: Number,
      // 類型檢查 + 其他驗(yàn)證
      age: {
        type: Number,
        default: 0,
        required: true,
        validator: value => {
          return value >= 0
        }
      }
    }
  })

#computed

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

  • 詳細(xì):

計(jì)算屬性將被混入到組件實(shí)例中。所有 getter 和 setter 的 this 上下文自動(dòng)地綁定為組件實(shí)例。

注意,如果你為一個(gè)計(jì)算屬性使用了箭頭函數(shù),則 this 不會(huì)指向這個(gè)組件的實(shí)例,不過你仍然可以將其實(shí)例作為函數(shù)的第一個(gè)參數(shù)來訪問。

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

計(jì)算屬性的結(jié)果會(huì)被緩存,除非依賴的響應(yīng)式 property 變化才會(huì)重新計(jì)算。注意,如果某個(gè)依賴 (比如非響應(yīng)式 property) 在該實(shí)例范疇之外,則計(jì)算屬性是不會(huì)被更新的。

  • 示例:

  const app = Vue.createApp({
    data() {
      return { a: 1 }
    },
    computed: {
      // 僅讀取
      aDouble() {
        return this.a * 2
      },
      // 讀取和設(shè)置
      aPlus: {
        get() {
          return this.a + 1
        },
        set(v) {
          this.a = v - 1
        }
      }
    }
  })

  
  const vm = app.mount('#app')
  console.log(vm.aPlus) // => 2
  vm.aPlus = 3
  console.log(vm.a) // => 2
  console.log(vm.aDouble) // => 4

#methods

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

  • 詳細(xì):

methods 將被混入到組件實(shí)例中。可以直接通過 VM 實(shí)例訪問這些方法,或者在指令表達(dá)式中使用。方法中的 this 自動(dòng)綁定為組件實(shí)例。

注意

注意,不應(yīng)該使用箭頭函數(shù)來定義 method 函數(shù) (例如 plus:() => this.a++)。理由是箭頭函數(shù)綁定了父級作用域的上下文,所以 this 將不會(huì)按照期望指向組件實(shí)例,this.a 將是 undefined。

  • 示例:

  const app = Vue.createApp({
    data() {
      return { a: 1 }
    },
    methods: {
      plus() {
        this.a++
      }
    }
  })

  
  const vm = app.mount('#app')

  
  vm.plus()
  console.log(vm.a) // => 2

#watch

  • 類型:{ [key: string]: string | Function | Object | Array}
  • 詳細(xì):

一個(gè)對象,鍵是需要觀察的表達(dá)式,值是對應(yīng)回調(diào)函數(shù)。值也可以是方法名,或者包含選項(xiàng)的對象。組件實(shí)例將會(huì)在實(shí)例化時(shí)調(diào)用 $watch(),參閱 $watch,了解更多關(guān)于 deepimmediateflush 選項(xiàng)的信息。

  • 示例:

  const app = Vue.createApp({
    data() {
      return {
        a: 1,
        b: 2,
        c: {
          d: 4
        },
        e: 'test',
        f: 5
      }
    },
    watch: {
      a(val, oldVal) {
        console.log(`new: ${val}, old: ${oldVal}`)
      },
      // 字符串方法名
      b: 'someMethod',
      // 該回調(diào)會(huì)在任何被偵聽的對象的 property 改變時(shí)被調(diào)用,不論其被嵌套多深
      c: {
        handler(val, oldVal) {
          console.log('c changed')
        },
        deep: true
      },
      // 該回調(diào)將會(huì)在偵聽開始之后被立即調(diào)用
      e: {
        handler(val, oldVal) {
          console.log('e changed')
        },
        immediate: true
      },
      // 你可以傳入回調(diào)數(shù)組,它們會(huì)被逐一調(diào)用
      f: [
        'handle1',
        function handle2(val, oldVal) {
          console.log('handle2 triggered')
        },
        {
          handler: function handle3(val, oldVal) {
            console.log('handle3 triggered')
          }
          /* ... */
        }
      ]
    },
    methods: {
      someMethod() {
        console.log('b changed')
      },
      handle1() {
        console.log('handle 1 triggered')
      }
    }
  })

  
  const vm = app.mount('#app')

  
  vm.a = 3 // => new: 3, old: 1

注意

注意,不應(yīng)該使用箭頭函數(shù)來定義 watcher 函數(shù) (例如 searchQuery: newValue => this.updateAutocomplete(newValue))。理由是箭頭函數(shù)綁定了父級作用域的上下文,所以 this 將不會(huì)按照期望指向組件實(shí)例,this.updateAutocomplete 將是 undefined。

#emits

  • 類型:Array<string> | Object

  • 詳細(xì):

emits 可以是數(shù)組或?qū)ο?,從組件觸發(fā)自定義事件,emits 可以是簡單的數(shù)組,或者對象作為替代,允許配置和事件驗(yàn)證。

在對象語法中,每個(gè) property 的值可以為 null 或驗(yàn)證函數(shù)。驗(yàn)證函數(shù)將接收傳遞給 $emit 調(diào)用的其他參數(shù)。如果 this.$emit('foo',1) 被調(diào)用,foo 的相應(yīng)驗(yàn)證函數(shù)將接收參數(shù) 1。驗(yàn)證函數(shù)應(yīng)返回布爾值,以表示事件參數(shù)是否有效。

  • 用法:

  const app = Vue.createApp({})

  
  // 數(shù)組語法
  app.component('todo-item', {
    emits: ['check'],
    created() {
      this.$emit('check')
    }
  })

  
  // 對象語法
  app.component('reply-form', {
    emits: {
      // 沒有驗(yàn)證函數(shù)
      click: null,

  
      // 帶有驗(yàn)證函數(shù)
      submit: payload => {
        if (payload.email && payload.password) {
          return true
        } else {
          console.warn(`Invalid submit event payload!`)
          return false
        }
      }
    }
  })

注意

emits 選項(xiàng)中列出的事件不會(huì)從組件的根元素繼承,也將從 $attrs property 中移除。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號