1. Atributo calculado calculado
1.1 ¿Qué es una propiedad computada?
computed
Sí , según los cálculos realizados , sólo cuando vue
sucede .计算属性
依赖关系
缓存
相关依赖
改变
更新
<template>
<div id="example">
<p>Original message: "{
{ message }}"</p>
<p>Computed reversed message: "{
{ reversedMessage }}"</p>
</div>
</template>
<script>
export default {
name: "CT",
data() {
return {
message: "Hello",
};
},
computed: {
// 计算属性的 getter
reversedMessage: function () {
// `this` 指向 vm 实例
return this.message.split("").reverse().join("");
},
},
};
</script>
property
Las propiedades calculadas se pueden enlazar en plantillas como de costumbre . Vue
Sabe vm.reversedMessage
que depende de vm.message
, por lo que cuando vm.message
se producen cambios, todos vm.reversedMessage
los enlaces que dependen de también se actualizan. Y la mejor parte es que hemos 声明
creado esto de una manera : no hay funciones 依赖关系
para las propiedades calculadas , lo que hace que sea más fácil de probar y comprender.getter
副作用 (side effect)
1.2 computado usa la propiedad getter por defecto
vue组件
El uso reversedMessage
del atributo in vue
llamará automáticamente computed
al siguiente reversedMessage方法
.
1.3 Dependencia de respuesta calculada (caché)
computed
Cada propiedad calculada de estará activa缓存
, siempre que cambie la propiedad de la que depende la propiedad calculada, la propiedad calculada se volverá a ejecutar y la vista se actualizará. En el siguiente código, la propiedad calculadatotal
depende de las dos propiedadesa
y se volverá a ejecutarb
siempre que una de sus propiedades cambie .total
computed
Las propiedades calculadas se almacenan en caché y se usan dos veces en el código siguientetotal
, pero solo se muestran una vez en la consolacompouted total
.
<template>
<div>
<p>BT</p>
<a @click="addA()">addA</a> | <a @click="addB()">addB</a>
<p>total: {
{ total }}</p>
<p>total: {
{ total }}</p>
</div>
</template>
<script>
export default {
name: "BT",
data() {
return {
a: 1,
b: 2,
};
},
computed: {
total() {
console.log("compouted total ");
return this.a + this.b;
},
},
mounted() {
},
methods: {
addA() {
this.a++;
},
addB() {
this.b++;
},
},
};
</script>
1.4 Getters y setters para propiedades calculadas
En Vue
, computed
el atributo se puede considerar igual data
que , que se puede leer y configurar, por lo que computed
se puede dividir getter(读取)
en y setter(设值)
, en general, no hay setter
, y computed
el valor predeterminado es solo getter
, es decir, solo 读取
, no 改变设值
.
Las propiedades calculadas de Vue.js solo tienen getter de forma predeterminada, porque es el valor predeterminado, por lo que a menudo lo omitimos, como en el siguiente código:
<div id="demo">{
{ fullName }}</div>
var vm = new Vue({
el: '#demo',
data: {
firstName: 'Foo',
lastName: 'Bar'
},
computed: {
fullName: function () {
return this.firstName + ' ' + this.lastName
}
}
})
De hecho, el código completo en computado debe escribirse de la siguiente manera:
computed: {
fullName: {
get(){
return this.firstName + ' ' + this.lastName
}
}
}
establecedor de propiedades calculadas
computed: {
fullName: {
get(){
return this.firstName + ' ' + this.lastName
},
set(newVal){
console.log(newVal)
}
}
}
1.5 Resumen de propiedades calculadas
- Los atributos computacionales
computed
escritos en no sedata
reescriben en , se pueden obtener o modificardata
como los datos envm.
- Siempre que se obtenga una propiedad calculada, se activará la
get
función correspondiente - Mientras el valor dependiente (debe tener
setter
ygetter
datos de respuesta) cambie, volverá a calcular su propio valor computed
Cada propiedad calculada de estará activa缓存
, siempre que cambie la propiedad de la que depende la propiedad calculada, la propiedad calculada se volverá a ejecutar y la vista se actualizará.- Las propiedades calculadas deben tener
get
o noset
set
No reasigne la propiedad calculada en el , de lo contrario generará死循环
第一次
El valor dependiente no ha cambiado cuando se obtiene, pero lo hará默认执行一次
dos, reloj
2.1 ¿Qué escena se usa para manejar el reloj?
vue
Se watch
usa para monitorear en 数据的变化
, y algunas otras operaciones se pueden realizar una vez que ocurre un cambio.
<template>
<div>
<p>BT</p>
<a @click="addA()">addA</a> | <a @click="addB()">addB</a>
<p>a: {
{ a }}</p>
<p>b: {
{ b }}</p>
</div>
</template>
<script>
export default {
name: "BT",
data() {
return {
a: 1,
b: 2,
};
},
computed: {
},
watch: {
a() {
console.log('a watch');
}
},
mounted() {
},
methods: {
addA() {
this.a++;
},
addB() {
this.b++;
},
},
};
</script>
2.2 parámetros del reloj
watch
Es decir, cuando第一次绑定
se establece el valor, la función de monitoreo no se ejecutará y solo se ejecutará cuando cambie el valor. Si necesita第一次绑定
ejecutar la función en cualquier momento, necesita usarimmediate
atributos. Por父组件向子组件
动态传值
ejemplo , cuando el componente secundarioprops
obtieneNo
la cognición del componente principal por primera vez, también necesita ejecutar la función.handler
Método:immediate
Indica si se ejecutará cuando se vincula por primera vez en el reloj.handler
El valor indica que el método se ejecutará inmediatamente cuando se declaretrue
en el reloj. Si el valor es el mismo que el uso general , será se ejecuta cuando se utilizan los datoswatch
handler
false
watch
发生变化
deep
, cuando es necesario monitorear un对象
cambio, los métodos ordinarioswatch
no pueden monitorear对象内部属性
el cambio, solodata
los datos en él pueden ser firmes al cambio. En este momento,deep
el atributo debe configurarse深度监听
, configurarsedeep: true
,当对象的属性较多时,每个属性的变化都会执行handler
<template>
<div>
<p @click="click()">AT</p>
<BT :age="age"></BT>
</div>
</template>
<script>
import BT from "./BT.vue";
export default {
name: "AT",
components: {
BT },
data() {
return {
age: 10,
};
},
methods: {
click() {
this.age = Math.floor(Math.random() * 20 + 18);
},
},
};
</script>
<template>
<div>
<p>BT</p>
<a @click="nameChange()">nameChange</a> |
<a @click="ageChange()">ageChange</a>
<p>name: {
{ person.name }}</p>
<p>age: {
{ person.age }}</p>
</div>
</template>
<script>
export default {
name: "BT",
props: {
age: {
type: Number,
},
},
data() {
return {
person: {
name: "BT",
age: 20,
},
};
},
computed: {
},
watch: {
person: {
handler(newVal, oldVal) {
console.log("newVal: ", newVal, "oldVal: ", oldVal);
},
deep: true,
immediate: true
},
age: {
handler(newVal, oldVal) {
console.log("newVal: ", newVal, "oldVal: ", oldVal);
},
immediate: true
},
},
mounted() {
},
methods: {
nameChange() {
this.person.name = "BT" + new Date();
},
ageChange() {
this.person.age = Math.floor(Math.random() * 20 + 18);
},
},
};
</script>
2.3 Objeto de escucha
watch
Puede ser monitoreado 对象
, o puede ser monitoreado en el objeto 某个属性
. Tenga en cuenta que al escuchar un objeto, puede deep
decidir si usarlo o no configurando parámetros 深度监听
.
<template>
<div>
<p>BT</p>
<a @click="nameChange()">nameChange</a> |
<a @click="ageChange()">ageChange</a>
<p>name: {
{ person.name }}</p>
<p>age: {
{ person.age }}</p>
</div>
</template>
<script>
export default {
name: "BT",
data() {
return {
person: {
name: "BT",
age: 20,
},
};
},
computed: {
},
watch: {
person: {
handler(newVal, oldVal) {
console.log("newVal: ", newVal, "oldVal: ", oldVal);
},
deep: true
},
"person.age": {
handler(newVal, oldVal) {
console.log("newVal: ", newVal, "oldVal: ", oldVal);
},
},
},
mounted() {
},
methods: {
nameChange() {
this.person.name = "BT" + new Date();
},
ageChange() {
this.person.age = Math.floor(Math.random() * 20 + 18);
},
},
};
</script>
2.4 No use funciones de flecha
watch
No use funciones de flecha en , es decir, no use funciones de flecha para definir watcher
funciones. Debido a que el puntero en la función de flecha this
apunta al ámbito actual, para la función de flecha, el this
puntero en la función de flecha 定义时的对象
no es 函数运行时
el objeto donde se encuentra, es decir, window
el objeto en el momento de la definición global.
3. La diferencia entre reloj y computado
computed
debeget
tener un valor de retorno (return
), perowatch
return
opcionalcomputed
Soporte缓存
, solo cuando los datos dependientes cambien, el cálculo se recalcularáwatch
y el almacenamiento en caché no es compatible.Si los datos cambian, la operación correspondiente se activará directamentecomputed
Sí自定义名称
, perowatch
solo atributos监听
props
condata
el mismo nombre que en el interiorcomputed
Adecuado para operaciones complejas, perowatch
adecuado para algunas funciones consumibles, comoAjax
computed
No compatible异步
, no es válido cuandocomputed
hay operaciones asíncronas en él y no puede monitorear los cambios de datos, pero eswatch
compatible异步
computed
El valor del atributo irá de forma predeterminada缓存
, y el atributo calculado se basa en sus dependencias de respuesta缓存
, es decir, el valor calculado se basa en los datosdata
declarados o pasados por el componente principal , y la función de escucha acepta dos parámetros, el primero es , la segunda es la entradaprops中
watch
最新的值
之前的值
- Si un atributo se calcula a partir de otros atributos, generalmente se usa este atributo
依赖其他属性
,多对一
o , cuando un atributo cambia, se necesita realizar la operación correspondiente, generalmente se usa一对一
computed
一对多
watch