美文网首页
vue2.0常用知识点与实践总结

vue2.0常用知识点与实践总结

作者: 冬猫咚咚锵 | 来源:发表于2018-12-26 12:31 被阅读0次
  1. vue实例
  2. 模板语法
    2.1 插值
    2.2 指令
  3. 计算属性和侦听器
  4. Class 与 Style 绑定
  5. 条件渲染
  6. 列表渲染:
    v-for
    变更检测
  7. 事件处理
    事件修饰符
    按键修饰符
    自定义事件
  8. 表单输入绑定
    v-model
  9. 组件
    DOM 模板解析注意事项
    data 必须是函数
    组件组合
    编写可复用组件
  10. 过度&动画
  11. 总结
    参考文档

1. vue实例

  • 只有当实例被创建时 data 中存在的属性才是响应式的。这里唯一的例外是使用 Object.freeze(),这会阻止修改现有的属性,也意味着响应系统无法再追踪变化。
  • 除了数据属性,Vue 实例还暴露了一些有用的实例属性与方法。它们都有前缀 $,以便与用户定义的属性区分开来
  • 生命周期:生命周期钩子的 this 上下文指向调用它的 Vue 实例。
不要在选项属性或回调上使用箭头函数,比如 
created: () => console.log(this.a) 或 vm.$watch('a', newValue => this.myMethod())。
因为箭头函数是和父级上下文绑定在一起的,this 不会是如你所预期的 Vue 实例,经常导致 Uncaught TypeError: Cannot read property of undefined 或 Uncaught TypeError: this.myMethod is not a function 之类的错误。

2. 模板语法

2.1 插值

文本

<span>Message: {{ msg }}</span>

无论何时,绑定的数据对象上 msg 属性发生了改变,插值处的内容都会更新。

通过使用 v-once 指令,你也能执行一次性地插值,当数据改变时,插值处的内容不会更新。

原始 HTML

为了输出真正的 HTML,你需要使用 v-html 指令.

你的站点上动态渲染的任意 HTML 可能会非常危险,因为它很容易导致 XSS 攻击。请只对可信内容使用 HTML 插值,绝不要对用户提供的内容使用插值。

特性

Mustache 语法不能作用在 HTML 特性上,遇到这种情况应该使用 v-bind 指令

使用 JavaScript 表达式

每个绑定都只能包含单个表达式

{{ number + 1 }}

{{ ok ? 'YES' : 'NO' }}

{{ message.split('').reverse().join('') }}

<div v-bind:id="'list-' + id"></div>

2.2 指令

指令 (Directives) 是带有 v- 前缀的特殊属性。指令属性的值预期是单个 JavaScript 表达式 (v-for 是例外情况,稍后我们再讨论)。指令的职责是,当表达式的值改变时,将其产生的连带影响,响应式地作用于 DOM。

3. 计算属性和侦听器

当你有一些数据需要随着其它数据变动而变动时,你很容易滥用 watch——通常更好的做法是使用计算属性而不是命令式的 watch 回调

4. Class 与 Style 绑定

  • v-bind 用于 class 和 style 时,Vue.js 做了专门的增强。表达式结果的类型除了字符串之外,还可以是对象或数组。

5. 条件渲染

如果需要非常频繁地切换,则使用 v-show 较好;如果在运行时条件很少改变,则使用 v-if 较好。

当 v-if 与 v-for 一起使用时,v-for 具有比 v-if 更高的优先级。

6. 列表渲染:

v-for

  • 可对数组和对象进行遍历,在遍历对象时,是按 Object.keys() 的结果遍历,但是不能保证它的结果在不同的 JavaScript 引擎下是一致的。
  • 默认用“就地复用”策略,所以建议尽可能在使用 v-for 时提供 key,除非遍历输出的 DOM 内容非常简单,或者是刻意依赖默认行为以获取性能上的提升。

变更检测

  • 由于 JavaScript 的限制,Vue 不能检测以下变动的数组:

当你利用索引直接设置一个项时,例如:vm.items[indexOfItem] = newValue
当你修改数组的长度时,例如:vm.items.length = newLength

为了解决第一类问题,以下两种方式都可以实现和 vm.items[indexOfItem] = newValue 相同的效果,同时也将触发状态更新:

// Vue.set
Vue.set(example1.items, indexOfItem, newValue)

// Array.prototype.splice
example1.items.splice(indexOfItem, 1, newValue)

为了解决第二类问题,你可以使用 splice

example1.items.splice(newLength)
  • Vue 不能检测对象属性的添加或删除:

