欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vue計算屬性computed--getter和setter用法

 更新時間:2023年01月20日 10:23:44   作者:王解  
這篇文章主要介紹了vue計算屬性computed--getter和setter用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

計算屬性computed和方法methods的區(qū)別

計算屬性本質(zhì)上是包含getter和setter的方法

當獲取計算屬性時,實際上是在調(diào)用計算屬性的getter方法。vue會收集計算屬性的依賴,并緩存計算屬性的返回結果。只有當依賴變化后才會重新進行計算。

方法沒有緩存,每次調(diào)用方法都會導致重新執(zhí)行。

計算屬性的getter和setter參數(shù)固定,getter沒有參數(shù),setter只有一個參數(shù)。而方法的參數(shù)不限。

由于有以上的這些區(qū)別,因此計算屬性通常是根據(jù)已有數(shù)據(jù)得到其他數(shù)據(jù),并在得到數(shù)據(jù)的過程中不建議使用異步、當前時間、隨機數(shù)等副作用操作。

實際上,他們最重要的區(qū)別是含義上的區(qū)別。計算屬性含義上也是一個數(shù)據(jù),可以讀取也可以賦值;方法含義上是一個操作,用于處理一些事情。

計算屬性的完整寫法

      computed: {
        propsName: {
          a:['aavsx'],
          get(){
            return this.a;
          },
          set(val){
            this.a = val
          }
        },
      }

注:

1.get方法是當屬性被讀取時觸發(fā),在計算屬性中,如果計算屬性依賴沒有發(fā)生改變(例子中this.a就是計算屬性的依賴,只要this.a不發(fā)生改變,它就不會再次調(diào)用get方法),get只會調(diào)用一次,并且會將返回結果緩存起來。

2.get方法必須需要一個返回值,否者會報出以下錯誤:


3.如果set方法沒有改變get方法中的依賴(this.a),則get方法不會再次調(diào)用,而是直接使用緩存值

<template>
    <div>
    {{propsName = 'add'}} //結果是add
    {{propsName}}//結果是 a ,以為set方法沒有改變this.a這個依賴
    </div>
</template>

<script>
export default {
  data(){
    return {
      a:'a',
      b:'b'
    }
  },
  computed: {
    propsName: {
      get(){
        return this.a
      },
      set(val){
       this.b = val
      }
    },
  }
}
</script>

一般情況下,計算屬性只使用getter方法,所以計算屬性可以簡寫為:

computed: {
  propName(){
    // getter
    //必須要有返回值
  }
}

vue3計算屬性computed實現(xiàn)原理

computed實現(xiàn)原理

computed特性

computed可以傳入一個函數(shù),也可以傳入一個對象(帶有get和set方法),計算屬性返回一個計算值,該值通過value屬性訪問,當參與計算的數(shù)據(jù)發(fā)生改變,則重新計算,不發(fā)生改變,則直接返回之前緩存的值

render 只執(zhí)行了一次

   const { effect, reactive,computed } = VueReactivity

        const state = reactive({
            firstName:'s',
            lastName:'x'
        })
        let fullName = computed(()=>{
            console.log('runner')
            return state.firstName + state.lastName
        })
        console.log(fullName.value)
        console.log(fullName.value)
        console.log(fullName.value)

計算屬性返回值可以作為屬性參與effect更新

 const { effect, reactive,computed } = VueReactivity

        const state = reactive({
            firstName:'s',
            lastName:'x'
        })
       
        let fullName = computed({
            get(){
                return state.firstName + state.lastName
            },
            set(value){
                state.lastName = value
            }
        })
        fullName.value = 100
        effect(()=>{
            app.innerHTML = fullName.value
        })
        setTimeout(()=>{
            state.firstName = 'x'
        },1000)

實現(xiàn)思路

導出一個computed函數(shù),函數(shù)內(nèi)部有兩個變量getter、setter

函數(shù)傳入一個對象或者函數(shù)。

如果是函數(shù),則將該函數(shù)賦值給getter,setter賦值為一個報錯函數(shù)(即拋出錯誤)

如果是對象,則將其get和set分別賦值給getter和setter

創(chuàng)建computedRefImpl類,有兩個形參(getter、setter),在computer函數(shù)中實例化并返回該類

類中在實例的constructor構造器中通過實例化ReactiveEffect類,傳入getter,實現(xiàn)對計算屬性函數(shù)傳入的屬性的數(shù)據(jù)綁定,傳入第二個參數(shù),在數(shù)據(jù)更新完之后將_dirty標記為true,并實現(xiàn)數(shù)據(jù)更新(triggerEffects)

私有變量_dirty控制數(shù)據(jù)是否更新

其有兩個方法get value 和 set value

當調(diào)用get,讓ReactiveEffect實例運行,獲取其返回值賦值給內(nèi)部變量_value,并返回改變量,將_dirty設置為false,表示沒有新的數(shù)據(jù)改變了,可以使用緩存,判斷當前環(huán)境是否存在activeEffect,存在則進行依賴收集(調(diào)用trackEffects)

