• Vue监测数据的原理(对象、数组)、Vue.set()、vm.$set()


    目录

    一、Vue监测数据的原理---对象

    二、Vue.set()

    1.Vue.set()

    其他用法

    2.vm.$set(target,key,val)

    3.重要注意:

     二、Vue监测数据的原理---数组

    1.push()

    2.shift

     3.splice()

    三、总结

    总结:Vue监视数据的原理



    为什么我们要研究一下Vue监测数据的原理?

         以防我们后续在给data赋值或者修改data中数据时导致修改不成功

      比如下面这个例子:

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8">
    5. <title> 初识vuetitle>
    6. <script type="text/javascript" src="../js/vue.js">script>
    7. head>
    8. <body>
    9. <div id="root">
    10. <h2>人员列表h2>
    11. <button @click="updateMei">更改马冬梅信息button>
    12. <ul>
    13. <li v-for="(p,index) in persons" :key="p.id" >
    14. {{p.name}}-{{p.age}}-{{p.sex}}
    15. li>
    16. ul>
    17. div>
    18. <script type="text/javascript">
    19. //阻止vue在启动时生成生产提示
    20. Vue.config.productionTip=false
    21. const vm= new Vue({
    22. el:'#root',
    23. data:{
    24. persons:[
    25. {id:'001',name:'马冬梅',age:19,sex:'女'},
    26. {id:'002',name:'周冬雨',age:20,sex:'女'},
    27. {id:'003',name:'周杰伦',age:21,sex:'男'},
    28. {id:'004',name:'温兆伦',age:22,sex:'男'}
    29. ],
    30. },
    31. methods: {
    32. updateMei(){
    33. this.persons[0].name = '马老师'
    34. this.persons[0].age = 50,
    35. this.persons[0].sex = '男'
    36. }
    37. },
    38. })
    39. script>
    40. body>
    41. html>

    当我们点击按钮之后,会发生下面这种情况

     我们不难发现:页面中的内容修改了,Vue中的数据也修改了

    但是如果我们把代码中的数据改成下面这个样子:

    1. methods: {
    2. updateMei(){
    3. //this.persons[0].name = '马老师'
    4. //this.persons[0].age = 50,
    5. //this.persons[0].sex = '男'
    6. this.persons[0] ={id:'001',name:'马老师',age:50,sex:'男'}
    7. }
    8. },

    初始界面和上面还是相同的,但是我们点击按钮之后,页面和Vue并没有反应

    原因:我们直接操作的数组的索引值,用赋值的方式去改(具体参照Vue监测数据的原理---数组)

            数组中 persons[0]  persons[1]  persons[2].....这种没有getter和setter,但是persons[0]  persons[1]里面的属性有getter和setter,比如name、age、sex都会有getter和setter

    修改成下面这个样子:

     所以我们就要研究一下Vue监测数据的原理

    一、Vue监测数据的原理---对象

    过程:

    对于上面监视对象的例子我们不难发现,只要我们有对象,就会有getter和setter

    二、Vue.set()

    1.Vue.set()

      我们在代码中没有写某个对象,但是在后期我们想添加上

       比如下面这种情形

      我们在页面的Vue中给学生添加一个性别,我们不难发现我们新添加的这个性别没有getter和setter

     

    那如果我们前期没添加,但是后期又想添加怎么把?

     API给我提供了一个Vue.set(target,key,val)方法

       target:我们要往谁的身上追加一个属性

       key:往target身上加一个什么属性

       val:值

    虽然我们是后天添加,但是我们依然享有getter和setter

    其他用法

    2.vm.$set(target,key,val)

    另外一种方法:

    3.重要注意:

     案例:我们要点击一个按钮,给学生追加性别

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8">
    5. <title> 初识vuetitle>
    6. <script type="text/javascript" src="../js/vue.js">script>
    7. head>
    8. <body>
    9. <div id="root">
    10. <h1>学校信息h1>
    11. <h2>学校名称:{{name}}h2>
    12. <h2>学校地址:{{address}}h2>
    13. <hr/>
    14. <h1>学生信息h1>
    15. <button @click="addSex" >添加一个学校信息,默认值是男button>
    16. <h2>学生姓名:{{student.name}}h2>
    17. <h2>学生性别:{{student.sex}}h2>
    18. <h2>学生年龄:真实{{student.age.rAge}},对外{{student.age.sAge}}h2>
    19. <hr/>
    20. <ul>
    21. <li v-for="(f,index) in student.friends">
    22. {{f.name}}---{{f.age}}
    23. li>
    24. ul>
    25. div>
    26. body>
    27. <script type="text/javascript">
    28. //阻止vue在启动时生成生产提示
    29. Vue.config.productionTip=false
    30. const vm= new Vue({
    31. el:'#root',
    32. data:{
    33. name:'尚硅谷',
    34. address:'北京',
    35. student:{
    36. name:'tom',
    37. // sex:'男',
    38. age:{
    39. // 真实年龄
    40. rAge:40,
    41. sAge:29
    42. },
    43. friends:[
    44. {name:'jerry',age:35},
    45. {name:'tony',age:36}
    46. ]
    47. },
    48. },
    49. methods: {
    50. addSex(){
    51. Vue.set(this.student,'sex','男')
    52. }
    53. },
    54. })
    55. script>
    56. html>

    不难发现,我们上面那个案例成功了

    但是!!!!!我们现在要变一下,我们不给data里面的对象追加属性了,我们给data追加!

    不难发现,出错了!

    结论:Vue.set不能给data追加属性(也不能给vm 追加),但是可以给data里面的对象追加属性

     二、Vue监测数据的原理---数组

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8">
    5. <title> 初识vuetitle>
    6. <script type="text/javascript" src="../js/vue.js">script>
    7. head>
    8. <body>
    9. <div id="root">
    10. <h1>学校信息h1>
    11. <h2>学校名称:{{school.name}}h2>
    12. <h2>学校地址:{{school.address}}h2>
    13. <h2>校长是:{{school.leader}}
    14. <hr/>
    15. <h1>学生信息h1>
    16. <button @click="addSex" >添加一个学校信息,默认值是男button>
    17. <h2>学生姓名:{{student.name}}h2>
    18. <h2>学生性别:{{student.sex}}h2>
    19. <h2>学生年龄:真实{{student.age.rAge}},对外{{student.age.sAge}}h2>
    20. <hr/>
    21. <h1>爱好h1>
    22. <ul>
    23. <li v-for="(h,index) in student.hobby">
    24. {{h}}
    25. li>
    26. ul>
    27. <h1>朋友们h1>
    28. <ul>
    29. <li v-for="(f,index) in student.friends">
    30. {{f.name}}---{{f.age}}
    31. li>
    32. ul>
    33. div>
    34. body>
    35. <script type="text/javascript">
    36. //阻止vue在启动时生成生产提示
    37. Vue.config.productionTip=false
    38. const vm= new Vue({
    39. el:'#root',
    40. data:{
    41. school:{
    42. name:'尚硅谷',
    43. address:'北京'
    44. },
    45. student:{
    46. name:'tom',
    47. // sex:'男',
    48. age:{
    49. // 真实年龄
    50. rAge:40,
    51. sAge:29
    52. },
    53. hobby:['抽烟','喝酒','烫头'],
    54. friends:[
    55. {name:'jerry',age:35},
    56. {name:'tony',age:36}
    57. ]
    58. },
    59. },
    60. methods: {
    61. addSex(){
    62. Vue.set(this.student,'sex','男')
    63. }
    64. },
    65. })
    66. script>
    67. html>

    注意看,我们的爱好写成的是一个数组的形式,我们在下面观察,我们并没有发现爱好的getter和setter(如果把爱好的属性写成对象的模式,会有getter和setter),那说明我们直接修改数组的话,页面的内容可能不会改变

    那我们怎么修改数组呢?

    1.push()




       这个push已经和我们以前学的数组的push有一点不一样了

      下面这个是数组中的push




    2.shift

     3.splice()

    参数0 代表数组的下标   参数1 代表干掉   参数‘打台球’代表替换成打台球

    三、总结

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="UTF-8">
    5. <title> 初识vuetitle>
    6. <script type="text/javascript" src="../js/vue.js">script>
    7. head>
    8. <body>
    9. <div id="root">
    10. <button @click="student.age++">年龄+1岁button><br/>
    11. <button @click="addSex">添加性别属性,默认值:男button><br/>
    12. <button @click="addFriend">在列表首位添加一个朋友button><br/>
    13. <button @click="updateFirstFriendName">修改第一个好友的名字button><br/>
    14. <button @click="addHobby">添加一个爱好button><br/>
    15. <button @click="updateHobby">修改第一个爱好为:开车button><br/>
    16. <h1>学生信息h1>
    17. <h2>学生姓名:{{student.name}}h2>
    18. <h2>学生年龄:{{student.age}}h2>
    19. <h2 v-if="student.sex">学生性别:{{student.sex}}h2>
    20. <hr/>
    21. <h1>爱好h1>
    22. <ul>
    23. <li v-for="(h,index) in student.hobby">
    24. {{h}}
    25. li>
    26. ul>
    27. <h1>朋友们h1>
    28. <ul>
    29. <li v-for="(f,index) in student.friends">
    30. {{f.name}}---{{f.age}}
    31. li>
    32. ul>
    33. div>
    34. body>
    35. <script type="text/javascript">
    36. //阻止vue在启动时生成生产提示
    37. Vue.config.productionTip=false
    38. const vm= new Vue({
    39. el:'#root',
    40. data:{
    41. student:{
    42. name:'tom',
    43. // sex:'男',
    44. age:18,
    45. hobby:['抽烟','喝酒','烫头'],
    46. friends:[
    47. {name:'jerry',age:35},
    48. {name:'tony',age:36}
    49. ]
    50. },
    51. },
    52. methods: {
    53. addSex(){
    54. Vue.set(this.student,"sex",'男')
    55. },
    56. addFriend(){
    57. // 往前面加一个
    58. this.student.friends.unshift({name:'jack',age:70})
    59. },
    60. updateFirstFriendName(){
    61. // 下面注释这么写就费了
    62. // this.student.friends[0] ='123'
    63. this.student.friends[0].name ='张三'
    64. },
    65. addHobby(){
    66. this.student.hobby.push('学习')
    67. },
    68. updateHobby(){
    69. // 从第0个开始,删除一个,并再加入一个开车
    70. // this.student.hobby.splice(0,1,'开车')
    71. // 将数组中的下标为0的修改为开车
    72. Vue.set(this.student.hobby,0,'开车')
    73. }
    74. },
    75. })
    76. script>
    77. html>

    总结:Vue监视数据的原理

      1.vue会监视data中所有层次的数据

      2.如何检测对象中的数据?

         通过setter实现监视,且要在new Vue时就传入要监测的数据

            ①对象中后追加的属性,Vue默认不做响应式处理

            ②如需给后添加的属性做响应式处理,需要下面的API

    3. 如何监测数组中额的数据?

          通过包裹数组更新元素的方法实现,本质就是做了两件事:

             ①调用原生对应的方法对数组进行更新

             ②重新解析模板,进而更新页面

    4.在Vue修改数组中的某个元素一定要用如下方法

  • 相关阅读:
    RS485接线方式
    如何快速实现一个颜色选择器
    【Flutter】Flutter 中 sqflite 的基本使用
    Inductor characater
    L6.linux命令每日一练 -- 第二章 文件和目录操作命令 -- touch和ls命令
    服务器上一个域名对应多个前端项目的nginx转发配置
    计算机、通信及信号处理领域各单位的期刊与会议分级
    java笔记37,Lambda表达式
    Google Guava精讲(一)-Guava是什么?能做什么?
    java学习day22(网络编程)网络编程
  • 原文地址:https://blog.csdn.net/weixin_51351637/article/details/126670260