• Vue计算属性与监视属性


    计算属性

    计算属性:

    1. 定义:要用的属性不存在,要通过已有属性计算得来。
    2. 原理:地城记住了Object.defineproperty方法提供的getter和serter。
    3. get函数什么时候执行?
      1. 初次读取f时会调用一次。

      2. 所依赖的数据发生变化时会再次调用。

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

    5. 备注:

      1. 计算属性最终会出现在vm上,直接读取使用即可。

      2. 如果计算属性被修改,那必须写set函数去相应修改,且set中有引用的计算时依赖的属性发生变化,一般情况下计算属性不会修改。

      3. 计算属性不能靠异步任务去返回返回值,因为它是靠返回值获取对应值的。

    1. <div id="root">
    2. <!-- @keyup.enter代表回车键弹起 -->
    3. 请输入姓:<input type="text" v-model="name_1">
    4. <br>
    5. 请输入名:<input type="text" v-model="name_2">
    6. <br>
    7. 输入的内容:<label>{{fullName}}</label>
    8. <hr>
    9. </div>
    10. <script>
    11. let val = "xin";
    12. const vm = new Vue({
    13. el: "#root",
    14. data: {
    15. name_1: "",
    16. name_2: ""
    17. },
    18. computed: {
    19. //------完整版写法-------
    20. fullName: {
    21. //get的作用:当读取fullName时,get就会被调用,且返回值为fullName的值。
    22. //get的调用:初次读取fullName时,所得来的数据发生变化时。
    23. get() {
    24. //此处的this是vue对象
    25. return this.name_1 + "-" + this.name_2;
    26. },
    27. //修改fullName的属性时会被调用
    28. //一般情况下计算属性不会修改
    29. set(value) {
    30. let arr = value.split("-");
    31. this.name_1=arr[0];
    32. this.name_2=arr[1];
    33. }
    34. }
    35. //-------简写版写法(只考虑读取不考虑修改时才能用简写形式)-------
    36. //与只有一个get函数的效果相同,调用方法与插值语法一样,不加括号
    37. fullName(){
    38. return this.name_1 + "-" + this.name_2;
    39. }
    40. }
    41. })
    42. </script>

    监视属性(侦听属性)

    监视属性:

    1. 被监视的属性变化时,回调函数自动调用,进行相关操作。
    2. 被监视属性必须存在才能进行监视(被监视的属性可以是计算属性)
    3. 监视属性的两种写法:
      1. new New时传入watch配置。
      2. 通过vm.$watch监视。
    1. <div id="root">
    2. <h1>今天天气很{{info}}</h1>
    3. <br>
    4. <button @click="changeWeather">点我切换</button>
    5. <hr>
    6. </div>
    7. <script>
    8. const vm = new Vue({
    9. el: "#root",
    10. data: {
    11. isHot: true
    12. },
    13. computed: {
    14. info() {
    15. return this.isHot ? "热" : "冷";
    16. }
    17. },
    18. methods: {
    19. changeWeather() {
    20. this.isHot = !this.isHot;
    21. }
    22. },
    23. watch: {
    24. //监听isHot值得改变
    25. isHot: {
    26. immediate: false, //初始化的时候自动调用handler,默认是false,旧参数值(lowValue为undefine)
    27. //isHot改变时会调用handler,第一次参数是新的值,第二个参数是旧的值。
    28. handler(newVlaue, lowValue) {
    29. console.log("isHot被改了 " + "新的值:" + newVlaue + " 旧的值:" + lowValue);
    30. }
    31. }
    32. }
    33. })
    34. //后续添加监视属性
    35. vm.$watch("isHot",{
    36. //监听isHot值得改变
    37. isHot: {
    38. immediate: false, //初始化的时候自动调用handler,默认是false,旧参数值(lowValue为undefine)
    39. //isHot改变时会调用handler,第一次参数是新的值,第二个参数是旧的值。
    40. handler(newVlaue, lowValue) {
    41. console.log("isHot被改了 " + "新的值:" + newVlaue + " 旧的值:" + lowValue);
    42. }
    43. }
    44. });
    45. </script>

    深度监视(深度侦听)

    深度监视:

    1. vue中的watch默认不监测对象内部值的改变(一层)。
    2. 配置deep:true可以监测队形内部值的改变(多层)。
    3. vue自身可以监测对象内部值的改变,但vue提供的watch默认不可以。
    4. 使用watch是根据数据的具体结构,决定是否采用深度监视。
    5. 如果使用简写方式就不能进行深度监视等操作了。
    1. <div id="root">
    2. <h1>a的值{{number.a}}</h1><br>
    3. <button @click="number.a++">改变a的值</button>
    4. <hr><br>
    5. <h1>b的值{{number.b}}</h1><br>
    6. <button @click="number.b++">改变a的值</button>
    7. <hr>
    8. </div>
    9. <script>
    10. new Vue({
    11. el: "#root",
    12. data: {
    13. number: {
    14. a: 1,
    15. b: 2
    16. }
    17. },
    18. watch: {
    19. //监测number中的属性a是否改变
    20. "number.a": {
    21. handler(){
    22. console.log("a的值改变了");
    23. }
    24. },
    25. //监测number的所有属性是否改变
    26. number:{
    27. deep:true,
    28. handler(){
    29. console.log("number有值改变了");
    30. }
    31. }
    32. }
    33. })
    34. //----------------------------后续添加监听属性-----------------------------------
    35. //正常写法
    36. vm.$watch("number",{
    37. immediate:true,
    38. deep:true,
    39. handler(newValue, lowValue){
    40. console.log("number的值改变了" + "新的值:" + newValue + " 旧的值" + lowValue);
    41. }
    42. })
    43. //简写方法
    44. vm.$watch("xin",function(newValue, lowValue){
    45. console.log("xin-的值改变了" + "新的值:" + newValue + " 旧的值" + lowValue);
    46. })
    47. </script>

     computed与watch的区别

    computed与watch的区别:

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

    两个重要的小原则:

    1. 所有被vue管理的函数,最好写成普通函数,这样this的指向才是vm或者组件实力对象。
    2. 所有不被vue管理的函数(定时器的回调函数,ajax的回调函数等),最好写成箭头函数,这样this的指向才是vm或者组件实例对象。
  • 相关阅读:
    浅谈多回路电表在荷兰光伏系统配电项目中的应用
    软件测试/测试开发丨结对编程助手 GitHubCopilot
    (0 , _login.default) is not a function ES6,小程序浮点数精度问题
    高速通信链路解决方案:万兆电口模块
    C#捕捉全局异常
    linux性能优化--性能追踪建议
    实验篇(7.2) 09. 通过安全隧道走对方宽带上网 (FortiClient-IPsec) ❀ 远程访问
    CMake 官方完整版
    阿里云 MSE 支持 Go 语言流量防护
    运算放大器(运放)反相放大器电路
  • 原文地址:https://blog.csdn.net/LYXlyxll/article/details/125466530