【精讲】vue中的添加数据、监测数据(data)原理及拓展、监测数组及(对象,数组)监测概括

目录

添加数据

监测数据(data)原理及拓展

监测数组及(对象,数组)监测概括


第一部分:添加数据

  <!-- 准备一个容器 -->
        <div id="root">
          <h1>公司信息</h1>
          <h2>公司名称:{ {school.name}}</h2>
          <h2>公司地址:{ {school.address}}</h2>
          
          <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>
         <!-- 利用添加的方式将校长的信息给添加进去 -->
         <h1 >校长姓名:{ {school.leader}}</h1>
          <ul>
              <li v-for="(item,index) in student.friends " :key="index">
                { {item.name}}-{ {item.age}}
            </li>
          </ul>
        </div>
        <script type="text/javascript">
            const vm = new Vue({
                el: '#root',
                data: {
                school:{
                    name:'北京科技',
                    address:'北京',
                },
                student:{
                    name:'tom',
                    age:{
                        rAge:40,
                        sAge:20
                    },
                    friends:[
                        {name:'jerry',age:34},
                        {name:'tony',age:32}
                    ]
                }
                },
                methods:{
                    addsex(){
                        // Vue.set(this.student,'sex','男') 
                        // 或者

                        this.$set(this.student,'sex','男')
                        //这里添加一个校长(注:这里添加校长,在上面必须要对data内部进行改革,利用school将公司的姓名及地址给包裹
                        //再对其进行添加数据否则会报错)与此同时,原写法是:
Vue.set(this._data.school,'leader','校长')下面的是
                        // 简写

                        Vue.set(this.school,'leader','校长')
                    }
                }
            })
        </script>

第二部分:监测数据(data)原理及拓展

<script type="text/javascript">
            let data = {
                name: '北京科技',
                address: '北京'
            }

            // Observer是一个构造函数所以我们用new去调用他,并且传入data,使它可以监测到data的实例对象
            // 创建一个监视的实例对象,用于监视data的属性变化

            const obs = new Observer(data)
            console.log(obs)
            
            // 准备一个实例对象
            let vm = {}
            vm._data = data = obs
            // Observer的意思是监测 构造函数 能够创造出一个实例对象  有一个参数是对象(Object)
            function Observer(obj) {
                // 汇总对象中所有的属性形成一个数组
                const keys = Object.keys(obj)
                //遍历
                keys.forEach((k) => {
                    Object.defineProperty(this,k, {

                        get() {
                            return obj[k]
                        },
                        set(val) {
                            console.log(`${k}被修改了,要去解析模板,生成虚拟dom。。。`)
                            obj[k] = val
                        }
                    })
                })
            }
            // vue的监测原理是通过set.属性名
            
            
            // 知识点拓展
            // 在页面中的控制台中要去获取一组数据时,可以修改其内容的语法是
            // vue.set添加数据  vm._data.student查找vue中的变量vm里面的data里面的student 
            //添加的数据的对象时sex   内容(属性值是男)   回车
            // vue.set(vm._data.student,'sex','男')
            //可以简写成 vue.set(vm.student,'sex','男')或者
            // vue.$set(vm.student,'sex','女')

第三部分:监测数组及(对象,数组)监测概括

<!--     vue监视数据的原理:
        1,vue会监视data中所有层次的数据。
        2,如何监测对象中的数据?
        通过setter实现监视,且要在new vue时就传入要监测的数据
         (1),对象中后追加的属性,vue默认不做响应式处理
         (2),如需给后添加的属性做响应式,请使用如下API:
         vue.set(target.propertyName/index.value)或
         vm.$set(target.propertyName/index.value)
         3,如何监测数组中的数据?
         通过包裹数组更新元素的方法实现,本质就是做了两件事:
         (1)调用原生对应的方法对数组进行更新
         (2),重新解析模板,进而更新页面。
         4,在vue修改数组中的某个元素一定要用如下方法:
         1,使用这些API:push(),pop(),shift(),unshift(),splice(),sort(),reverse()
         2,vue.set()或vm.$set()
         特别注意:
         vue.set()和vm.$set()不能给vm的根数据对象  添加属性!!!-->

        <div id="root">
            <ul>
                <h1>爱好</h1>
                <button @click="onclock">过滤掉爱吸烟的人</button>
                <li v-for="(item,index) of hobby" :key="index">
                    { {item}}
                </li>
            </ul>
        </div>
        <script type="text/javascript">
            const vm = new Vue({
                el:'#root',
                data:{
                    // 通过vue中的set与get是不能改变vue中页面的内容
        // 只有以下几种可以影响到vue中原数组发生变化的修改方法:push,pop,shift,unshift,splice,sort,reverse
                    //  修改案例: 对数组进行修改vm._data.hobby[0] = '打牌'
                    //修改案例2:vm._data.hobby.push('内容')

                        hobby:['抽烟','喝酒','烫头']    
                },
                methods:{
                    onclock(){
                        // 过滤掉吸烟  将数据重新返回给vue页面  filter具有筛选但不能修改某个值  用新数组覆盖旧数组
                  this.hobby = this.hobby.filter((h)=>{
                     return h !='抽烟'
                 }); 
                    }
                }
                
            })
        </script>

猜你喜欢

转载自blog.csdn.net/m0_59505309/article/details/126090856