Vue2在团队内的分享

简介: 简要介绍Vue的基础特性和区别于react的地方

VUE2

优点

  • 体积小
  • 运行效率高(虚拟dom,diff算法)
  • 双向数据绑定
  • 学习成本低,生态丰富

基础

Vue实例

var vm = new Vue({
  // 参数
})

参数

data
props
propsData
computed
methods
watch

el
template
render
renderError

生命周期函数

directives // 自定义指令
filters // 过滤器
components // 可用组件

parent
mixins
extends
provide / inject

...

生命周期

生命周期

  • 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组件示例

<template>
  <div>
    <h1>{{ title }}</h1>
    <ChildComponents></ChildComponents>
  </div>
</template>
<script>
// 引入子组件
import ChildComponents from "./ChildComponents.vue";
// 引入其他Js脚本或类库
import Cookie from "@/lib/cookie.js";

export default {
  //注册子组件
  components: {
    ChildComponents,
  },
  //组件私有数据
  data() {
    return {
      title: "组件标题",
      firstName: "",
      lastName: "",
    };
  },
  //父组件传递过来的数据(两种方式声明:1.数组 2.对象)
  props: {
    age: {
      type: Number,
      default: 0,
      required: true,
      validator: function (value) {
        return value >= 0;
      },
    },
  },
  //计算属性
  computed: {
    fullName() {
      return this.firstName + this.lastName;
    },
  },
  //监听
  watch: {
    title(preVal, newVal) {
      console.log(`改变之前的值:${preVal};改变之后的值:${newVal}`);
    },
  },
  //方法集
  methods: {
    getCurrentDate() {
      return new Date().toLocaleDateString();
    },
  },
  //生命周期钩子:实例初始化之后,数据观测(data observer) 和 event/watcher 事件配置之前被调用
  beforeCreated() {
    console.log("component before created");
  },
  //生命周期钩子:组件实例完成创建之后调用
  created() {
    console.log("component created");
  },
  //生命周期钩子:组件实例渲染完成时调用
  mounted() {
    console.log("component mounted");
  },
  //   ...
};
</script>

<style lang="less" scoped>
div {
  width: 100%;
}
</style>

vue-router

  • 路由模式: hash、history
  • 使用方法

    1. 创建路由组件,挂载到Vue实例中
    2. 配置路由映射:组件和路径映射关系
    3. 使用路由:通过<router-link><router-view>

vuex

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

状态管理

  • 概念

    • 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变化
    • 重新定义数组原型
    • 监听对象属性
const data = {};
let name = "张三";

Object.defineProperty(data,'name',{
    get:function(){
        console.log('触发get')
        return name
    },
    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的相关内容
142 0
|
6天前
|
JavaScript 前端开发
如何在 Vue 项目中配置 Tree Shaking?
通过以上针对 Webpack 或 Rollup 的配置方法,就可以在 Vue 项目中有效地启用 Tree Shaking,从而优化项目的打包体积,提高项目的性能和加载速度。在实际配置过程中,需要根据项目的具体情况和需求,对配置进行适当的调整和优化。
|
7天前
|
存储 缓存 JavaScript
在 Vue 中使用 computed 和 watch 时,性能问题探讨
本文探讨了在 Vue.js 中使用 computed 计算属性和 watch 监听器时可能遇到的性能问题,并提供了优化建议,帮助开发者提高应用性能。
|
7天前
|
存储 缓存 JavaScript
如何在大型 Vue 应用中有效地管理计算属性和侦听器
在大型 Vue 应用中,合理管理计算属性和侦听器是优化性能和维护性的关键。本文介绍了如何通过模块化、状态管理和避免冗余计算等方法,有效提升应用的响应性和可维护性。
|
7天前
|
存储 缓存 JavaScript
Vue 中 computed 和 watch 的差异
Vue 中的 `computed` 和 `watch` 都用于处理数据变化,但使用场景不同。`computed` 用于计算属性,依赖于其他数据自动更新;`watch` 用于监听数据变化,执行异步或复杂操作。
|
6天前
|
JavaScript 前端开发 UED
vue学习第二章
欢迎来到我的博客!我是一名自学了2年半前端的大一学生,熟悉JavaScript与Vue,目前正在向全栈方向发展。如果你从我的博客中有所收获,欢迎关注我,我将持续更新更多优质文章。你的支持是我最大的动力!🎉🎉🎉
|
8天前
|
存储 JavaScript 开发者
Vue 组件间通信的最佳实践
本文总结了 Vue.js 中组件间通信的多种方法,包括 props、事件、Vuex 状态管理等,帮助开发者选择最适合项目需求的通信方式,提高开发效率和代码可维护性。
|
6天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。自学前端2年半,熟悉JavaScript与Vue,正向全栈方向发展。博客内容涵盖Vue基础、列表展示及计数器案例等,希望能对你有所帮助。关注我,持续更新中!🎉🎉🎉
|
8天前
|
存储 JavaScript
Vue 组件间如何通信
Vue组件间通信是指在Vue应用中,不同组件之间传递数据和事件的方法。常用的方式有:props、自定义事件、$emit、$attrs、$refs、provide/inject、Vuex等。掌握这些方法可以实现父子组件、兄弟组件及跨级组件间的高效通信。
|
13天前
|
JavaScript
Vue基础知识总结 4:vue组件化开发
Vue基础知识总结 4:vue组件化开发