第二篇 - Vue 的初始化流程

news2024/9/28 17:27:18

一,前言

上篇,使用 rollup 完成了 Vue2 源码环境的搭建

本篇,介绍 Vue 的初始化流程


二,Vue 简介

以两个概念性问题做简单介绍

1,问题:Vue 是 MVVM 框架吗?

在 Vue 官网上是这样说的:

Vue 是一套用于构建用户界面的渐进式框架,

Vue 并没有完全支持 MVVM 模型,但 Vue 的设计受到了它的启发,

变量名 vm 是 vue model 的缩写,表示 vue 实例

所以,严格说 Vue 并不是一个 MVVM 框架

MVVM 模式是仅能够通过视图更改数据,通过数据来更改视图的,

但 Vue 是可以通过 ref 获取 dom 进行操作的

2,问题:Vue 的双向绑定和单向数据流矛盾吗?

当然不矛盾,这是一个理解问题

双向绑定是指数据变了视图会更新;视图变了会影响数据;

单向数据说的是响应式数据,即数据变化后会更新视图;

三,使用 Vue

1,Vue Demo

以一个简单的 Vue Demo 为例:

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
  
<body>
  <!-- 模板 -->
  <div id=app>{{message}}</div>
  <!-- 引入 vue -->
  <script src="./vue.js"></script>
  <script>
    <!-- 初始化 Vue,传入 options 对象 -->
    let vm = new Vue({
      el: '#app',
      // 1,data 是对象
      data: {
        message: 'Hello Vue'
      }
      // 2,data 是函数,返回一个对象
      // data() {
      //   return { message: 'Hello Vue' }
      // }
    });
  </script>
</body>
</html>

Vue 初始化时,传入 el 挂载点,data 数据;

初始化完成后,message 成为响应式数据,数据变化更新视图,视图变化影响数据;

2,问题:响应式数据原理

Object.defineProperty 数据劫持(这里也正是 vue2 的性能瓶颈)

3,问题:Vue 中的数据可以是对象吗?

根组件不会被共享,可以是对象也可以是函数

非根组件必须为函数,否则 data 状态会多组件共享


四,Vue 的初始化操作

1,原型方法 _init

在 Vue 原型上扩展一个 _init 方法(原型方法),用于 Vue 的初始化操作

/**
 * vue中所有功能都是通过原型扩展方式添加的
 * @param {*} options 		new Vue时传入的 options 配置对象
 */
function Vue(options){
    this._init(options);	// 调用Vue原型上_init方法
}

// 在Vue原型上扩展一个原型方法_init,进行vue初始化
Vue.prototype._init = function(options) {
  
}

export default Vue;

2,重构:原型方法 _init 模块化处理

将用于初始化操作的原型方法 _init 单独抽离形成一个独立模块 initMixin

// src/init.js
export function initMixin(Vue) {
  Vue.prototype._init = function (options) {
    console.log(options)
  }
}

//------------------------------------------------//
// src/index.js
import { initMixin } from "./init";// 引入initMixin模块

function Vue(options){
    this._init(options);	// 这里调用的是Vue的原型方法
}

// 调用 initMixin 进行 Vue 初始化操作
initMixin(Vue)

export default Vue;

3,重构后测试

image.png


4,原型方法 _init 的 this 指向

export function initMixin(Vue) {
  Vue.prototype._init = function (options) {
    const vm = this;
    console.log(vm)	// this == vm 实例
  }
}

打印原型方法 _init 的 this,this 指向 vm 实例

image.png


5,vm.$options

为了后续让 vue 中的其他方法也能够轻松获取到外部 new Vue 实例化时传入的 options 对象

干脆将 options 选项挂到 vm 实例上,即 vm.$options

export function initMixin(Vue) {
  Vue.prototype._init = function (options) {
    const vm = this;  // this 指向当前 vue 实例
    vm.$options = options; // 将 Vue 实例化时用户传入的 options 暴露到 vm 实例上
  }
}

6,initState 方法:状态的初始化

在实际使用中,数据不仅来源于传入的 data,还可能来自 props、watch、computed…

所以,最好能够统一在一个地方,集中进行数据的初始化处理:initState 方法

// src/state.js
export function initState(vm){
    // 获取options:_init 中已将 options 挂载到 vm.$options
    const opts = vm.$options;

    if(opts.data){
        initData(vm);	// data数据的初始化
    }
  	// props 数据的初始化
    // watch 数据的初始化
    // computed 数据的初始化
}