7. 事件处理

事件修饰符

使用修饰符时,顺序很重要;相应的代码会以同样的顺序产生。因此,用 v-on:click.prevent.self 会阻止所有的点击,而 v-on:click.self.prevent 只会阻止对元素自身的点击。

按键修饰符

有一些按键 (.esc 以及所有的方向键) 在 IE9 中有不同的 key 值, 如果你想支持 IE9,它们的内置别名应该是首选。

自定义事件

自定义是指父组件在引用子组件时在其上绑定的事件,其名称由子组件提供,而不是子组件上有个自定义的事件

8.表单输入绑定

v-model

  • v-model 会忽略所有表单元素的 value、checked、selected 特性的初始值而总是将 Vue 实例的数据作为数据来源。你应该通过 JavaScript 在组件的 data 选项中声明初始值。
  • 对于需要使用输入法 (如中文、日文、韩文等) 的语言,你会发现 v-model 不会在输入法组合文字过程中得到更新。如果你也想处理这个过程,请使用 input 事件。

9. 组件

DOM 模板解析注意事项

Vue 只有在浏览器解析、规范化模板之后才能获取其内容,请尽可能使用字符串模板。

data 必须是函数

如果多个组件实例共享了同一个 data 对象,那么改变一个会影响所有组件

组件组合

  • 父子组件的关系可以总结为 prop 向下传递,事件向上传递。父组件通过 prop 给子组件下发数据,子组件通过事件给父组件发送消息。
  • 当使用的不是字符串模板时,camelCase (驼峰式命名) 的 prop 需要转换为相对应的 kebab-case (短横线分隔式命名)

编写可复用组件

可复用组件应当定义一个清晰的公开接口,同时也不要对其使用的外层数据作出任何假设。

Vue 组件的 API 来自三部分——prop、事件和插槽:

  • Prop 允许外部环境传递数据给组件;
  • 事件允许从组件内触发外部环境的副作用;
  • 插槽允许外部环境将额外的内容组合在组件中。

10.过度&动画

Vue 在插入、更新或者移除 DOM 时,提供多种不同方式的应用过渡效果。
包括以下工具:

  • 在 CSS 过渡和动画中自动应用 class
  • 可以配合使用第三方 CSS 动画库,如 Animate.css
  • 在过渡钩子函数中使用 JavaScript 直接操作 DOM
  • 可以配合使用第三方 JavaScript 动画库,如 Velocity.js

11. 总结

根据近期的工作实践,以下几点是常常导致项目问题,但容易被使用者忽略的:

  • 意识到生命周期的影响:如prop 会在一个组件实例创建之前进行验证,所以实例的属性 (如 data、computed 等) 在 default 或 validator 函数中是不可用的。
  • 关注数据流动的方向:所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不建议。这样可以防止从子组件意外改变父级组件的状态,从而导致你的应用的数据流向难以理解。
  • 同名优先级:对于绝大多数特性来说,从外部提供给组件的值会替换掉组件内部设置好的值。所以如果传入 type="text" 就会替换掉 type="date" 并把它破坏!庆幸的是,class 和 style 特性会稍微智能一些,即两边的值会被合并起来,从而得到最终的值:form-control date-picker-theme-dark。
  • 大小写敏感:组件和prop在引用时大写改-,跟组件和 prop 不同,事件名不存在任何自动化的大小写转换,myEvent 不可能被监听到,我们推荐你始终使用 kebab-case 的事件名。
  • 各种默认行为,如一个组件上的 v-model 默认会利用名为 value 的 prop 和名为 input 的事件
  • 变化检测:
    • Vue 不能检测到对象属性的添加或删除。由于 Vue 会在初始化实例时对属性执行 getter/setter 转化过程,所以属性必须在 data 对象上存在才能让 Vue 转换它,这样才能让它是响应的
    • 添加到对象上的新属性不会触发更新。在这种情况下可以创建一个新的对象,让它包含原对象的属性和新的属性:this.someObject = Object.assign({}, this.someObject, { a: 1, b: 2 })
  • 引用型对象的操作,导致的对其他组件的影响
  • 命名规范的要求:当注册组件 (或者 prop) 时,可以使用 kebab-case (短横线分隔命名)、camelCase (驼峰式命名) 或 PascalCase (单词首字母大写命名),在 HTML 模板中,请使用 kebab-case。

参考文档

相关文章

网友评论

      本文标题:vue2.0常用知识点与实践总结

      本文链接:https://www.haomeiwen.com/subject/drhhlqtx.html