<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
        <script src="../js/vue.js" type="text/javascript" charset="utf-8"></script>
    </head>
    <body>
        <!--
            Vue数据监视的原理:
                1.vue会监视data中所有层次的数据
                2.如何检测【对象】中的数据?
                    通过setter实现监视,且要在new Vue时就传入要监测的数据
                        (1)对象中后追加的属性,Vue默认不做响应式处理
                        (2)如需给后面添加的属性做响应式,请使用如下API
                                Vue.set(target,index,vale)
                                Vue.$set(target,index,value)
                3.如何监测【数组】中的数据?
                    通过包裹数组更新元素的方法实现,本质就是两件事:
                        (1)调用原生对应的方法对数组进行更新
                        (2)重新解析模板,进而更新页面
                4.在Vue中修改数组中的某个元素一定要用如下方法:
                    1.使用这些API:push(),pop(),shift(),unshift(),splice(),sort(),reverse()
                    2.Vue.set()或Vue.$set()
                5.Vue.set()或Vue.$set()不能给vm或vm的根数据对象添加属性
        -->
        <div id="app">
            <h2>姓名:{{student.name}},年龄:{{student.age}}</h2>
            <h2 v-if="student.sex">性别{{student.sex}}</h2>
            <button @click="student.age++">年龄加1</button>
            <button @click="addSex">添加性别</button>
            <button @click="changeSex">改变性别</button>
            <h2>朋友们数据</h2>
            <ul>
                <li v-for="item,index in student.friends">{{item.name}}:{{item.age}}</li>
            </ul>
            <button @click="addFri">添加一个朋友</button>
            <button @click="delFri">删除一个朋友</button>
            <button @click="changeFirName">修改第一个朋友姓名</button>
            <ul>
                <li v-for="item in student.hobby">{{item}}</li>
            </ul>
            <input type="text" v-model="keyWord" @keydown.enter="addHobby" placeholder="想要添加的爱好"/>
            <button @click="addHobby">添加一个爱好</button>
            <button @click="changeHobby">修改第一个爱好</button>
            <button @click="guolv">过滤抽烟爱好</button>
            <ul>
                <li v-for="item in guolv()">{{item}}</li>
            </ul>
        </div>
        <script type="text/javascript">
            let app = new Vue({
                el:"#app",
                data:{
                    keyWord:'',
                    student:{
                        name:'tom',
                        age:20,
                        hobby:["拉屎",'睡觉','抽烟'],
                        friends:[
                            {name:'ji',age:8},
                            {name:'gi',age:10}
                        ]
                    }
                },
                methods:{
                    //添加【对象】里的属性
                    addSex(){
                        Vue.set(this.student,'sex','男')
                    },
                    changeSex(){
                        this.student.sex = '女'
                    },
                    // 添加一个【数组】里的对象 数组新添属性要用数组的七个方法,才能生成响应式数据
                    addFri(){
                        this.student.friends.push({name:'jack',age:40})
                    },
                    // 删除【数组】里的一条信息
                    delFri(){
                        this.student.friends.pop();
                    },
                    //修改【对象】里的第一个人名字
                    changeFirName(){
                        //对象.name 
                        this.student.friends[0].name = '大疤瘌'
                    },
                    //添加输入框的值
                    addHobby(e){
                        this.student.hobby.push(e.target.value)
                    },
                    //修改爱好【数组】的第一个值
                    changeHobby(){
                        Vue.set(this.student.hobby,0,'开车')
                    },
                    guolv(){
                            return this.student.hobby.filter((p)=>{
                                 return p !== '抽烟'
                            }) 
                    }
                }
            })
        </script>
    </body>
</html>