0


Vue-计算属性、监视属性、深度监视、计算属性与监视属性对比

一、计算属性--姓名案例

1.函数和插值语法实现

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title> 初识vue</title>
  6. <!--引入vue 引入之后,全局就多了一个vue这个构造函数-->
  7. <script type="text/javascript" src="../js/vue.js"></script>
  8. </head>
  9. <body>
  10. <div id="root">
  11. <!-- 容器 -->
  12. 姓:<input type="text" v-model="firstName"><br/><br/>
  13. 名:<input type="text" v-model="lastName"><br/><br/>
  14. 全名:<span> {{fullName()}}</span>
  15. </div>
  16. <script type="text/javascript">
  17. //阻止vue在启动时生成生产提示
  18. Vue.config.productionTip=false
  19. new Vue({
  20. el:'#root',
  21. data:{
  22. firstName:'张',
  23. lastName:'三'
  24. },
  25. methods:{
  26. fullName(){
  27. return this.firstName+'-'+this.lastName
  28. }
  29. }
  30. })
  31. </script>
  32. </body>
  33. </html>

2.计算属性实现

计算属性:

  1. 定义:要用的属性不存在,要通过已有的属性计算得来
  2. 原理:底层借助了Object.defineproperty方法提供的gettersetter

get函数什么时候执行?

  1. 初次读取时会执行一次
  2. 当依赖的数据发生变化时会被再次调用

优势:与methods实现相比,内部有缓存机制(复用),效率更高,调试方便

备注:①计算属性最终会出现在vm上,直接读取使用即可

  1. ②如果计算属性要被修改,那必须写set函数去响应修改且set中要引起计算时依赖的数据发生改变
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title> 初识vue</title>
  6. <!--引入vue 引入之后,全局就多了一个vue这个构造函数-->
  7. <script type="text/javascript" src="../js/vue.js"></script>
  8. </head>
  9. <body>
  10. <div id="root">
  11. <!-- 容器 -->
  12. 姓:<input type="text" v-model="firstName"><br/><br/>
  13. 名:<input type="text" v-model="lastName"><br/><br/>
  14. 全名:<span> {{fullName}}</span>
  15. </div>
  16. <script type="text/javascript">
  17. //阻止vue在启动时生成生产提示
  18. Vue.config.productionTip=false
  19. const vm = new Vue({
  20. el:'#root',
  21. data:{
  22. firstName:'张',
  23. lastName:'三'
  24. },
  25. //计算属性
  26. computed:{
  27. fullName:{
  28. // get有什么作用?当有人读取fullName时,get就会被调用,且返回值就会作为fullName的值
  29. //get什么时候调用?1.初次读取fullName时 2.所依赖的数据发生变化时
  30. get(){
  31. // 在这里面的this同样指向vm实例对象
  32. return this.firstName+'-'+this.lastName
  33. },
  34. // 一定要有setter函数么?不一定,如果确定数据只需要读的话,不需要setter函数
  35. // get什么时候调用?当fullName被修改的时候
  36. set(value){
  37. const arr=value.split('-')
  38. this.firstName=arr[0]
  39. this.lastName=arr[1]
  40. }
  41. }
  42. }
  43. })
  44. </script>
  45. </body>
  46. </html>

计算属性的简写

  1. //计算属性
  2. computed:{
  3. //简写之后不用再把fullName写成一个配置对象了
  4. // 这个函数就当getter用 函数的名就是计算属性的名
  5. fullName(){
  6. // 在这里面的this同样指向vm实例对象
  7. return this.firstName+'-'+this.lastName
  8. }
  9. }

二、监视属性---天气案例

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title> 初识vue</title>
  6. <!--引入vue 引入之后,全局就多了一个vue这个构造函数-->
  7. <script type="text/javascript" src="../js/vue.js"></script>
  8. </head>
  9. <body>
  10. <div id="root">
  11. <h2>今天天气:{{info}}</h2>
  12. <button @click="changeWeather">切换天气</button>
  13. </div>
  14. <script type="text/javascript">
  15. //阻止vue在启动时生成生产提示
  16. Vue.config.productionTip=false
  17. new Vue({
  18. el:'#root',
  19. data:{
  20. isHot:true
  21. },
  22. computed:{
  23. info(){
  24. return this.isHot ? '炎热':'凉爽'
  25. }
  26. },
  27. methods: {
  28. changeWeather(){
  29. this.isHot = !this.isHot
  30. }
  31. },
  32. })
  33. </script>
  34. </body>
  35. </html>

最终实现的效果如下,当我们点击“切换天气”的时候,就会改变

1.使用监视属性编写天气案例

