• 【Vue】06 计算属性 侦听属性


    1.9. 计算属性

    1、差值语法实现

    1. <title>姓名案例_插值语法实现</title>
    2. <script type="text/javascript" src="../js/vue.js"></script>
    3. <div id="root">
    4. 姓:<input type="text" v-model="firstName"> <br/>
    5. 名:<input type="text" v-model="lastName"> <br/>
    6. 全名:<span>{{ firstName }}-{{ lastName }}</span>
    7. </div>
    8. <script type="text/javascript">
    9. Vue.config.productionTip = false
    10. new Vue({
    11. el:'#root',
    12. data:{
    13. firstName:'张',
    14. lastName:'三'
    15. }
    16. })
    17. </script>

    2、method实现
    数据发生变化,模板就会被重新解析

    1. <title>姓名案例_methods实现</title>
    2. <script type="text/javascript" src="../js/vue.js"></script>
    3. <div id="root">
    4. 姓:<input type="text" v-model="firstName"><br/>
    5. 名:<input type="text" v-model="lastName"><br/>
    6. 全名:<span>{{ fullName() }}</span>
    7. </div>
    8. <script type="text/javascript">
    9. Vue.config.productionTip = false
    10. new Vue({
    11. el: '#root',
    12. data: {
    13. firstName: '张',
    14. lastName: '三'
    15. },
    16. methods: {
    17. fullName() {
    18. return this.firstName + '-' + this.lastName
    19. }
    20. },
    21. })
    22. </script>

    3、computed 计算属性
    1、定义:要用的属性不存在,需要通过已有属性计算得来。
    2、原理:底层借助了 Objcet.defineproperty() 方法提供的 getter setter 。
    3、get 函数什么时候执行?
            a、初次读取时会执行一次
            b、当依赖的数据发生改变时会被再次调用
    4、优势:与 methods 实现相比,内部有缓存机制(复用),效率更高,调试方便
    5、备注:
            a、计算属性最终会出现在 vm 上,直接读取使用即可。
            b、如果计算属性要被修改,那必须写 set 函数去响应修改 ,且 set 中要引起计算时依赖的数据发生改变。
            c、如果计算属性确定不考虑修改,可以使用计算属性的简写形式。

    1. <title>姓名案例_计算属性实现</title>
    2. <script type="text/javascript" src="../js/vue.js"></script>
    3. <div id="root">
    4. 姓:<input type="text" v-model="firstName"> <br/>
    5. 名:<input type="text" v-model="lastName"> <br/>
    6. 测试:<input type="text" v-model="x"> <br/> // 这里修改 不会调 fullName的get方法
    7. 全名:<span>{{fullName}}</span> <br/>
    8. <!-- 全名:<span>{{fullName}}</span> <br/> -->
    9. <!-- 全名:<span>{{fullName}}</span> <br/> -->
    10. </div>
    11. <script type="text/javascript">
    12. Vue.config.productionTip = false
    13. const vm = new Vue({
    14. el: '#root',
    15. data: {
    16. firstName:'张',
    17. lastName:'三',
    18. x:'你好'
    19. },
    20. computed: {
    21. //完整写法
    22. // fullName: {
    23. // get() {
    24. // console.log('get被调用了')
    25. // return this.firstName + '-' + this.lastName
    26. // },
    27. // set(value) {
    28. // console.log('set', value)
    29. // const arr = value.split('-')
    30. // this.firstName = arr[0]
    31. // this.lastName = arr[1]
    32. // }
    33. // }
    34. // 简写
    35. fullName() {
    36. console.log('get被调用了')
    37. return this.firstName + '-' + this.lastName
    38. }
    39. }
    40. })
    41. </script>

    1.10. 侦听属性

    1. <title>天气案例</title>
    2. <script type="text/javascript" src="../js/vue.js"></script>
    3. <div id="root">
    4. <h3>今天天气很{{ info }}</h3>
    5. <!-- 绑定事件的时候:@xxx="yyy" yyy可以写一些简单的语句 -->
    6. <!-- <button @click="isHot = !isHot">切换天气</button> -->
    7. <button @click="changeWeather">切换天气</button>
    8. </div>
    9. <script type="text/javascript">
    10. Vue.config.productionTip = false
    11. const vm = new Vue({
    12. el:'#root',
    13. data:{
    14. isHot:true,
    15. },
    16. computed:{
    17. info(){
    18. return this.isHot ? '炎热' : '凉爽'
    19. }
    20. },
    21. methods: {
    22. changeWeather(){
    23. this.isHot = !this.isHot
    24. }
    25. }
    26. })
    27. </script>

    1.10.1. 侦听属性基本用法

    watch 监视属性
    1、当被监视的属性变化时,回调函数自动调用,进行相关操作。
    2、监视的属性必须存在,才能进行监视,既可以监视data,也可以监视计算属性。
    3、配置项属性 immediate:false改为 true,则初始化时调用一次 handler(newValue,oldValue)
    4、监视有两种写法:
            a、创建 Vue 时传入 watch: {} 配置
            b、通过 vm.$watch() 监视

    1. <title>天气案例_监视属性</title>
    2. <script type="text/javascript" src="../js/vue.js"></script>
    3. <div id="root">
    4. <h2>今天天气很{{info}}</h2>
    5. <button @click="changeWeather">切换天气</button>
    6. </div>
    7. <script type="text/javascript">
    8. Vue.config.productionTip = false
    9. const vm = new Vue({
    10. el: '#root',
    11. data: {
    12. isHot: true,
    13. },
    14. computed: {
    15. info() {
    16. return this.isHot ? '炎热' : '凉爽'
    17. }
    18. },
    19. methods: {
    20. changeWeather() {
    21. this.isHot = !this.isHot
    22. }
    23. },
    24. // 方式一
    25. /* watch:{
    26. isHot:{
    27. immediate:true,
    28. handler(newValue,oldValue){
    29. console.log('isHot被修改了',newValue,oldValue)
    30. }
    31. }
    32. } */
    33. })
    34. // 方式二
    35. vm.$watch('isHot', {
    36. immediate: true, // 初始化时让handler调用一下
    37. //handler什么时候调用?当isHot发生改变时
    38. handler(newValue, oldValue) {
    39. console.log('isHot被修改了', newValue, oldValue)
    40. }
    41. })
    42. </script>

    1.10.2. 深度侦听

    1、Vue 中的 watch 默认不监测对象内部值的改变(一层)。
    2、在 watch 中配置 deep:true 可以监测对象内部值的改变(多层)。
    注意:
    1、Vue 自身可以监测对象内部值的改变,但 Vue 提供的 watch 默认不可以。
    2、使用 watch 时根据监视数据的具体结构,决定是否采用深度监视。

    1. <title>天气案例_深度监视</title>
    2. <script type="text/javascript" src="../js/vue.js"></script>
    3. <div id="root">
    4. <h3>a的值是:{{ numbers.a }}</h3>
    5. <button @click="numbers.a++">点我让a+1</button>
    6. <h3>b的值是:{{ numbers.b }}</h3>
    7. <button @click="numbers.b++">点我让b+1</button>
    8. <button @click="numbers = {a:666,b:888}">彻底替换掉numbers</button>
    9. {{numbers.c.d.e}}
    10. </div>
    11. <script type="text/javascript">
    12. Vue.config.productionTip = false
    13. const vm = new Vue({
    14. el: '#root',
    15. data: {
    16. isHot: true,
    17. numbers: {
    18. a: 1,
    19. b: 1,
    20. c: {
    21. d: {
    22. e: 100
    23. }
    24. }
    25. }
    26. },
    27. watch: {
    28. // 监视多级结构中某个属性的变化
    29. /* 'numbers.a':{
    30. handler(){
    31. console.log('a被改变了')
    32. }
    33. } */
    34. // 监视多级结构中所有属性的变化
    35. numbers: {
    36. deep: true,
    37. handler() {
    38. console.log('numbers改变了')
    39. }
    40. }
    41. }
    42. })
    43. </script>

    1.10.3. 侦听属性简写

    如果监视属性 除了handler没有其他配置项 的话,可以进行简写。

    1. <title>天气案例_监视属性_简写</title>
    2. <script type="text/javascript" src="../js/vue.js"></script>
    3. <div id="root">
    4. <h3>今天天气很{{ info }}</h3>
    5. <button @click="changeWeather">切换天气</button>
    6. </div>
    7. <script type="text/javascript">
    8. Vue.config.productionTip = false
    9. const vm = new Vue({
    10. el: '#root',
    11. data: {isHot: true,},
    12. computed: {
    13. info() {
    14. return this.isHot ? '炎热' : '凉爽'}
    15. },
    16. methods: {
    17. changeWeather() {
    18. this.isHot = !this.isHot}
    19. },
    20. watch: {
    21. // 正常写法
    22. // isHot: {
    23. // // immediate:true, //初始化时让handler调用一下
    24. // // deep:true, //深度监视
    25. // handler(newValue, oldValue) {
    26. // console.log('isHot被修改了', newValue, oldValue)
    27. // }
    28. // },
    29. //简写
    30. isHot(newValue, oldValue) {
    31. console.log('isHot被修改了', newValue, oldValue, this)
    32. }
    33. }
    34. })
    35. //正常写法
    36. // vm.$watch('isHot', {
    37. // immediate: true, //初始化时让handler调用一下
    38. // deep: true,//深度监视
    39. // handler(newValue, oldValue) {
    40. // console.log('isHot被修改了', newValue, oldValue)
    41. // }
    42. // })l
    43. //简写
    44. // vm.$watch('isHot', (newValue, oldValue) => {
    45. // console.log('isHot被修改了', newValue, oldValue, this)
    46. // })
    47. </script>

    1.10.4. 计算属性 VS 侦听属性

    computed和watch之间的区别:
    computed 能完成的功能,watch 都可以完成。
    watch 能完成的功能,computed 不一定能完成,例如watch可以进行异步操作。

    两个重要的小原则:
    ● 所有 被 Vue 管理 的函数,最好写成普通函数,这样 this 的指向才是vm或组件实例对象。
    ● 所有 不被 Vue 所管理 的函数(定时器的回调函数、ajax 的回调函数等、Promise 的回调函数),最好写成箭头函数,这样 this 的指向才是vm或组件实例对象的函数。

    使用计算属性:

    1. new Vue({
    2. el:'#root',
    3. data:{
    4. firstName:'张',
    5. lastName:'三'
    6. },
    7. computed:{
    8. fullName(){
    9. return this.firstName + '-' + this.lastName
    10. }
    11. }
    12. })

     使用监听属性:

    1. new Vue({
    2. el:'#root',
    3. data:{
    4. firstName:'张',
    5. lastName:'三',
    6. fullName:'张-三'
    7. },
    8. watch:{
    9. firstName(val){
    10. setTimeout(()=>{
    11. this.fullName = val + '-' + this.lastName
    12. },1000);
    13. },
    14. lastName(val){
    15. this.fullName = this.firstName + '-' + val
    16. }
    17. }
    18. })

  • 相关阅读:
    01背包问题
    什么是阻塞队列?如何使⽤阻塞队列来实现⽣产者-消费者模型?哪个阻塞队列最常用?
    Liunx远程调试
    读书笔记:《Effective Modern C++(C++14)》
    【强化学习论文合集】AAAI-2021 强化学习论文
    打不过就加入 | 动植物泛基因组研究(一)
    宁德时代换挡,钠电池“接力”锂电池?
    Kubernetes Node Not Ready Error
    5G引领未来,抖音小店身处风口,能否再次掀起无货源创业热潮?
    Nacos注册中心6-Client端(获取调用服务的提供者列表)
  • 原文地址:https://blog.csdn.net/qq_37308779/article/details/125493385