Reactivity API: Asosiy
Qarang
Reactivity API'larini yaxshiroq tushunish uchun qo'llanmaning quyidagi bo'limlarini o'qish tavsiya etiladi:
- Reaktivlik Asoslari (API afzalligi Composition API ga o'rnatilgan)
- Reaktivlik Chuqurroq
ref()
Ichki qiymatni oladi va unga ishora qiluvchi .value
xususiyatiga ega bo'lgan reaktiv va o'zgartirilishi mumkin bo'lgan ref ob'ektini qaytaradi.
Turi
tsfunction ref<T>(value: T): Ref<UnwrapRef<T>> interface Ref<T> { value: T }
Tafsilotlar
Ref ob'ekti o'zgartirilishi mumkin - ya'ni
.value
ga yangi qiymatlarni tayinlashingiz mumkin. U shuningdek reaktiv - ya'ni.value
ga har qanday o'qish operatsiyalari kuzatiladi va yozish operatsiyalari tegishli effektlarni ishga tushiradi.Agar ob'ekt ref qiymati sifatida tayinlangan bo'lsa, ob'ekt reactive() yordamida chuqur reaktiv qilinadi. Bu shuningdek ob'ekt ichki ref'larni o'z ichiga olsa, ular chuqur ravishda ochilishini anglatadi.
Chuqur konvertatsiyani oldini olish uchun o'rniga
shallowRef()
dan foydalaning.Misol
jsconst count = ref(0) console.log(count.value) // 0 count.value = 1 console.log(count.value) // 1
Qarang
computed()
Getter funksiyasi ni oladi va getter dan qaytarilgan qiymat uchun faqat o'qish uchun reaktiv ref ob'ektini qaytaradi. U shuningdek yozish mumkin bo'lgan ref ob'ektini yaratish uchun get
va set
funksiyalariga ega ob'ektni ham qabul qilishi mumkin.
Turi
ts// faqat o'qish uchun function computed<T>( getter: (oldValue: T | undefined) => T, // "Computed Debugging" havolasiga qarang debuggerOptions?: DebuggerOptions ): Readonly<Ref<Readonly<T>>> // yozish mumkin function computed<T>( options: { get: (oldValue: T | undefined) => T set: (value: T) => void }, debuggerOptions?: DebuggerOptions ): Ref<T>
Misol
Faqat o'qish uchun computed ref yaratish:
jsconst count = ref(1) const plusOne = computed(() => count.value + 1) console.log(plusOne.value) // 2 plusOne.value++ // xato
Yozish mumkin bo'lgan computed ref yaratish:
jsconst count = ref(1) const plusOne = computed({ get: () => count.value + 1, set: (val) => { count.value = val - 1 } }) plusOne.value = 1 console.log(count.value) // 0
Debugging:
jsconst plusOne = computed(() => count.value + 1, { onTrack(e) { debugger }, onTrigger(e) { debugger } })
Qarang
reactive()
Ob'ektning reaktiv proxy'sini qaytaradi.
Turi
tsfunction reactive<T extends object>(target: T): UnwrapNestedRefs<T>
Tafsilotlar
Reaktiv konvertatsiya "chuqur": u barcha ichki xususiyatlarni ta'sir qiladi. Reaktiv ob'ekt shuningdek reaktivlikni saqlab qolgan holda ref bo'lgan har qanday xususiyatlarni chuqur ravishda ochadi.
Shuni ham ta'kidlash kerakki, ref reaktiv massiv elementi yoki
Map
kabi native to'plam turi sifatida kirishda ref ochilishi amalga oshirilmaydi.Chuqur konvertatsiyani oldini olish va faqat ildiz darajasida reaktivlikni saqlab qolish uchun o'rniga shallowReactive() dan foydalaning.
Qaytarilgan ob'ekt va uning ichki ob'ektlari ES Proxy bilan o'ralgan va original ob'ektlarga teng emas. Faqat reaktiv proxy bilan ishlash va original ob'ektga tayanmaslik tavsiya etiladi.
Misol
Reaktiv ob'ekt yaratish:
jsconst obj = reactive({ count: 0 }) obj.count++
Ref ochish:
tsconst count = ref(1) const obj = reactive({ count }) // ref ochiladi console.log(obj.count === count.value) // true // bu `obj.count` ni yangilaydi count.value++ console.log(count.value) // 2 console.log(obj.count) // 2 // bu ham `count` ref'ini yangilaydi obj.count++ console.log(obj.count) // 3 console.log(count.value) // 3
E'tibor bering, ref'lar massiv yoki to'plam elementlari sifatida kirishda ochilmaydi:
jsconst books = reactive([ref('Vue 3 Guide')]) // bu yerda .value kerak console.log(books[0].value) const map = reactive(new Map([['count', ref(0)]])) // bu yerda .value kerak console.log(map.get('count').value)
ref ni
reactive
xususiyatiga tayinlaganda, o'sha ref ham avtomatik ravishda ochiladi:tsconst count = ref(1) const obj = reactive({}) obj.count = count console.log(obj.count) // 1 console.log(obj.count === count.value) // true
Qarang
readonly()
Ob'ektni (reaktiv yoki oddiy) yoki ref ni oladi va originalga faqat o'qish uchun proxy qaytaradi.
Turi
tsfunction readonly<T extends object>( target: T ): DeepReadonly<UnwrapNestedRefs<T>>
Tafsilotlar
Faqat o'qish uchun proxy chuqur: kirish uchun har qanday ichki xususiyat ham faqat o'qish uchun bo'ladi. U shuningdek
reactive()
bilan bir xil ref-ochish xatti-harakatiga ega, faqat ochilgan qiymatlar ham faqat o'qish uchun qilinadi.Chuqur konvertatsiyani oldini olish uchun o'rniga shallowReadonly() dan foydalaning.
Misol
jsconst original = reactive({ count: 0 }) const copy = readonly(original) watchEffect(() => { // reaktivlik kuzatish uchun ishlaydi console.log(copy.count) }) // originalni o'zgartirish copy'ga tayanuvchi kuzatuvchilarni ishga tushiradi original.count++ // copy'ni o'zgartirish xatolikni keltirib chiqaradi va ogohlantirish beradi copy.count++ // ogohlantirish!
watchEffect()
Funksiyani darhol ishga tushiradi va uning bog'liqliklarini reaktiv ravishda kuzatadi va bog'liqliklar o'zgarganda uni qayta ishga tushiradi.
Turi
tsfunction watchEffect( effect: (onCleanup: OnCleanup) => void, options?: WatchEffectOptions ): WatchHandle type OnCleanup = (cleanupFn: () => void) => void interface WatchEffectOptions { flush?: 'pre' | 'post' | 'sync' // default: 'pre' onTrack?: (event: DebuggerEvent) => void onTrigger?: (event: DebuggerEvent) => void } interface WatchHandle { (): void // chaqirilishi mumkin, `stop` bilan bir xil pause: () => void resume: () => void stop: () => void }
Tafsilotlar
Birinchi argument ishga tushirilishi kerak bo'lgan effekt funksiyasi. Effekt funksiyasi tozalash callback'ini ro'yxatdan o'tkazish uchun ishlatilishi mumkin bo'lgan funksiyani oladi. Tozalash callback'i keyingi marta effekt qayta ishga tushirilishidan oldin chaqiriladi va bekor qilingan yon effektlarni, masalan kutilayotgan async so'rovni tozalash uchun ishlatilishi mumkin (quyidagi misolga qarang).
Ikkinchi argument effektning tozalash vaqtini sozlash yoki effektning bog'liqliklarini debug qilish uchun ishlatilishi mumkin bo'lgan ixtiyoriy opsiyalar ob'ekti.
Default bo'yicha, kuzatuvchilar komponent renderlashidan oldin ishga tushadi.
flush: 'post'
ni o'rnatish kuzatuvchini komponent renderlashidan keyin kechiktirishga olib keladi. Batafsil ma'lumot uchun Callback Tozalash Vaqti ga qarang. Kamdan-kam hollarda, reaktiv bog'liqlik o'zgarganda kuzatuvchini darhol ishga tushirish kerak bo'lishi mumkin, masalan keshni bekor qilish uchun. Buflush: 'sync'
yordamida amalga oshirilishi mumkin. Biroq, bu sozlash ehtiyotkorlik bilan ishlatilishi kerak, chunki bir vaqtning o'zida bir nechta xususiyatlar yangilanganda ishlash va ma'lumotlar izchilligi bilan bog'liq muammolarga olib kelishi mumkin.Qaytarilgan qiymat effektni yana ishga tushirishni to'xtatish uchun chaqirilishi mumkin bo'lgan handle funksiyasi.
Misol
jsconst count = ref(0) watchEffect(() => console.log(count.value)) // -> 0 ni log qiladi count.value++ // -> 1 ni log qiladi
Kuzatuvchini to'xtatish:
jsconst stop = watchEffect(() => {}) // kuzatuvchi endi kerak bo'lmaganda: stop()
Kuzatuvchini pauza qilish / davom ettirish:
jsconst { stop, pause, resume } = watchEffect(() => {}) // kuzatuvchini vaqtincha pauza qilish pause() // keyinroq davom ettirish resume() // to'xtatish stop()
Yon effektni tozalash:
jswatchEffect(async (onCleanup) => { const { response, cancel } = doAsyncWork(newId) // `cancel` `id` o'zgarsa chaqiriladi, oldingi so'rov // hali tugallanmagan bo'lsa uni bekor qiladi onCleanup(cancel) data.value = await response })
3.5+ da yon effektni tozalash:
jsimport { onWatcherCleanup } from 'vue' watchEffect(async () => { const { response, cancel } = doAsyncWork(newId) // `cancel` `id` o'zgarsa chaqiriladi, oldingi so'rov // hali tugallanmagan bo'lsa uni bekor qiladi onWatcherCleanup(cancel) data.value = await response })
Opsiyalar:
jswatchEffect(() => {}, { flush: 'post', onTrack(e) { debugger }, onTrigger(e) { debugger } })
Qarang
watchPostEffect()
flush: 'post'
opsiyasi bilan watchEffect()
ning taxallusi.
watchSyncEffect()
flush: 'sync'
opsiyasi bilan watchEffect()
ning taxallusi.
watch()
Bir yoki bir nechta reaktiv ma'lumotlar manbalarini kuzatadi va manbalar o'zgarganda callback funksiyasini chaqiradi.
Turi
ts// bitta manbani kuzatish function watch<T>( source: WatchSource<T>, callback: WatchCallback<T>, options?: WatchOptions ): WatchHandle // bir nechta manbalarni kuzatish function watch<T>( sources: WatchSource<T>[], callback: WatchCallback<T[]>, options?: WatchOptions ): WatchHandle type WatchCallback<T> = ( value: T, oldValue: T, onCleanup: (cleanupFn: () => void) => void ) => void type WatchSource<T> = | Ref<T> // ref | (() => T) // getter | (T extends object ? T : never) // reaktiv ob'ekt interface WatchOptions extends WatchEffectOptions { immediate?: boolean // default: false deep?: boolean | number // default: false flush?: 'pre' | 'post' | 'sync' // default: 'pre' onTrack?: (event: DebuggerEvent) => void onTrigger?: (event: DebuggerEvent) => void once?: boolean // default: false (3.4+) } interface WatchHandle { (): void // chaqirilishi mumkin, `stop` bilan bir xil pause: () => void resume: () => void stop: () => void }
Turlar o'qilish uchun soddalashtirilgan.
Tafsilotlar
watch()
default bo'yicha dangasa - ya'ni callback faqat kuzatilayotgan manba o'zgarganda chaqiriladi.Birinchi argument kuzatuvchining manbasi. Manba quyidagilardan biri bo'lishi mumkin:
- Qiymat qaytaradigan getter funksiyasi
- Ref
- Reaktiv ob'ekt
- ...yoki yuqoridagilarning massivi.
Ikkinchi argument manba o'zgarganda chaqiriladigan callback. Callback uchta argument oladi: yangi qiymat, eski qiymat va yon effekt tozalash callback'ini ro'yxatdan o'tkazish uchun funksiya. Tozalash callback'i keyingi marta effekt qayta ishga tushirilishidan oldin chaqiriladi va bekor qilingan yon effektlarni, masalan kutilayotgan async so'rovni tozalash uchun ishlatilishi mumkin.
Bir nechta manbalarni kuzatganda, callback manba massiviga mos keluvchi yangi / eski qiymatlarni o'z ichiga olgan ikkita massiv oladi.
Uchinchi ixtiyoriy argument quyidagi opsiyalarni qo'llab-quvvatlovchi opsiyalar ob'ekti:
immediate
: kuzatuvchi yaratilganda callback'ni darhol ishga tushirish. Birinchi chaqiruvda eski qiymatundefined
bo'ladi.deep
: agar ob'ekt bo'lsa, manbani chuqur o'tishni majburlash, shunda callback chuqur o'zgarishlarda ishga tushadi. 3.5+ da, bu maksimal o'tish chuqurligini ko'rsatuvchi raqam ham bo'lishi mumkin. Chuqur Kuzatuvchilar ga qarang.flush
: callback'ning tozalash vaqtini sozlash. Callback Tozalash Vaqti vawatchEffect()
ga qarang.onTrack / onTrigger
: kuzatuvchining bog'liqliklarini debug qilish. Kuzatuvchi Debugging ga qarang.once
: (3.4+) callback'ni faqat bir marta ishga tushirish. Kuzatuvchi birinchi callback ishga tushirilgandan keyin avtomatik ravishda to'xtatiladi.
watchEffect()
bilan taqqoslaganda,watch()
bizga quyidagilarni imkon beradi:- Yon effektni dangasa amalga oshirish;
- Kuzatuvchi qayta ishga tushirilishi kerak bo'lgan holat haqida aniqroq bo'lish;
- Kuzatilayotgan holatning oldingi va joriy qiymatiga kirish.
Misol
Getter'ni kuzatish:
jsconst state = reactive({ count: 0 }) watch( () => state.count, (count, prevCount) => { /* ... */ } )
Ref'ni kuzatish:
jsconst count = ref(0) watch(count, (count, prevCount) => { /* ... */ })
Bir nechta manbalarni kuzatganda, callback manba massiviga mos keluvchi yangi / eski qiymatlarni o'z ichiga olgan massivlarni oladi:
jswatch([fooRef, barRef], ([foo, bar], [prevFoo, prevBar]) => { /* ... */ })
Getter manbasini ishlatganda, kuzatuvchi faqat getter'ning qaytarilgan qiymati o'zgarganda ishga tushadi. Agar callback chuqur o'zgarishlarda ham ishga tushishini xohlasangiz,
{ deep: true }
bilan kuzatuvchini chuqur rejimga majburlashingiz kerak. Chuqur rejimda, callback chuqur o'zgarish tufayli ishga tushirilganda yangi qiymat va eski qiymat bir xil ob'ekt bo'ladi:jsconst state = reactive({ count: 0 }) watch( () => state, (newValue, oldValue) => { // newValue === oldValue }, { deep: true } )
Reaktiv ob'ektni to'g'ridan-to'g'ri kuzatganda, kuzatuvchi avtomatik ravishda chuqur rejimda:
jsconst state = reactive({ count: 0 }) watch(state, () => { /* state ga chuqur o'zgarishda ishga tushadi */ })
watch()
watchEffect()
bilan bir xil tozalash vaqti va debugging opsiyalarini baham ko'radi:jswatch(source, callback, { flush: 'post', onTrack(e) { debugger }, onTrigger(e) { debugger } })
Kuzatuvchini to'xtatish:
jsconst stop = watch(source, callback) // kuzatuvchi endi kerak bo'lmaganda: stop()
Kuzatuvchini pauza qilish / davom ettirish:
jsconst { stop, pause, resume } = watch(() => {}) // kuzatuvchini vaqtincha pauza qilish pause() // keyinroq davom ettirish resume() // to'xtatish stop()
Yon effektni tozalash:
jswatch(id, async (newId, oldId, onCleanup) => { const { response, cancel } = doAsyncWork(newId) // `cancel` `id` o'zgarsa chaqiriladi, oldingi so'rov // hali tugallanmagan bo'lsa uni bekor qiladi onCleanup(cancel) data.value = await response })
3.5+ da yon effektni tozalash:
jsimport { onWatcherCleanup } from 'vue' watch(id, async (newId) => { const { response, cancel } = doAsyncWork(newId) onWatcherCleanup(cancel) data.value = await response })
Qarang
onWatcherCleanup()
Joriy kuzatuvchi qayta ishga tushirilishidan oldin bajarilishi kerak bo'lgan tozalash funksiyasini ro'yxatdan o'tkazadi. Faqat watchEffect
effekt funksiyasi yoki watch
callback funksiyasining sinxron bajarilishi paytida chaqirilishi mumkin (ya'ni u async funksiyada await
dan keyin chaqirilishi mumkin emas.)
Turi
tsfunction onWatcherCleanup( cleanupFn: () => void, failSilently?: boolean ): void
Misol
tsimport { watch, onWatcherCleanup } from 'vue' watch(id, (newId) => { const { response, cancel } = doAsyncWork(newId) // `cancel` `id` o'zgarsa chaqiriladi, oldingi so'rov // hali tugallanmagan bo'lsa uni bekor qiladi onWatcherCleanup(cancel) })