• 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

    Let it roll
  • 相关阅读:
    Vue生命周期
    事件
    改变this指向
    全屏要素
    微信小程序
    编程心得
    设计模式-单例与实例化
    第五节课 课堂总结
    作业四 分支结构
    课堂总结
  • 原文地址:https://www.cnblogs.com/WaterMealone/p/14349232.html
Copyright © 2020-2023  润新知