1/30 Vue.js中的数据响应

问题

  为什么data中的数据,不能动态显示到视图上呢?

  我修改 num 为什么视图没得动静? ( this.num 与 num 的区别 )

  var num = 1

  data(){

    return {

      num:num

    }

  }

建议

  看这个之前还是得简要了解一下生命周期,我之前也写了一点生命周期,可以有缘人小小小小的参考,有些许错,应该理解上没有大问题

  https://www.cnblogs.com/WaterMealone/p/14336731.html

首先还是先总结

  只有 data中本身定义了的变量,才会被加入数据响应系统

  ( 1. 对象,必须初始化键值对 才能加入响应系统 obj = { } 是不行的,数组也是如此 )

  ( 2. 如果是对于原有对象新加入的属性 只有 $set 方法才能让该属性 加入数据响应系统  /* $set 不能作用于 $data 根节点 */  个人不推荐$set 本来可以定义的非得要 $set 一下 )


测试代码

 

 1 <!DOCTYPE html>
 2 <html lang="zh-CN">
 3 
 4 <head>
 5     <meta charset="UTF-8">
 6     <title>Vue中的数据和方法</title>
 7     <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
 8 </head>
 9 
10 <body>
11     <div id="app">
12         <h1>{{title}}</h1>
13         <p>{{obj.profile}}</p>
14         <button @click="toggle">toggle</button>
15     </div>
16 </body>
17 
18     <script>
19         var vm = new Vue({
20            el:'#app',
21            data(){
22                return{
23                    title : 'A VUE APP',
24                    obj:{}
25                }},
26                created () {
27                   Object.assign(this.obj,{
28                     profile: "This is a Vue App."
29                   }) 
30                 // 测试 this.$set(object, key, value) 这时加入了响应系统
31                 //     this.$set(this.obj, 'profile' , "This is a Vue App." ),
32                      console.log('created',this.obj)
33                   },
34                mounted () {
35                   Object.assign(this.obj,{
36                     profile: "This is a Vue test App."
37                   }) 
38                   console.log('mounted',this.obj)
39                },
40                beforeUpdate () {
41                 console.log('beforeUpdate',this.obj)
42                },
43                 methods:{
44                     toggle(){
45                         // this.title = 1, 只要你加上这一语句,那么本不应该被刷新出来的obj.profile会被显示
46 
47                         // 其实解释这个事情还是很好解释的,用生命周期函数来想 
48                         // 首先obj对象 地址是合法的 只是没有属性 profile ,
49                         // ( 1.那么只有本身在data中被实例化的数据段 才是被纳入 数据响应系统的 意思是以后如果没有其他数据更新 新添加的数据 是不会响应到页面的 )
50                         // ( 2.如果加入一个属性 profile 事情就会变成另外一个事情 )
51 
52                         // obj在 created 的时候,只是被添加对象 profile : "This is a Vue App." 对象是被添加的,没有被纳入 响应系统中
53                         // 在 mounted 时候,实例已经被绑定到了DOM节点上, 只是去根据数据渲染dom , 从而得到 "This is a Vue App."
54                         // 但是 mounted 后 修改了 其值 "This is a Vue test App." ,由于 obj.profile 没在响应系统中,所以没显示
55                         // 同理 toggle 也是如此, 只是改变了obj.proflie 的值,因为响应系统没得这个东西,所以还是不会变
56 
57                         // 但是一旦刷新本来的 title 意味着 beforeUpdate 后 重新根据 data 渲染视图,其实本质上 profile还是孤儿 没有纳入数据响应系统 只是
58                         // 被本来在响应系统中的 title给 带着走 罢了
59                         Object.assign(this.obj,{
60                          profile: "This is a Vue App for test."
61                         }) 
62                         console.log('toggle',this.obj)
63                     }
64                 }
65         });
66     </script>
67 
68 </html>

  上面的代码是通过Object.assign 实现对对象添加、属性的 , 有响应的函数和 大量的注释(狗头) 来给有缘人一个解释

  这个 注释就说得比较清楚了,希望有缘人 如果有这方面的问题 还是借着我的代码 借着F12的魔法 来自己演示一遍

  这个代码是由书中的例子的延伸,更好理解

  有错误希望大佬指正

  

参考书籍

  刘汉伟.Vue.js从入门到项目实战[M].北京:清华大学出版社,2019:61-63

 

posted @ 2021-01-30 15:33  WaterMealone  阅读(81)  评论(0编辑  收藏  举报