Vue3+TS Day01 - 邂逅Vue3 debug源码

一、初识Vue

1、Vue 的读音是什么?对于 Vue 的官方定位是什么?

  • 读音:view。
  • 官方定位:是一套基于构建用户界面的渐进式JavaScript框架。

2、什么是【渐进式】框架?

  • 表示我们可以在项目中一点点来引入和使用 Vue,而不一定需要全部使用 Vue 来开发整个项目。

3、目前前端最流行的三大框架是什么?如何从数据对比它们的流行程度(主要是思路)?

  • Vue、React、Angular
  • 可以从 百度指数、谷歌指数 对比流行度
  • 可以从 npm 安装量对比流行度
image.png
image.png

4、Vue3 对于 Vue2 的一些重要变化(了解即可)?

image.png

image.png

5、Vue3 + TS 的学习大纲?

image.png

6、Vue 的本质是什么?

  • Vue 的本质,就是一个 JavaScript 的库
image.png

二、Vue 的基本使用

1、Vue 的引入方式?

image.png

2、什么是 CDN?(要解释清楚这个概念最佳角度----从【不使用】和【使用】CDN 这两个模式分析)

-CND:称之为内容分发网络(Content Distribution Network)

image.png
image.png

3、使用 【CND 的方式】引入 Vue,并体验下 vue 的基础用法?

image.png

4、直接拷贝 vue 的 JavaScript 文件,并且自己【手动引入】?

image.png

5、计数器实现-【原生代码】?

  <body>
    <h2 class="counter">0</h2>
    <button class="increment">+1</button>
    <button class="decrement">-1</button>

    <script>
      // 1.获取所有的元素
      const counterEl = document.querySelector(".counter");
      const incrementEl = document.querySelector(".increment");
      const decrementEl = document.querySelector(".decrement");

      // 2.定义变量
      let counter = 100;
      counterEl.innerHTML = counter;

      // 3.监听按钮的点击
      incrementEl.addEventListener("click", () => {
        counter += 1;
        counterEl.innerHTML = counter;
      });
      decrementEl.addEventListener("click", () => {
        counter -= 1;
        counterEl.innerHTML = counter;
      });
    </script>
  </body>

6、计数器实现-【Vue实现】?

<body>
    <div id="app">哈哈哈哈啊/div>

    <script src="../js/vue.js"></script>
    <script>
        Vue.createApp({
            template: `<h2>{{counter}}</h2>
                        <button @click="increment">+1</button>
                        <button @click="decrement">-1</button>`,
            data: function () {
                return {
                    counter: 100
                }
            },
            methods: {
                increment() {
                    this.counter++;
                },
                decrement() {
                    this.counter--;
                }
            }
        }).mount("#app");
    </script>
</body>

7、对比【原生实现计数器】和【Vue 实现计数器】,理解什么是命令式编程?什么是声明式编程?(超级重点)

  • 命令式编程关注的是“how to do”;
  • 声明式编程关注的是“what to do”,由框架(机器)完成“how”的过程;
  • 目前 Vue,React、Angular 的编程模式,我们称之为声明式编程;
image.png

8、从【MVC模型】【MVVM模型】的角度,Vue 更遵守哪个?谁是 【M】【V】【VM】?

  • 通常情况下,我们经常称 Vue 是一个 MVVM 的框架。
  • 【V】是 【view】
  • 【M】是 【model】
  • 【VM】是【Vue 框架】
image.png

三、Vue 在 createApp 时传入对象的【属性解析】

1、Vue 的 template 属性有什么用?是如何生效的?

  • 【template 属性】:表示的是 Vue 需要帮助我们渲染的模板信息
  • 【生效过程】:会用 【template内容】 替换掉 mount("app") 中 app 标签的 【innerHTML 内容】
image.png

2、Vue 提供了两种方式挂载 template,掌握【最常用】的那种即可?

  • 使用任意标签(通常使用 template 标签,因为不会被浏览器渲染),设置 id
  • template 元素是一种用于保护客户端内容的机制,该内容在加载页面时不会被呈现,但随后可以在运行时使用 JavaScript 实例化;
<body>
    <div id="app">
    </div>

    <template id="why">
      <h2>{{message}}</h2>
      <h2>{{counter}}</h2>
      <button @click='increment'>+1</button>
      <button @click='decrement'>-1</button>
    </template>

      <script src="../js/vue.js"></script>
      <script>
        document.querySelector("#why")
        Vue.createApp({
          template: '#why',
          data: function() {
            return {
              message: "Hello World",
              counter: 100
            }
          },
          // 定义各种各样的方法
          methods: {
            increment() {
              console.log("点击了+1");
              this.counter++;
            },
            decrement() {
              console.log("点击了-1");
              this.counter--;
            }
          }
        }).mount('#app');
      </script>
    </body>

3、data 属性需要传入什么?为什么修改 data 中的对象,会在 view 上自动相应?

  • 在 Vue3.x 的时候,必须传入一个【返回一个对象的函数】,否则就会直接在浏览器中报错;
  • data 中返回的对象会被【Vue 的响应式系统】劫持,之后对改对象的修改或访问都会在劫持中被处理;
  • 所以我们在 template 中通过{{counter}}访问 counter,可以从对象中获取到数据;
  • 所以我们修改 counter 值时,template 中的{{counter}}也会发生改变;
image.png

4、methods 属性需要传入什么?以及为什么不能使用箭头函数?

  • methods 属性时一个对象,通常我们会在这个对象中定义很多方法;
  • 这些方法可以被【绑定到 template 模板中】
  • 在该方法中,我们可以使用 this 关键字来直接访问到 data 中返回的对象属性;
image.png
image.png

四、Vue3.x 源码

1、如何下载 Vue3.x 的源码,并且进行 debug?

  • ①下载 3.0.11tag 的 Vue3 zip 包
  • ②执行 git initgit add ./git commit -m "12" 等命令,构建 git 环境
  • ③执行 yarn install 安装依赖库
  • ④执行 yarn dev 生成 dist目录下的 vue.global.js
  • ⑤在/vue-next-3.0.11/packages/vue/examples/why 目录下,编写带有断点的 html 代码
  • ⑥浏览器中进行断点调试代码
<!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"></div>

  <template id="my-app">
    <div>
      <div>aaaa</div>
      <div>{{counter}}</div>
      <hello :counter='counter'></hello>
      <button @click="changeMessage">Counter++</button>
    </div>
  </template>

  <template id="hello">
    <div>{{counter}}</div>
  </template>

  <script src="../../dist/vue.global.js"></script>
  <script>
    debugger;
    
    Vue.createApp({
      template: '#my-app',
      components: {
        'Hello': {
          template: "#hello",
          props: {
            counter: Number
          }
        }
      },
      data() {
        return {
          counter: 0
        }
      },
      setup() {
        const info = Vue.reactive({
          name: "why"
        })

        return {
          info
        }
      },
      methods: {
        changeMessage() {
          this.counter++;
          console.log(this.info);
        }
      }
    }).mount('#app')
  </script>
</body>
</html>
image.png
image.png

2、 在浏览器中发现,debug 的时候,代码断点全部在一个文件中,如何映射到源码文件中?

  • 修改 package.json 文件
  "scripts": {
    "dev": "node scripts/dev.js --sourcemap",
  • 重新 yarn dev
    image.png

3、遗留问题【this 指针】后面有空再研究

  • 猜测下面代码的打印结果
image.png
image.png
image.png
image.png
image.png
image.png
image.png

3、遗留问题【method 的 this 指针到底指向谁】后面有空再研究

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容