源码

<!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="(h,index) in student.hobby" :key="index">
                    {{h}}
                </li>
            </ul>
            <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,
                    },

                    //Vue 不会在 ._data 中为 数组 匹配 getter() setter()
                    //Vue 监视数组变化原理: 只能调用 数组.push/pop/shift/unshift/splice/sort/reverse 这7个函数(是Vue修改后的函数: 在调用原生的对应这些函数之后,然后重新解析模板...)修改,才会触发 Vue试图更新(监视数据变化了)。
                    hobby:['抽烟','喝酒','烫头'],
                    friends:[
                        {name:'jerry',age:35},
                        {name:'tony',age:36}
                    ]
                }
            },
            methods: {
                addSex(){
                    //操作对象属性:
                    // Vue.set(this.student,'sex','男') //可以为 对象/数组 修改数据.
                    //另外一种写法:
                    this.$set(this.student,'sex','男')

                    //操作数组属性:
                    //将 this.student.hobby 的第0个元素值,由原来的 抽烟 修改为 打游戏
                    // Vue.set(this.student.hobby,0,'打游戏')
                }
            }
        })
    </script>
</html>