彻底搞懂 filterwatchcomputed
Posted 提莫队长
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了彻底搞懂 filterwatchcomputed相关的知识,希望对你有一定的参考价值。
过滤器 filter
filter
作用: 可被用于一些常见的文本格式化
使用方式:添加在 javascript 表达式的尾部,由“管道”符号指示
全局注册(
main.js
)// main.js import Vue from \'vue\'; import Demo from \'./demo.vue\'; import { Button, Modal } from \'ant-design-vue\'; import { translate } from \'@ctrip/ebk-utils\'; import { APPID } from \'@/service/config\'; Vue.config.productionTip = false; // antdv 组件 Vue.use(Button); Vue.use(Modal); // 多语言 filter Vue.filter(\'translate\', function(value) { return translate(value, APPID); }); new Vue({ render: h => h(Demo) }).$mount(\'#app\');
局部注册
<template> <p>{{ \'Key.Comment.174\' | translate }}</p> </template> <script> import { translate } from \'@ctrip/ebk-utils\'; import { APPID } from \'@/service/config\'; export default { data() { return { }; }, filters: { translate(val) { return translate(value, APPID); } } }; </script>
当全局过滤器和局部过滤器重名时,会采用局部过滤器。
Q:methods 能实现同样功能,为啥还要用filter
?
A: 过滤器可以串联
{{ message | filterA | filterB }}
filterA
被定义为接收单个参数的过滤器函数,表达式 message
的值将作为参数传入到函数中。然后继续调用同样被定义为接收单个参数的过滤器函数 filterB
,将 filterA
的结果传递到 filterB
中。
计算属性 computed
computed
作用:复杂逻辑包装的包装和复用
用法:在模板中绑定计算属性
<template>
<div>
<p>Original message: "{{ message }}"</p>
<p>Computed reversed message: "{{ reversedMessage }}"</p>
</div>
</template>
<script>
export default {
data() {
return {
message: \'hello\'
};
},
computed: {
reversedMessage: function () {
return this.message.split(\'\').reverse().join(\'\')
}
}
};
</script>
Q: methods能实现同样功能,为啥还要用computed
?
A:计算属性是基于它们的响应式依赖进行缓存的,只在相关响应式依赖发生改变时它们才会重新求值。这就意味着只要 message
还没有发生改变,多次访问 reversedMessage
计算属性会立即返回之前的计算结果,而不必再次执行函数。
相比之下,每当触发重新渲染时,调用方法将总会再次执行函数。
代码演示:
// index.vue
<template>
<div>
<p>Original message: "{{ msg }}"</p>
<button @click="handleClick">change msg</button>
<Computed :message="msg" />
<Method :message="msg" />
</div>
</template>
<script>
import Computed from \'./components/computed\';
import Method from \'./components/method\';
export default {
data() {
return {
msg: \'hello\'
};
},
components: {
Computed,
Method
},
methods: {
handleClick() {
this.msg = `hello${Math.random()}`;
}
}
};
</script>
// components/compute
<template>
<div>
<p>Computed reversed message: "{{ reversedMessage }}"</p>
<p>Computed reversed message: "{{ reversedMessage }}"</p>
<p>Computed reversed message: "{{ reversedMessage }}"</p>
</div>
</template>
<script>
export default {
props: [\'message\'],
computed: {
reversedMessage: function() {
console.log(\'computed was called\');
return this.message
.split(\'\')
.reverse()
.join(\'\');
}
}
};
</script>
// components/method
<template>
<div>
<p>Methods reversed message: "{{ reversedMessage() }}"</p>
<p>Methods reversed message: "{{ reversedMessage() }}"</p>
<p>Methods reversed message: "{{ reversedMessage() }}"</p>
</div>
</template>
<script>
export default {
props: [\'message\'],
data() {
return {};
},
methods: {
reversedMessage: function() {
console.log(\'methods was called\');
return this.message
.split(\'\')
.reverse()
.join(\'\');
}
}
};
</script>
侦听器 watch
watch
作用:可以监控一个值的变换,并调用因为变化需要执行的方法。可以通过watch动态改变关联的状态
// 当firstName值变化时,watch监听到并且执行
<template>
<div>
<h2>fullname: {{ fullName }}</h2>
<p>firstName:<input type="text" v-model="firstName" /></p>
</div>
</template>
<script>
export default {
data() {
return {
firstName: \'\',
lastName: \'Morgan\',
fullName: \'\'
};
},
watch: {
firstName(newValue) {
this.fullName = `${newValue} ${this.lastName}`;
}
}
};
</script>
handler方法和immediate属性
上面的例子是值变化时候,watch才执行,我们想让值最初时候watch就执行就用到了handler
和immediate
属性
<template>
<div>
<h2>fullName: {{ fullName }}</h2>
<p>firstName:<input type="text" v-model="firstName" /></p>
</div>
</template>
<script>
export default {
data() {
return {
firstName: \'\',
lastName: \'Morgan\',
fullName: \'\'
};
},
watch: {
firstName: {
handler(newName) {
this.fullName = newName + \' \' + this.lastName;
},
// 代表在wacth里声明了firstName这个方法之后立即先去执行handler方法,如果设置了false,那么效果和上边例子一样
immediate: true
}
}
};
</script>
deep属性(深度监听,常用语对象下面属性的改变)
<template>
<div>
<p>obj.a: {{ obj.a }}</p>
<p>obj.a: <input type="text" v-model="obj.a" /></p>
</div>
</template>
<script>
export default {
data() {
return {
obj: {
a: 123
}
};
},
watch: {
obj: {
handler(newVal) {
console.log(newVal, \'obj.a changed\');
},
immediate: true,
deep: true
}
}
};
</script>
以上是关于彻底搞懂 filterwatchcomputed的主要内容,如果未能解决你的问题,请参考以下文章
彻底搞懂CookieSessionJWT和Token(强烈推荐)《彻底搞懂CookieSessionJWT和Token|CSDN创作打卡》