調(diào)用set則運行setter

完整代碼如下:

import { isFunction } from "@vue/shared"
import { activeEffect, trackEffects, triggerEffects,ReactiveEffect } from "./effect";

export function computed(getterOrOptions){
    let getter = null;
    let setter = null;
    let fn = ()=>{
        throw new Error("this function is onlyRead");
        
    }
    let isGetter = isFunction(getterOrOptions)
    if(isGetter){
        getter = getterOrOptions
        setter = fn
    }
    else {
        getter = getterOrOptions.get
        setter = getterOrOptions.set || fn
    }

    return new computedRefImpl(getter,setter)
}

class computedRefImpl{
    private _value = null
    private _dirty = true
    public effect = null
    public deps = null
    constructor(getter,public setter){
        this.effect = new ReactiveEffect(getter,()=>{
            if(!this._dirty){
                this._dirty = true
                triggerEffects(this.deps)
            }
        })
    }
    get value(){
        debugger
        if(activeEffect){
            // 存在effect,則進行依賴收集
            trackEffects(this.deps ||  (this.deps = new Set()) )
        }
        if(this._dirty){
            this._dirty = false
            this._value = this.effect.run()
        }
        return this._value
    }
    set value(newValue){
        this.setter(newValue)
    }
}

總結

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Vue ECharts簡易實現(xiàn)雷達圖

    Vue ECharts簡易實現(xiàn)雷達圖

    這篇文章主要介紹了基于Vue ECharts簡易實現(xiàn)雷達圖,本文通過實例代碼圖文相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • VUE2 前端實現(xiàn) 靜態(tài)二級省市聯(lián)動選擇select的示例

    VUE2 前端實現(xiàn) 靜態(tài)二級省市聯(lián)動選擇select的示例

    下面小編就為大家分享一篇VUE2 前端實現(xiàn) 靜態(tài)二級省市聯(lián)動選擇select的示例。具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • 淺談Vuex注入Vue生命周期的過程

    淺談Vuex注入Vue生命周期的過程

    這篇文章主要介紹了Vuex 注入 Vue 生命周期的過程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • Vue?element實現(xiàn)權限管理業(yè)務流程詳解

    Vue?element實現(xiàn)權限管理業(yè)務流程詳解

    目前本人再使用vue-element-admin項目時都是通過直接刪除一些用不上的路由來進行側(cè)邊欄的清除,但是其實有一個更加好的辦法來對項目的側(cè)邊欄顯示的內(nèi)用進行管理,就是權限管理,其實也不知道這個方法好不好,原理上來說時跟直接刪除該路由的方式時一樣的
    2022-08-08
  • Vue+Openlayers實現(xiàn)實時坐標點展示

    Vue+Openlayers實現(xiàn)實時坐標點展示

    這篇文章主要為大家詳細介紹了Vue+Openlayers實現(xiàn)實時坐標點展示,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Vuejs對象常用操作之取對應的值、取key和value值、轉(zhuǎn)數(shù)組及合并等

    Vuejs對象常用操作之取對應的值、取key和value值、轉(zhuǎn)數(shù)組及合并等

    最近在學Vue和javascript感覺js的好多方法都不太清楚,這里徹底總結下,這篇文章主要給大家介紹了關于Vuejs對象常用操作之取對應的值、取key和value值、轉(zhuǎn)數(shù)組及合并等的相關資料,需要的朋友可以參考下
    2024-01-01
  • vue3實現(xiàn)鼠標右鍵顯示菜單,點擊其他地方消失問題

    vue3實現(xiàn)鼠標右鍵顯示菜單,點擊其他地方消失問題

    這篇文章主要介紹了vue3實現(xiàn)鼠標右鍵顯示菜單,點擊其他地方消失問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • vue中的proxyTable反向代理(親測有用)

    vue中的proxyTable反向代理(親測有用)

    這篇文章主要介紹了vue中的proxyTable反向代理(親測有用),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • element表單驗證如何清除校驗提示語

    element表單驗證如何清除校驗提示語

    本文主要介紹了element表單驗證如何清除校驗提示語,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • uniapp實現(xiàn)省市區(qū)三級級聯(lián)選擇功能(含地區(qū)json文件)

    uniapp實現(xiàn)省市區(qū)三級級聯(lián)選擇功能(含地區(qū)json文件)

    這篇文章主要給大家介紹了關于uniapp實現(xiàn)省市區(qū)三級級聯(lián)選擇功能(含地區(qū)json文件)的相關資料,級級聯(lián)是一種常見的網(wǎng)頁交互設計,用于省市區(qū)選擇,它的目的是方便用戶在一系列選項中進行選擇,并且確保所選選項的正確性和完整性,需要的朋友可以參考下
    2024-06-06

最新評論