vue学习的第三天小结

回顾:

```

Object.defineProperty

let obj = {

  a:10

}

let a = 10;

Object.defineProperty(obj,'a',{

  get(){

    // 拦截了 对于 obj对象a属性 获取的操作

    return a;

  },

  set(val){

    // 拦截对于obj对象a 赋值的操作

    a = val;

  }

})

obj.a = 20;

new一个 vue实例

  data:{

    a:{

      a:{

        b:{}

      }

    }

  }

  vue 自动遍历(递归),data属性,将所有的 属性都 放到 getter/setter(池),设置 任意一个数据,对于setter就会拦截到,通知 watcher 自动去调用函数 render,生成 虚拟dom,跟上一次 已经缓存的虚拟dom进行比较(diff算法),得到最优渲染方案,尽量较少dom操作

  问题?

    1,对象,  对象如果是 动态添加的 监听不了 (数据变化不会刷新)

    2,数组  arr[下标]=值   arr.length = newLength

      Vue.set()

      this.$set(对象,属性,值)

      this.$set(数组,下标,值)

```

## 表单修饰符 修饰v-model

+ lazy

  将 v-model 由原来 input事件改为 change事件触发

+ number

  将v-model绑定的值,自动过滤成数字(按照parseFloat 顺序解析)(如果需要开头就是非数字字符,失去功能)

+ trim

  去除开头结尾空格

## ref  方便获取dom

```

vue 尽量不要去操作dom,以数据驱动

实例  this.$refs

      {

        box:div, //div这个dom对象

        op: p //p这个dom对象

      }

    this.$refs['box']

    this.$refs.box

```

## 侦听器 (监控 数据变化,数据变化时,回调自动触发)

新增 watch属性

什么时候用: 需要 监听一个数据变化,当这个数据变化时,我需要做其他的操作

```

新增 watch属性

let vm = new Vue({

  el:'xx',

  data:{

    msg:"a",

    obj:{

      a:10,

      b:20

    }

  },

  watch:{

    // 监听基本数据类型

    msg(newVal,oldVal){

    },

    // 监听对象属性

    'obj.a'(newVal,oldVal){

    },

    // 监听对象

    obj:{

      handler(newVal,oldVal){

      },

      deep:true //深度监听

    }

  }

})

```

## 计算属性

```

语法:

  新增 computed属性

  {

    data:{

      msg:'hello world'

    },

    computed:{

      msg2(){ // 写法是 方法 编译到实例上  是和 data中的属性一样的 值(不是函数)

        return this.msg.split('').reverse().join('');

      }

    }

  }

  注意:

    计算属性  名字 不能和 data(methods)中 已存在的 属性  重名

    计算不要去修改 计算属性的值  应该去修改 计算属性依赖的值

  如果需要修改计算属性

  计算属性 需要 使用 get和set的写法

  {

    data:{

      msg:'hello world'

    },

    computed:{

      msg2:{

        get(){

          return this.msg.split('').reverse().join('');

        },

        set(val){

           // 每一次修改  计算属性时,set触发,同时,修改的值,通过val传入

           this.msg = val;

        }

      }

    }

  }

```

## 组件

理解网页上 独立 区域(每一个标签都可以理解为是一个组件)

vue组件  组件 也是 Vue的实例(不是显式new Vue)(new Vue创建实例),实例有的方法组件都有

```

如何创建组件

  取决这个组件定义的哪里

  全局组件

    在任意其他的组件中 都可以使用

    Vue.component(组件名,{

      template: 指定当前组件的 视图

      data,

      methods,

      watch,

      computed

    })

    eg:

       let CommonHead = {

        template:`

          

            

我是公共的头部{{title}}

            

我是组件的副标题

            {{ msg }}

            {{ msg2 }}

            改变title

          

        `,

        data(){

          return {

            title:"我是标题",

            msg:'hello world'

          }

        },

        methods:{

          change(){

            this.title = "我是另一个标题"

          }

        },

        computed:{

          msg2(){

            return this.msg.split('').reverse().join('')

          }

        }

      }

      // Vue.component('CommonHead',CommonHead);

      Vue.component('common-head',CommonHead);

  局部组件

    在其他实例的 components属性中注册

    let SubHead = {

      template:`

        

          我是局部组件

        

      `

    }

    let CommonHead = {

      template:`

        

          

我是公共的头部

          

        

      `, 

      components:{

        SubHead

      }

    }

  注意:

    1,组件的data属性必须是 函数 返回 对象(组件 需要复用,如果直接是对象,那么多次使用,使用的是同一个对象,),函数返回对象(闭包),让 组件在每一次使用的时候,都一个独立空间

    2,组件的template 必须,只有一个根元素

    3,每个组件都有自己的作用域(data中数据只能在自己的template渲染,自己template中绑定方法,只能是自己这个组件methods中的)

```

你可能感兴趣的:(vue学习的第三天小结)