记Vue新手上路踩进去的坑

边 踩 边 记

  1. Vue.component新建组件的名字若为驼峰命名法如showImg,实际的标签名会自动编译为<show-Img>而不是<showImg>;全是小写的组件名则不会改编

  2. v-model用在除表单元素以外的地方没有作用,不能与v-bind:property=搞混

  3. Vue官方文档中的提醒:
    不要在选项 property 或回调上使用箭头函数,比如

    	created: () => console.log(this.a) 或 vm.$watch('a', newValue => this.myMethod())
    

    。因为箭头函数并没有 this,this 会作为变量一直向上级词法作用域查找,直至找到为止,经常导致

    Uncaught TypeError: Cannot read property of undefined 
    或
    Uncaught TypeError: this.myMethod is not a function 之类的错误。
    
  4. v-html中不能使用Vue自定义组件.因为Vue 不是基于字符串的模板引擎
    绝对不能让用户提供的内容提供v-html插值,这很容易引来xss攻击

  5. 模板表达式

{{message.split('')[1]=='I'? true : false}}
<input  v-bind:id="'list-'+id">

都被放在沙盒中,只能访问全局变量的一个白名单,如 Math 和 Date 。你不应该在模板表达式中试图访问用户定义的全局变量。(访问自定义的全局变量只会是undefind)
6. v-forv-if 当处于同一节点,v-for 的优先级比 v-if 更高,这意味着 v-if 将分别重复运行于每个 v-for 循环中。
7. 单向数据流
所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外变更父级组件的状态,从而导致你的应用的数据流向难以理解。

额外的,每次父级组件发生变更时,子组件中所有的 prop 都将会刷新为最新的值。这意味着你不应该在一个子组件内部改变 prop。如果你这样做了,Vue 会在浏览器的控制台中发出警告。

这里有两种常见的试图变更一个 prop 的情形:

这个 prop 用来传递一个初始值;这个子组件接下来希望将其作为一个本地的 prop 数据来使用。在这种情况下,最好定义一个本地的 data property 并将这个 prop 用作其初始值:

props: ['initialCounter'],
data: function () {
  return {
    counter: this.initialCounter
  }
}

这个 prop 以一种原始的值传入且需要进行转换。在这种情况下,最好使用这个 prop 的值来定义一个计算属性

props: ['size'],
computed: {
  normalizedSize: function () {
    return this.size.trim().toLowerCase()
  }
}

注意在 JavaScript 中对象和数组是通过引用传入的,所以对于一个数组或对象类型的 prop 来说,在子组件中改变变更这个对象或数组本身将会影响到父组件的状态。

双向绑定

  • 原理
    • 利用Object.defineProprty(obj,propertyName,{getter,setter})为DOM节点的属性数据创建访问器,进行数据劫持,当改变该值的时候就被监听到
    • 利用订阅者\发布者模式建立数据–>[标签元素]的一对多关系,一旦数据被监听到发生变化(如输入框事件引起的改动),则通知所有绑定该数据的标签(组件)进行视图更新(改变文字节点值)
  • 步骤和MVVM结构
    • 当新建一个vue对象new Vue({})的时候,会先将参数中的data绑定到该vue对象(vm)下,通过Object.defineProprty(this,propertyName,{getter,setter})进行数据劫持
    • 创建一个该vue组件的全局的发布者对象Dep,拥有订阅者列表和通知订阅者进行更新(调用所有列表中订阅者update)的notify()方法
    • setter中调用Dep.notify()发布更新需求,实现双向绑定
    • 通过document.createDocumentFragment()将组件下的所有DOM节点抽取出来
    • 对这些节点进行compile编译,主要任务是获取v-model属性节点的值(key),从viewmodel 即vm.data[key]处获取数据,并初步绑定到该标签元素节点上
    • !!!为每一个与data绑定的元素节点创建Watcher订阅者对象,创建时将自己添加到全局发布者的订阅列表中,拥有重新根据数据赋值的update()方法
    • 为一些元素节点增加事件监听器,在事件监听器中修改数据,就会触发访问器setter
      在这里插入图片描述

虚拟DOM

在这里插入图片描述
虚拟DOM即vue在编译模板成渲染函数时用于描述实际DOM树的简要数据结构,用于与旧虚拟DOM进行diff算法的对比(patch),实现只更新有实际变动的最优化视图更改渲染

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值