1, ref
ref
Akzeptieren Sie einen internen Wert und geben Sie ein responsives und veränderliches Ref-Objekt zurück, das Ref-Objekt hat nur eine .value
Eigenschaft , die auf den internen Wert zeigt;
<script setup>
const refValue = ref('refValue')
console.log(refValue) // ref 对象
console.log(refValue.value) // refValue
</script>
ref
Die deklarierte Variable, wir können die Variable direkt imhtml
Code , aber im js-Code müssen wir.value
darauf zugreifen, weil die inref
definierte eine responsive zurückgibtref 对象
und auf das Objekt.
über ;ref
Es wird im Allgemeinen verwendet, um grundlegende Datentypen zu deklarieren.Natürlich kann auch ein Objekt deklariert werden, aber es muss.value.xxx
über , und es wird vonreactive
der Funktion ;ref
Es kann auch verwendet werden, um DOM zu erhalten, die spezifische Verwendung ist wie folgt;
<script setup>
const inputRef = ref(null)
// setup 是包含了 beforeCreate 和 created,这个阶段还没挂载实例,所以需要在 mounted 中获取
onMounted(() => {
if (inputRef && inputRef.value) {
inputRef.value.focus()
}
})
</script>
<template>
<input type="text" ref="inputRef">
</template>
2, reaktiv
reactive
soll eine ansprechende Kopie eines Objekts zurückgeben, proxy
das Objekt ;
<script setup>
const reactiveObj = { name: 'reactiveValue' }
const reactiveValue = reactive(reactiveObj)
console.log(reactiveValue, reactiveValue.name) // proxy 代理对象 reactiveValue
const reactiveRef = ref(0)
const reactiveRefValue = reactive(reactiveRef)
reactiveRef.value++
console.log(reactiveRef.value === reactiveRefValue.value) // true
reactiveRefValue.value++
console.log(reactiveRef.value === reactiveRefValue.value) // true
</script>
reactive
Die deklarierte Variable gibt einproxy
Objekt wir die Variable ändern, ändert sich auch das Zielobjekt entsprechend;reactive
Es wird im Allgemeinen verwendet, um komplexe Objekttypen zu deklarieren, und kann nicht verwendet werden, um grundlegende Datentypen zu deklarieren. Wenn ein grundlegender Datentyp deklariert wird, gibt es eine Kopie eines grundlegenden Datentyps zurück, keinproxy
Objekt . Das Ändern seines Werts wird einen Fehler melden;- Wenn der übergebene Wert ein
ref
object ,reactive
werden alle tiefen entpackt,refs
während die Reaktionsfähigkeit der ref beibehalten wird, d. h.reactive
eine Änderung des Werts des entsprechendenref
Objekts ändert sich ebenfalls entsprechend;
3, schreibgeschützt
readonly
Ein Nur-Lese-Proxy , der ein Objekt akzeptiert (reaktiv oder einfach) ref
oder das ursprüngliche Objekt zurückgibt Nur-Lese-Proxys sind tief: Alle verschachtelten Eigenschaften, auf die zugegriffen wird, sind ebenfalls schreibgeschützt;
<script setup>
const readObj = { count: 0 }
const readRef = ref(0)
const readReac = reactive({ count: 0 })
const readRefValue1 = readonly(readObj)
const readRefValue2 = readonly(readRef)
const readRefValue3 = readonly(readReac)
const updateReadOnly = () => {
readObj.count++
readRef.value++
readReac.count++
// 修改失败并会在控制台发出警告
readRefValue1.count++
readRefValue2.value++
readRefValue3.count++
}
</script>
4、flachReaktiv
shallowReactive
Erstellt einen reaktiven Proxy , der die Reaktivität seiner eigenen Eigenschaft verfolgt, aber keine tiefen reaktiven Transformationen von verschachtelten Objekten durchführt (Primitivwerte offenlegt).
<script setup>
const shallowObj = {
name: 'shallowObj',
age: 10,
nested: {
name: 'nested',
bar: 2
}
}
const shallowReactiveValue = shallowReactive(shallowObj)
const updateShallowReactive = () => {
// shallowReactiveValue.age++
shallowReactiveValue.nested.bar++
}
</script>
- Wenn die äußere Eigenschaft
shallowReactiveValue
von geändert wird , ändert sich die Seite entsprechend, d. h. die äußere Eigenschaft reagiert, abernested
wenn das verschachtelte Objekt geändert wird, wird die Seite nicht aktualisiert, d. h. das Objekt reagiert nicht; - Wenn zwei Eigenschaften gleichzeitig geändert werden, wird die Ansicht aktualisiert, da die reagierende Eigenschaft die Ansicht aktualisiert, um den neuesten Wert zu erhalten;
reactive
Im Gegensatz zuref
wird jede Eigenschaft, die verwendet, nicht automatisch vom Proxy entpackt;- Wenn das übergebene Objekt reaktiv ist, sind seine tief verschachtelten Eigenschaften ebenfalls reaktiv;
Schlussfolgerung: Der Unterschied zwischen shallowReactive und Reactive besteht darin, dass es nur die Eigenschaften der äußeren Schicht reaktionsfähig macht und die Eigenschaften von verschachtelten Objekten (gewöhnlichen Objekten) nicht reaktionsfähig sind;
5. ShallowReadonly
shallowReadonly
Erstellt eine proxy
, die ihre eigene Eigenschaft schreibgeschützt macht, aber keine tiefen schreibgeschützten Konvertierungen von verschachtelten Objekten durchführt (Primitivwerte verfügbar macht).
<script setup>
// 传入普通对象
const readOnlyObj = {
age: 10,
nested: {
age: 2
}
}
const shallowReadonlyValue0 = shallowReadonly(readOnlyObj)
const updateShallowReadonly0 = () => {
// 修改失败并会在控制台发出警告
// shallowReadonlyValue.age++
shallowReadonlyValue0.nested.age++
}
// 传入 reactive 声明的变量
const readOnlyReactive = reactive({
age: 10,
nested: {
age: 2
}
})
const shallowReadonlyValue1 = shallowReadonly(readOnlyReactive)
const updateShallowReadonly1 = () => {
// 修改失败并会在控制台发出警告
// shallowReadonlyValue.age++
shallowReadonlyValue1.nested.age++
}
</script>
- Wenn das eingehende Objekt ein gewöhnliches Objekt ist, können die äußeren Eigenschaften des Objekts nicht geändert werden, aber die Eigenschaften des verschachtelten Objekts können geändert werden, aber es reagiert nicht, und das Zielobjekt ändert sich;
- Wenn das eingehende Objekt
reactive
ein Objekt , können die äußeren Eigenschaften des Objekts nicht geändert werden, aber das Ändern der verschachtelten Eigenschaften des Objekts reagiert immer noch, und das Zielobjekt ändert sich ebenfalls entsprechend; readonly
Im Gegensatz zuref
wird jede Eigenschaft, die verwendet, nicht automatisch vom Proxy entpackt;
6、flachRef
shallowRef
Erstellen Sie eine , die .value
Änderungen ref
, aber ihren Wert nicht auch responsiv macht;
<script setup>
const shallowRefReac = {
name: 'shallowRefReac',
nested: {
name: 'nested'
}
}
const shallowRefValue = shallowRef(shallowRefReac)
const updateShallowRefValue = () => {
// 值会改变,但页面不会改变,说明 .value 的值不是一个响应式的属性
shallowRefValue.value.name += '+'
// shallowRefValue.value.nested.name += '+'
// shallowRefValue自身是响应式,修改 .value 页面会变化
// shallowRefValue.value = '111'
console.log(shallowRefValue) // RefImpl
}
</script>
7, zuRef
toRef
Kann verwendet werden, um ein neues Objekt für eine Eigenschaft des reaktiven Quellobjekts zu erstellen ref
, und ref
kann dann übergeben werden, um eine reaktive Verbindung zu seiner Quelleigenschaft aufrechtzuerhalten;
<script setup>
const toRefReac = reactive({
name: 'toRef'
})
const toRefValue = toRef(toRefReac, 'name')
const updateToRefValue = () => {
toRefValue.value += '+'
console.log(toRefValue.value === toRefReac.name) // true
}
</script>
toRef
Das vom ersten Parameter übergebene Zielobjekt muss einereactive
deklarierte , und der zweite Parameter ist ein Eigenschaftsname im Zielobjekt. Wenn sein Wert geändert wird, ändert sich auch der entsprechende Eigenschaftswert des ursprünglichen Zielobjekts entsprechend der zweite Parameter ist ein Attribut, das im Zielobjekt nicht existiert, dann ist der Wert der deklarierten Variablenundefined
;toRef
Der Rückgabewert von ist einsObjectRefImpl
, wasref
sich davon unterscheidet ,ref
dass es eins zurückgibtRefImpl
;
8、zuRefs
toRefs
Konvertieren Sie das responsive Objekt in ein normales Objekt, wobei jede Eigenschaft des Ergebnisobjekts auf die entsprechende Eigenschaft des ursprünglichen Objekts zeigt ref
;
<script setup>
const toRefsReac = reactive({
name: 'toRefsReac',
nested: {
name: 'nested'
}
})
const toRefsValue = toRefs(toRefsReac)
console.log(toRefsValue) // { name: ObjectRefImpl, nested: ObjectRefImpl }
const updateToRefsValue = () => {
toRefsValue.name.value += '+'
console.log(toRefsValue.name.value === toRefsReac.name) // true
}
</script>
toRefs
Was empfangen wird, istreactive
ein Wert, der ein gemeinsames Objekt zurückgibt, und jedes Attribut des Objekts ist einObjectRefImpl
Wert, der auf das entsprechende Attribut des Zielobjekts zeigt;- Nützlich , wenn ein reaktives Objekt von einer zusammengesetzten Funktion zurückgegeben wird
toRefs
, damit die konsumierende Komponente das zurückgegebene Objekt destrukturieren/auflösen kann, ohne die Reaktivität zu verlieren;
<script setup>
// const updateUseState = () => {
// name += '+'
// age += 1
// // 值变化了,但是页面不会改变,说明解构出来的变量是不具有响应式的
// console.log(name, age)
// }
// function useState() {
// const state = reactive({
// name: 'stateName',
// age: 10
// })
// return state
// }
// 使用 toRefs
let { name, age } = useState()
const updateUseState = () => {
name.value += '+'
age.value += 1
// 值变化了,页面也会随之改变
console.log(name, age)
}
function useState() {
const state = reactive({
name: 'stateName',
age: 10
})
return toRefs(state)
}
</script>
9, berechnet
computed
Es gibt zwei Möglichkeiten, berechnete Eigenschaften in Vue3 zu deklarieren: Die eine besteht darin, eine getter
Funktion und getter
ein unveränderliches responsives ref
Objekt , die andere besteht darin, ein Objekt mit get
undset
Funktionen zu akzeptieren, um ein beschreibbares ref
Objekt ;
<script setup>
// 方式一
const reactiveValue1 = reactive({
name: 'reactiveValue1',
age: 10
})
const computedValue1 = computed(() => reactiveValue1.age + 1)
const updateComputed1 = () => {
// 修改失败,并在控制台发出警告
computedValue1.value++
console.log(computedValue1) // ComputedRefImpl
}
// 方式二
const reactiveValue2 = reactive({
name: 'reactiveValue2',
age: 10
})
const computedValue2 = computed({
get: () => reactiveValue2.age + 1,
set: (val) => reactiveValue2.age = val - 1
})
const updateReactive2 = () => {
reactiveValue2.age++
}
const updateComputed2 = () => {
// 修改成功,页面也随之变化
computedValue2.value++
console.log(computedValue2) // ComputedRefImpl
}
</script>
In Vue3 computed
wird das Deklarieren von Variablen in Form von API deklariert. Es gibt zwei Formen, eine ist , die andere ist ein Objekt getter
mit get
und . Gleichzeitig kann die API auch den zweiten Parameter übergeben , der ein Objekt ist, das Two enthält Methoden und , sie können zum Debuggen verwendet werden;set
computed
debuggerOptions
onTrack
onTrigger
10. Uhr
watch
this.$watch
Die API entspricht vollständig der optionalen API watch
, die auf eine bestimmte Datenquelle lauschen und Seiteneffekte in einer separaten Callback-Funktion ausführen muss. Standardmäßig ist sie faul – das heißt, der Callback wird nur aufgerufen, wenn sich die lauschende Quelle ändert;
(1) Abhören einer einzelnen Datenquelle
<script setup>
const watchReac = reactive({
name: 'watchReac',
nested: {
name: 'nested',
hobbies: ['篮球', '游戏']
}
})
const watchValue = ref<any>('')
// 侦听对象某一属性
watch(() => watchReac.name, (val, preVal) => {
console.log("watch: ", val, preVal)
watchValue.value = val
})
// 侦听对象的嵌套对象
// watch(() => watchReac.nested, (val, preVal) => {
// // 不会执行,需要传入第三个参数,{ deep: true }
// console.log("watch: ", val, preVal)
// watchValue.value = val
// })
// 侦听整个对象
// watch(watchReac, (val, preVal) => {
// console.log("watch: ", val, preVal)
// watchValue.value = val
// })
const updateWatchValue = () => {
watchReac.nested.name += '+'
}
</script>
Beim Abhören einer einzelnen Datenquelle umfassen die übergebenen Parameter das abhörende Objekt, die Callback-Funktion und die Konfigurationsoptionen;
- Zuhörendes Objekt: zwei Formen, eine besteht darin, dass die Pfeilfunktion ein Objekt zurückgibt, und die andere gibt das zuhörende Objekt direkt weiter;
- Callback-Funktion: zwei Parameter, die der geänderte Wert und der Wert vor der Änderung sind;
- Konfigurationsoptionen:
deep
ob tief zugehört werden soll,immediate
ob sofort ausgeführt werden soll;
(2) Abhören mehrerer Datenquellen
<script setup>
const watchReac = reactive({
name: 'watchReac',
nested: {
name: 'nested',
hobbies: ['篮球', '游戏']
}
})
const watchRef = ref(0)
const watchReacValue = ref<any>('')
const watchRefValue = ref<number>()
watch([watchReac, watchRef], ([reacVal, refVal], [preReacVal, preRefVal]) => {
watchReacValue.value = reacVal
watchRefValue.value = refVal
})
const updateWatchValue = () => {
watchReac.nested.name += '+'
watchRef.value++
}
</script>
Beim Abhören mehrerer Multidatenquellen umfassen die übergebenen Parameter Abhörobjekte, Callback-Funktionen und Konfigurationsoptionen;
- Listening-Objekt: Ein Array-Objekt muss übergeben werden, und das Array-Objekt enthält die zu überwachenden Daten;
- Rückruffunktion: zwei Parameter, die Parameter sind Array-Typen, die Werte des Arrays sind die Werte vor und nach der Änderung des hörenden Objekts, und die Reihenfolge entspricht der Reihenfolge des hörenden Objekts;
- Konfigurationsoptionen:
deep
ob tief zugehört werden soll,immediate
ob sofort ausgeführt werden soll;
11、watchEffect
Um Seiteneffekte basierend auf dem reaktiven Zustand automatisch anzuwenden und erneut anzuwenden, können wir watchEffect
die Funktion , die eine übergebene Funktion sofort ausführt, während reaktiv ihre Abhängigkeiten verfolgt und die Funktion erneut ausführt, wenn sich ihre Abhängigkeiten ändern;
<script setup>
const watchEffectRef = ref(0)
const watchEffectReac = reactive({
count: 0
})
watchEffect(() => {
console.log("watchEffect: ", watchEffectRef.value)
})
const updateWatchEffect = () => {
watchEffectReac.count++
// watchEffectRef.value++
}
</script>
watchEffect
Die Callback-Funktion wird sofort einmal ausgeführt und wird erst ausgeführt, nachdem sich die Abhängigkeit, die sie verfolgt, ändert, das heißt, wenn wir den WertwatchEffectReac
vonwatchEffect
wird der Callback von nicht ausgeführt;watchEffect
Es kann als mitimmediate
Parameternwatch
;watchEffect
Standardmäßig wird die Komponente ausgeführt, bevor die Komponente aktualisiert wird, und das Ausführungstiming kann über dieflush
Konfigurationsoptionen ;watchEffect
Der zweite Parameter kann übergeben werden, einschließlich der Konfigurationselementeflush
,onTrack
,onTrigger
;flush
: Es gibt drei Wertepre
(Standard),post
,sync
;pre
: Standardwert, wird vor dem Komponenten-Update ausgeführt;post
: Wird ausgeführt, nachdem die Komponente aktualisiert wurde;sync
: Erzwungene Effekte werden immer synchron ausgelöst;
onTrack
: aufgerufen, wenn eine reaktive Eigenschaft oder Referenz als Abhängigkeit verfolgt wird;onTrigger
: Wird aufgerufen, wenn eine Abhängigkeitsänderung einen Nebeneffekt auslöst;
Vue3 bietet auch watchPostEffect
und watchSyncEffect
zwei APIs, diese beiden sind Aliase watchEffect
von , aber der Wert vonwatcher Effect
wird auf der Basis von konfiguriert , die bzw. sind ;flush
post
sync