源码

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>Vue监测数据改变的原理</title>
        <!-- 引入Vue -->
        <script type="text/javascript" src="../js/vue.js"></script>
    </head>
    <body>
        <!-- 准备好一个容器-->
        <div id="root">
            <h1>学校信息</h1>
            <h2>学校名称:{{school.name}}</h2>
            <h2>学校地址:{{school.address}}</h2>
            <h2>校长是:{{school.leader}}</h2>
            <hr/>
            <h1>学生信息</h1>
            <button @click="addSex">添加一个性别属性,默认值是男</button>
            <h2>姓名:{{student.name}}</h2>
            <h2 v-if="student.sex">性别:{{student.sex}}</h2>
            <h2>年龄:真实{{student.age.rAge}},对外{{student.age.sAge}}</h2>
            <h2>朋友们</h2>
            <ul>
                <li v-for="(f,index) in student.friends" :key="index">
                    {{f.name}}--{{f.age}}
                </li>
            </ul>
        </div>
    </body>

    <script type="text/javascript">
        Vue.config.productionTip = false //阻止 vue 在启动时生成生产提示。

        const vm = new Vue({
            el:'#root',
            data:{
                school:{
                    name:'尚硅谷',
                    address:'北京',
                },
                student:{
                    name:'tom',
                    age:{
                        rAge:40,
                        sAge:29,
                    },
                    friends:[
                        {name:'jerry',age:35},
                        {name:'tony',age:36}
                    ]
                }
            },

            methods: {
                addSex(){
                    /*
                        vm在刚开始初始化过程中,会把 data{}对象中的数据加工到 vm._data{},然后再通过数据代理放到 vm. 中。
                        如果想在后期再追加新的属性,需要通过 Vue.set(),才能完整实现上面一句的效果: data -> vm._data -> vm.* ,只有这样才能给后加的属性修改值时被vm监测到。
                    */
                    //Vue.set 语法: Vue.set(属性,key,value) //只能给 data.属性为对象类型时,才能添加对应的 键值对
                    //methods中的方法,只要正常写,this就是指向vm
                    //Vue.set(this.student,'sex','男')

                    this.$set(this.student,'sex','男')
                }
            }
        })
    </script>
</html>