Vue2在团队内的分享

简介: 简要介绍Vue的相关内容

# VUE2


## 优点

* 体积小

* 运行效率高(虚拟dom,diff算法)

* 双向数据绑定

* 学习成本低,生态丰富



## 基础


#### Vue实例

```js

varvm = newVue({

 // 参数

})

```


#### 参数


   data

   props

   propsData

   computed

   methods

   watch


   el

   template

   render

   renderError


   生命周期函数


   directives // 自定义指令

   filters // 过滤器

   components // 可用组件


   parent

   mixins

   extends

   provide / inject


   ...



#### 生命周期


![生命周期](https://cdn.nlark.com/yuque/0/2021/png/22701779/1638146818471-46881d6e-7773-4b6a-ad96-a8123ac1c278.png"生命周期")

* beforeCreate(创建前),在数据观测和初始化事件还未开始


* created(创建后),完成数据观测,属性和方法的运算,初始化事件, $el 属性还没有显示出来


* beforeMount(载入前),在挂载开始之前被调用,相关的render函数首次被调用。实例已完成以下的配置:编译模板,把data里面的数据和模板生成html。注意此时还没有挂载html到页面上。


* mounted(载入后),在el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用。实例已完成以下的配置:用上面编译好的html内容替换el属性指向的DOM对象。完成模板中的html渲染到html页面中。此过程中进行ajax交互。


* beforeUpdate(更新前),在数据更新之前调用,发生在虚拟DOM重新渲染和打补丁之前。可以在该钩子中进一步地更改状态,不会触发附加的重渲染过程。


* updated(更新后),在由于数据更改导致的虚拟DOM重新渲染和打补丁之后调用。调用时,组件DOM已经更新,所以可以执行依赖于DOM的操作。然而在大多数情况下,应该避免在此期间更改状态,因为这可能会导致更新无限循环。该钩子在服务器端渲染期间不被调用。


* beforeDestroy(销毁前),在实例销毁之前调用。实例仍然完全可用。


* destroyed(销毁后),在实例销毁之后调用。调用后,所有的事件监听器会被移除,所有的子实例也会被销毁。该钩子在服务器端渲染期间不被调用。


#### 语法糖

* v-model

* v-bind

* v-on

* v-if/v-else-if/v-else

* v-show

* v-text

* v-html

* v-for

* v-slot

* v-pre

* v-cloak

* v-once

* ...


#### vue内置组件

   component

   keep-alive

   slot


#### vue组件示例


```vue

<template>

 <div>

   <h1>{{title}}h1>

   <ChildComponents>ChildComponents>

 div>

template>

<script>

// 引入子组件

importChildComponentsfrom"./ChildComponents.vue";

// 引入其他Js脚本或类库

importCookiefrom"@/lib/cookie.js";


exportdefault {

 //注册子组件

 components: {

   ChildComponents,

 },

 //组件私有数据

 data() {

   return {

     title:"组件标题",

     firstName:"",

     lastName:"",

   };

 },

 //父组件传递过来的数据(两种方式声明:1.数组 2.对象)

 props: {

   age: {

     type:Number,

     default:0,

     required:true,

     validator:function (value) {

       returnvalue>=0;

     },

   },

 },

 //计算属性

 computed: {

   fullName() {

     returnthis.firstName+this.lastName;

   },

 },

 //监听

 watch: {

   title(preVal, newVal) {

     console.log(`改变之前的值:${preVal};改变之后的值:${newVal}`);

   },

 },

 //方法集

 methods: {

   getCurrentDate() {

     returnnewDate().toLocaleDateString();

   },

 },

 //生命周期钩子:实例初始化之后,数据观测(data observer) 和 event/watcher 事件配置之前被调用

 beforeCreated() {

   console.log("component before created");

 },

 //生命周期钩子:组件实例完成创建之后调用

 created() {

   console.log("component created");

 },

 //生命周期钩子:组件实例渲染完成时调用

 mounted() {

   console.log("component mounted");

 },

 //   ...

};

script>


<stylelang="less"scoped>

div {

 width: 100%;

}

style>

```


#### vue-router

* 路由模式: hash、history

* 使用方法

 1. 创建路由组件,挂载到Vue实例中

 2. 配置路由映射:组件和路径映射关系

 3. 使用路由:通过````



#### vuex


> dispatch -> action -> commit -> mutation -> store


![状态管理](https://cdn.nlark.com/yuque/0/2021/png/22701779/1638146852711-b8e50350-9abb-49e8-8ab2-738242f9cf67.png"状态管理")


* 概念

 * State

 * Getters

 * Mutations

 * Actions

 * Modules


* 辅助函数

 * mapState

 * mapGetters

 * mapMutations

 * mapActions


#### 渲染函数 JSX

* render写法

* vue语法适配


## 原理


#### MVVM设计模式

* Model 代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑。

* View 代表UI 组件,它负责将数据模型转化成UI 展现出来。

* ViewModel 监听模型数据的改变和控制视图行为、处理用户交互,简单理解就是一个同步View 和 Model的对象,连接Model和View。双向数据绑定。


#### 响应式

> Vue2 的响应式原理是核心是通过 ES5 的保护对象的 Object.defindeProperty中的访问器属性中的 get和 set方法,data 中声明的属性都被添加了访问器属性,当读取 data 中的数据时自动调用 get 方法,当修改 data 中的数据时,自动调用 set 方法,检测到数据的变化,会通知观察者 Wacher,观察者 Wacher自动触发重新render 当前组件(子组件不会重新渲染),生成新的虚拟 DOM 树,Vue 框架会遍历并对比新虚拟 DOM 树和旧虚拟 DOM 树中每个节点的差别,并记录下来,最后,加载操作,将所有记录的不同点,局部修改到真实 DOM 树上。


* 双向数据绑定原理

 * Object.defindeProperty检测data变化

 * 重新定义数组原型

 * 监听对象属性

```js

constdata = {};

letname = "张三";


Object.defineProperty(data,'name',{

   get:function(){

       console.log('触发get')

       returnname

   },

   set:function(newVal){

       console.log('触发set')

       name=newVal

   }

})


//测试

console.log(data.name)   // 触发get  张三

data.name = '李四'         // 触发set

```

 

* 缺点

 * 深度监听obj,需要递归到底,一次性计算量大,如果数据过大页面,页面可能会卡死

 * 无法监听新增属性/删除属性(提供Vue.set Vue.delete)


#### 虚拟DOM、DIFF算法

1. 在内存中构建虚拟dom树;

2. 将内存中虚拟dom树渲染成真实dom结构;

3. 数据改变的时候,将之前的虚拟dom树结合新的数据生成新的虚拟dom树;

4. 将此次生成好的虚拟dom树和上一次的虚拟dom树进行一次比对(diff算法进行比对),来更新只需要被替换的DOM,而不是全部重绘。在Diff算法中,只平层的比较前后两棵DOM树的节点,没有进行深度的遍历;

5. 会将对比出来的差异进行重新渲染;


## 进阶


#### vue-cli/Webpack、Babel

* 项目搭建

* 打包配置

* bable编译配置


#### SSR


#### Vue插件

* 使用(Vue.use)

* 开发(install 方法)


## Vue与React

* JSX 和纯函数式的编程范式,直接进行局部重新刷新(或者重新渲染),更简单,对原生的支持和更彻底贯彻相关思想显得更纯粹;

* Vue 进行数据拦截/代理,它对侦测数据的变化更敏感、更精确,也间接对一些后续实现(比如 hooks,function based API)提供了很大的便利;

* Vue 的方案在结构、样式、业务分离方面更清晰彻底,更符合前端多年来的编码习惯,更符合直觉,更容易学习和维护;

* 相比 React 需要学习的新概念比较少,把 API 看一遍就上手,学习曲线平滑。看下这个问题下的答案多少把二者当做框架、分不清模板和 virtual dom 就能体会了,但对研究不深的使用者或者初学者其实影响不大,React 的文档可比 Vue 简短多了,大篇幅在介绍概念而非 API;


* React 并不知道什么时候“应该去刷新”,触发局部重新变化是由开发者手动调用 setState 完成。React setState 引起局部重新刷新。为了达到更好的性能,React给开发者 shouldComponentUpdate 这个生命周期 hook,来避免不需要的重新渲染(相比之下,Vue 由于采用依赖追踪,默认就是优化状态:你动了多少数据,就触发多少更新,不多也不少,而 React 对数据变化毫无感知,它就提供 React.createElement 调用已生成 virtual dom)。



相关文章
|
设计模式 JavaScript 前端开发
Vue2在团队内的分享
简要介绍Vue的基础特性和区别于react的地方
156 2
|
4天前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
vue学习第四章
|
4天前
|
JavaScript 前端开发
vue学习第九章(v-model)
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript与Vue的大一学生,自学前端2年半,正向全栈进发。此篇介绍v-model在不同表单元素中的应用及修饰符的使用,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
vue学习第九章(v-model)
|
4天前
|
JavaScript 前端开发 开发者
vue学习第十章(组件开发)
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文深入讲解Vue组件的基本使用、全局与局部组件、父子组件通信及数据传递等内容,适合前端开发者学习参考。持续更新中,期待您的关注!🎉🎉🎉
vue学习第十章(组件开发)
|
10天前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
|
10天前
|
存储 缓存 JavaScript
在 Vue 中使用 computed 和 watch 时,性能问题探讨
本文探讨了在 Vue.js 中使用 computed 计算属性和 watch 监听器时可能遇到的性能问题,并提供了优化建议,帮助开发者提高应用性能。
|
10天前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
|
10天前
|
存储 缓存 JavaScript
Vue 中 computed 和 watch 的差异
Vue 中的 `computed` 和 `watch` 都用于处理数据变化,但使用场景不同。`computed` 用于计算属性,依赖于其他数据自动更新;`watch` 用于监听数据变化,执行异步或复杂操作。
|
9天前
|
JavaScript 前端开发 UED
vue学习第二章
欢迎来到我的博客!我是一名自学了2年半前端的大一学生,熟悉JavaScript与Vue,目前正在向全栈方向发展。如果你从我的博客中有所收获,欢迎关注我,我将持续更新更多优质文章。你的支持是我最大的动力!🎉🎉🎉
|
11天前
|
存储 JavaScript 开发者
Vue 组件间通信的最佳实践
本文总结了 Vue.js 中组件间通信的多种方法,包括 props、事件、Vuex 状态管理等,帮助开发者选择最适合项目需求的通信方式,提高开发效率和代码可维护性。
下一篇
无影云桌面