方法一:

  1. //阻止vue在启动时生成生产提示
  2. Vue.config.productionTip=false
  3. new Vue({
  4. el:'#root',
  5. data:{
  6. isHot:true
  7. },
  8. computed:{
  9. info(){
  10. return this.isHot ? '炎热':'凉爽'
  11. }
  12. },
  13. methods: {
  14. changeWeather(){
  15. this.isHot = !this.isHot
  16. }
  17. },
  18. watch:{
  19. // 监视谁我们就写谁的名字
  20. isHot:{
  21. // 初始化时让handler函数调用一下
  22. immediate:true,
  23. // 此函数什么时候被调用?当我们被监视的isHot改变时
  24. // 此函数有两个参数,一个参数是新值,另一个参数是老值(之前的值
  25. handler(newValue,oldValue){
  26. console.log('isHot被修改了')
  27. }
  28. }
  29. }

方法二:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title> 初识vue</title>
  6. <!--引入vue 引入之后,全局就多了一个vue这个构造函数-->
  7. <script type="text/javascript" src="../js/vue.js"></script>
  8. </head>
  9. <body>
  10. <div id="root">
  11. <h2>今天天气:{{info}}</h2>
  12. <button @click="changeWeather">切换天气</button>
  13. </div>
  14. <script type="text/javascript">
  15. //阻止vue在启动时生成生产提示
  16. Vue.config.productionTip=false
  17. const vm = new Vue({
  18. el:'#root',
  19. data:{
  20. isHot:true
  21. },
  22. computed:{
  23. info(){
  24. return this.isHot ? '炎热':'凉爽'
  25. }
  26. },
  27. methods: {
  28. changeWeather(){
  29. this.isHot = !this.isHot
  30. }
  31. },
  32. vm.$watch('isHot',{
  33. immediate: true,
  34. handler(newValue,oldValue){
  35. console.log('isHot被修改了')
  36. }
  37. })
  38. })
  39. </script>
  40. </body>
  41. </html>

2.深度监视

深度监视:

  1. Vue中的watch默认不监测对象内部值的改变(一层)
  2. 配置deeptrue可以检测对象内部值改变(多层)

备注:

  1. Vue自身可以检测对象内部值的改变,但Vue提供的watch默认不可以!
  2. 使用watch时根据数据的具体结构,是否采用深度监视

监视多级结构中某个属性的变化

  1. 监视number中的a的变化
  1. data:{
  2. isHot:true,
  3. numbers:{
  4. a:1,
  5. b:1
  6. }
  7. },

为什么这个地方会有引号?没有行不行?

不行!因为这才是正统的写法,没有引号的那种是简写形式

  1. 'numbers.a':{
  2. // 如果没有这个函数的话会被警告
  3. handler(){
  4. console.log('a被改变了!')
  5. }
  6. }

监视多级结构中所有属性的变化(深度监视)

  1. 开启深度监视,当number中的任何一个配置变了之后,就会运行handler函数
  2. deep:true,
  1. watch:{
  2. isHot:{
  3. immediate:true, //初始化时让handler调用一下
  4. // handler什么时候调用?当isHot发生变化时
  5. handler(newValue,oldValue){
  6. console.log('isHot被修改了',newValue,oldValue)
  7. }
  8. },
  9. numbers:{
  10. // 开启深度监视,当number中的任何一个配置变了之后,就会运行handler函数
  11. deep:true,
  12. handler(){
  13. console.log('numbers changes')
  14. }
  15. }
  16. }

3.监视属性简写

完整版

  1. watch:{
  2. isHot:{
  3. immediate:true, //初始化时让handler调用一下
  4. // handler什么时候调用?当isHot发生变化时
  5. handler(newValue,oldValue){
  6. console.log('isHot被修改了',newValue,oldValue)
  7. }
  8. }
  9. }

简写版

  1. 简写的**代价**就是**不能配置immediatedeep**
  1. watch:{
  2. isHot(newValue,oldValue){
  3. console.log('isHot被修改了',newValue,oldValue)
  4. }
  5. }

三、computed与watch对比

  1. 区别:
  2. computed能完成的功能,watch都可以完成
  3. watch能完成的功能,computed不一定能完成,例如watch可以进行异步操作

两个重要原则:

  1. 1.所被Vue管理的函数,最好写成普通函数,这样this的指向才是vm或组件实例对象
  2. 2.所有不被vue所管理的函数(定时器的回调函数、AJAX的回调函数等),最好写成箭头函数,这样this的指向才是vm或组件实例对象

使用watch监听--姓名案例

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title> 初识vue</title>
  6. <!--引入vue 引入之后,全局就多了一个vue这个构造函数-->
  7. <script type="text/javascript" src="../js/vue.js"></script>
  8. </head>
  9. <body>
  10. <div id="root">
  11. <!-- 容器 -->
  12. 姓:<input type="text" v-model="firstName"><br/><br/>
  13. 名:<input type="text" v-model="lastName"><br/><br/>
  14. 全名:<span> {{fullName}}</span>
  15. </div>
  16. <script type="text/javascript">
  17. //阻止vue在启动时生成生产提示
  18. Vue.config.productionTip=false
  19. const vm = new Vue({
  20. el:'#root',
  21. data:{
  22. firstName:'张',
  23. lastName:'三',
  24. fullName:'张-三'
  25. },
  26. watch:{
  27. firstName:{
  28. // 此处的newValue就是我们新输入的姓
  29. handler(newValue,oldValue){
  30. this.fullName=newValue+'-'+this.lastName
  31. }
  32. },
  33. lastName:{
  34. // 此处的newValue就是我们新输入的名
  35. handler(newValue,oldValue){
  36. this.fullName=this.firstName+'-'+newValue
  37. }
  38. }
  39. }
  40. })
  41. </script>
  42. </body>
  43. </html>

本文转载自: https://blog.csdn.net/weixin_51351637/article/details/126573593
版权归原作者 我爱布朗熊 所有, 如有侵权,请联系我们删除。

“Vue-计算属性、监视属性、深度监视、计算属性与监视属性对比”的评论:

还没有评论