function initData(vm){
    console.log("进入 state.js - initData,数据初始化操作")
}

引入并使用 initState

import { initState } from "./state";

export function initMixin(Vue) {
  Vue.prototype._init = function (options) {
    const vm = this;
    vm.$options = options;

    // new Vue 时,传入 options 选项,包含 el 和 data
    initState(vm);  // 状态的初始化

    if (vm.$options.el) {
      console.log("有el,需要挂载")
    }
  }
}

image.png


五,结尾

本篇主要介绍了 Vue 数据的初始化流程,核心的几个点:

  • initMixin
  • vm.$options
  • initState

下一篇,数据劫持:Object.defineProperty

维护日志

  • 20210605:调整文章的目录结构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/139443.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode450之删除二叉搜索树中的节点(相关话题:二叉搜索树,删除)

题目描述 给定一个二叉搜索树的根节点 root 和一个值 key&#xff0c;删除二叉搜索树中的 key 对应的节点&#xff0c;并保证二叉搜索树的性质不变。返回二叉搜索树&#xff08;有可能被更新&#xff09;的根节点的引用。 一般来说&#xff0c;删除节点可分为两个步骤&#x…

VS封装C++项目以及属性配置

目录 1. 封装单个项目 1.1 封装 新建C空项目&#xff0c;将需要封装的源文件(eval.cpp)和 头文件(eval.h)复制过来&#xff0c;并对它们做如下修改&#xff1a; 注&#xff1a;如果有多个头文件和源文件&#xff0c;只对可供外部调用的文件及其内部的函数作下面的处理 分别…

1.c++环境配置及第一个环境运行

开发IDE与环境 最好是使用ubuntu系统进行开发&#xff0c;如果没有的话&#xff0c;基于windows使用vs code 进行ssh连接到远程的ubuntu主机进行开发也可以。开发的过程跟本地差不多。 vs code IDE 插件的安装 1.变成中文菜单与提示,安装MS-CEINTL.vscode-language-pack-zh-…

《MySQL系列-InnoDB引擎13》文件-参数文件

文件 MySQL数据和InnoDB存储引擎表中的各种类型的文件&#xff0c;这些文件如下&#xff1a; 参数文件&#xff1a;MySQL启动时的数据库文件&#xff0c;指定初始化参数&#xff0c;介绍各种参数类型&#xff0c;以及定义某种内存结构的大小等日志文件&#xff1a;用来记录My…

C语言日常练习

这里写目录标题循环结构输入两个正整数m和n&#xff0c;求其最大公约数和最小公倍数求Snaaaaaaaaaa……的值&#xff0c;其中a是一个数字&#xff0c;n表示a的个数&#xff0c;n和a都由键盘输入一维数组从键盘输入十个数&#xff0c;并将正着输出反着输出从键盘输入十个数&…

虹科案例 | 解决ASRS系统的痛点问题居然这么简单?(上)

摘要 ASRS(自动存储和检索系统)在内部物流领域变得越来越常见。内部物流包括优化、整合、自动化和管理履行或配送中心内的货物物流流动。 ASRS穿梭机经常用在具有多个存储级别的配送中心的仓库或库存集装箱中处理散装产品的托盘。 自动化存储和检索系统的定义是专门为物料的存…

springcloud-02-微服务间通信及熔断组件

第二章 微服务间通信及熔断组件 1. 微服务间通信组件 1.1 基于RestTemplate的服务调用 Spring框架提供的RestTemplate类可用于在应用中调用rest服务&#xff0c;它简化了与http服务的通信方式&#xff0c;统一了RESTful的标准&#xff0c;封装了http链接&#xff0c; 我们只…

初识 Node.js

1、回顾与思考 1.1、浏览器中的 JavaScript 的组成部分 1.2、思考&#xff1a;为什么 JavaScript 可以在浏览器中被执行 1.3、思考&#xff1a;为什么 JavaScript 可以操作 DOM 和 BOM 1.4、浏览器中的 JavaScript 运行环境 2、Node.js 简介 2.1、什么是 Node.js Node.js…

RSA加密算法完整加密流程

RSA完整加密流程总结1.1-RSA加密介绍RSA公钥加密算法是1977年由罗纳德李维斯特&#xff08;Ron Rivest&#xff09;、阿迪萨莫尔&#xff08;Adi Shamir&#xff09;和伦纳德阿德曼&#xff08;Leonard Adleman&#xff09;一起提出的。1987年7月首次在美国公布&#xff0c;当时…

实习------Spring 框架学习

