Vuejs的数据驱动与组件


数据响应原理:

有一份数据a.b,在一个vue对象的实例化过程中,会给a.b这份数据通过ES5的Object.defineProperty属性添加了一个getter和setter,同时vuejs对模板做编译,解析生成一个指令对象(v-text=“a.b”),每一个指令对象都会关联一个Watcher,当我们的指令对应的表达式a.b做求值的时候,就会触发了它的getter,这里就会把依赖收集到Wathcer里面,当我们再次改变a.b的值的时候,我们就会触发它的setter,会通知到对应关联的Watcher,然后Watcher就会再次对a.b求值,算对比新旧值,当发现值改变了,Watcher又会通知到指令,让指令的update方法,由于指令是对DOM的封装,所以它就会调用原生DOM的方法去更新视图。

Vuejs基础知识点:

1.挂载点:指Vue实例中的el属性对应的id所对应的DOM节点。

2.模板:在挂载点内部的内容都叫作模板内容。

3.Vue实例:指定一个挂载点,填充一个模板内容,Vue会自动地结合你的模板和数据生成最终要展示的内容,然后会把这个内容放在挂载点之中。

4.“{{ xxx }}”的语法叫作插值表达式,里面可以放赋值、取值、三元表达式。

5.Vue的相关指令都是写在模板里的,所以也称作模板指令。

6.在Vue中,如果你想改变数据的显示,不要去改变DOM,你直接去改变数据就可以了。当数据发生变化的时候,Vue会自动地帮你去更新DOM,页面也就跟着变化了。

7.只要是模板指令等号后面跟着的内容不再是一个字符串了,而是一个JavaScript表达式,但是它特殊的地方在于这个表达式里的变量指的是Vue实例中data属性下的变量。

8.computed指的是一个属性通过其它属性计算而来,它有一个好处是如果其它属性全都没有改变,它会使用上一次计算属性的缓存结果,只有当其它属性中至少有一个值发生改变的时候才会重新计算,所以它的性能是比较高的。

9.watch侦听器:监测某一个数据或者计算属性发生了变化,一旦发生了变化,我们就可以在侦听器里面去写一些业务逻辑。

10.如果需要频繁地切换DOM元素的显示或隐藏,用v-show是一个比v-if更好的选择,因为每一次它不会去销毁DOM再重新创建DOM,所以它的性能相对更高一些,但是如果DOM元素的显示或隐藏的频率不是那么大,你只需要做一次显示或者隐藏,那这个时候用v-if是一个更好的选择。

11.建议尽可能在使用v-for时提供key,它会提升每一项渲染的效率,除非遍历输出的 DOM 内容非常简单,或者是刻意依赖默认行为以获取性能上的提升。(key值要求每一项数据的key值都不相同,偶尔可以使用index下标作为key值)

12.每一个Vue组件都是一个Vue的实例,反过来每一个Vue的实例也都是一个Vue组件。

13.父子组件之间的交互:

(1)父→子:父组件通过属性的形式向子组件传递一些数据。

(2)子→父:子组件通过发布订阅的模式,也就是说,子组件发布一个事件,父组件恰好之前就已经订阅了这个事件,那么子组件就可以通过发布订阅模式向父组件传递一些数据了。

14.箭头函数:

(1)去掉function关键字。

(2)参数只有一个可以省略小括号,小括号和大括号之间有一个箭头。

(3)如果没有大括号则直接是返回值,有大括号必须要写return。

15.vm == ViewModel,data中的数据会被vm所代理,还可以通过vm.xx取到对应的数据内容。

16.过滤器:原数据不变的情况下,只是改变显示的效果。

17.template标签是Vue提供给我们的没有任何的实际意义,只是用来包裹元素的,并且v-show不支持template,只对v-if有效。

18.默认情况下,在切换DOM时相同的结构会被复用,如果不需要复用,需要添加key属性。

19.watch默认只监控一层的数据变化,如果需要监控多层数据,需采用深度监控{handler(){},deep: true}。

20.如果DOM元素不是通过v-for循环出来的,$refs只能获取到一个元素,而通过v-for循环出来的可以获取多个。

21.如果数据变化后想获取真实DOM中的内容,需要等待页面渲染完成后再去获取,所以所有的DOM操作最好放在$.nextTick()中;

22.局部组件三部曲:1.创建组件  2.注册组件  3.引用组件

23.组件是相互独立的,不能直接跨作用域,实例也是一个组件,组件中拥有生命周期函数。但是如果多个组件之间共用了数据,会导致多个组件同时更新。

24.ref属性如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素;如果用在子组件上,引用就指向组件实例。

25.当子组件和父组件同时有用mounted方法时,需要等到子组件挂载完成后再触发父组件的挂载。

路由功能:

1.前后端分离:后端只负责提供数据接口供前端调用,页面的跳转都是由前端自己来处理。

(1)hash模式:开发时使用hash方式不会导致页面出现404,但是hash方式不支持SEO。

(2)HTML5的pushState API:正式上线时使用pushState方式。