Spring 是什么&#xff08;了解&#xff09; 在不同的语境中&#xff0c;Spring 所代表的含义是不同的。下面我们就分别从“广义”和“狭义”两个角度&#xff0c;对 Spring 进行介绍。 广义上的 Spring 泛指以 Spring Framework 为核心的 Spring 技术栈。 经过十多年的发展&…

【原创】升级需谨慎,开发两行泪!——记一次MySQL驱动包升级引发的事故

一、背景最近项目组在版本迭代时&#xff0c;组件也要进行升级&#xff0c;此时涉及到MySQL驱动包jdbc的版本升级。即从5.1.X升级到8.0.X。然鹅在上线之后就出现了一部分兼容性问题&#xff0c;造成了一次“事故”&#xff1a;调用接口出现“系统错误”。查看日志&#xff1a;j…

C. Least Prefix Sum(可以后悔的拿取+multiset)

Problem - C - Codeforces 波罗的海&#xff0c;一个著名的棋手&#xff0c;同时也是一个数学家&#xff0c;他有一个数组a1,a2,...,an&#xff0c;他可以进行以下几次&#xff08;可能是0次&#xff09;操作。 选择某个索引i&#xff08;1≤i≤n&#xff09;。 将ai与-1相乘&…

Ffmpeg中AVFrame数据保存成YUV--讨论AVFrame的linesize

目录 YUV播放器 AVFrame中保存成YUV实现 linesize的意义 实测(PC机-64bits-win10) 总结&#xff1a; YUV播放器 首先要有一个YUVplayer用来播放测试的YUV数据&#xff0c;雷神改良过的YUV播放器&#xff1a; 修改了一个YUV/RGB播放器_雷霄骅的博客-CSDN博客 播放器播放界…

查询是: LOCK TABLE test.xx_test IN ACCESS SHARE MODE问题解决办法

如题所示&#xff0c;这个问题是我在postgresql中使用pg_dump备份多个schema的表时遇到的问题。bin\pg_dump --dbnamepostgresql://dbuser:123456localhost:5432/test --table public.xx_user --table test.xx_test -f d:\tools\pgsql\dump.sql pg_dump: 错误: 查询失败: 閿欒…

react生命周期(类组件/函数组件)

1.react代码模式分为两种 类组件和函数组件&#xff08;生命周期也有所不同&#xff09; 2.类组件&#xff08;写法如下&#xff09; import React from react export default class App1 extends React.Component{state {username:,password:}setUser (event) > {this.s…

《MySQL系列-InnoDB引擎12》启动、关闭与恢复

启动、关闭与恢复 InnoDB是MySQL数据库得存储引擎之一&#xff0c;因此InnoDB存储引擎得启动和关闭&#xff0c;可以说是MySQL实例得启动过程中对InnoDB存储引擎的处理过程。 在关闭时&#xff0c;参数innodb_fast_shutdown影响着表的存储引擎为InnoDB的行为。该参数可取值为0、…

BIOS(控制权交接第一棒)

计算机系统的控制权&#xff08;CPU的使用权&#xff09;交接的第一棒是BIOS&#xff01;接下来&#xff0c;我们简单学习一下BIOS相关知识。 在计算机接电后按下开机键&#xff0c;首先运行的软件是基本输入输出系统&#xff08;Basic Input Output System&#xff0c;BIOS&a…

阿里云故障有感

2304阿里云故障有感 为什么会写一个如此奇怪的议题。 人的生活轨迹&#xff0c;不一定只有唯一的叙事方式&#xff0c;可以不那么苦&#xff0c;不那么累&#xff0c;不那么怕&#xff0c;不那么憋屈。 不再去追求宏大的叙事&#xff0c;而是去关心自己的感受&#xff0c;吃没…

Spring Boot学习篇(六)

Spring Boot学习篇(六) mybatis-plus使用篇(二) 1 新增 1.1 示例代码 AutowiredISongsService songsService; Testpublic void add(){Songs snew Songs(null,"11","xx",null,"xx歌曲","2020-02-12");songsService.save(s);System.…

linux之vim编辑器

文章目录1. 概念2.安装3. vim的使用1.使用一些按键没有反应2. 模式转换1.命令模式转换到插入模式1. a2. i3. o2.命令模式切换到底行模式1. 退出3. 整体概念图4. 热键的使用1. 命令模式下1.复制——yy 粘贴——p复制若干行—— n yy粘贴若干行—— n p2. 撤销操作——u3. 对撤销…