1 # 一、创建Vue3.0工程
2 # 1.使用vue-cli创建
3 # 官方文档: https://cli.vuejs.org/zh/guide/creating-a-project.html#vue-create
4 # 查看@vue/cli版本,确保@vue/cli版本在4.5.0以上
5 vue --version
6 # 安装或者升级你的@vue/cli
7 npm install -g @vue/cli
8 # 创建
9 vue create vue_test
10 # 启动
11 cd vue_test
12 npm run serve
13 # 2.使用vite创建
14 # 官方文档: https://v3.cn.vuejs.org/guide/installation.html#vite
15 # vite官网:https://vitejs.cn
16 # 什么是vite?——新一代前端构建工具
17 # 优势如下:
18 #. 开发环境中,无需打包操作,可以快速的冷启动
19 #. 轻量快速的热重载(HMR)
20 #. 真正的按需要编译,不在等待整个应用编译完成
21 # 创建工程
22 npm init vite-app <project-name>
23 # 进工程目录
24 cd <project-name>
25 # 安装依赖
26 npm install
27 # 运行
28 npm run dev
29 # 二、常用Composition API
30 # 1.官方文档: https://v3.cn.vuejs.org/guide/composition-api-introduction.html
31 # 2.重点!!setup()函数:
32 # .理解:Vue3.0中一个新的配置项,值为一个函数
33 # .setup是所有Composition API(组合API)“表演舞台”
34 # .组件中所有用到的:数据、方法等等,均要配置在setup中。
35 # .setup函数的两种返回值:
36 # 若返回一个对象,则对象中的属性、方法,在模板中均可直接使用。(重点!)
37 # 若返回一个渲染函数:则可以自定义渲染内容。(了解就行)
38 # .注意点:
39 # 尽量不要与Vue2.x配置混用
40 # Vue2.x配置(data、methods、computed...)中可以访问到setup中的属性、方法。
41 # 但setup中不能访问到Vue2.x配置(data、methods、computed...)
42 # setup不能是一个async函数,因为返回值不再是return的对象,而是promise,模板看不到return对象中的属性(后期也可以返回一个Promise实例,但需要Suspense和异步组件的配合)
43 # setup执行的时机:在beforeCrete之前执行,this是undefined
44 # setup的参数:
45 # props: 值为对象,包含:组件外部传递过来,且组件内部声明接收了的属性
46 # context上下文对象:attr(值为对象,包含:组件外部传递过来,但没有在props配置中声明的属性,相当于this.$attrs)、slots(收到的插槽内容,相当于this.$slots。具名插槽尽量使用“v-slot:name”去指定插槽名)、emit(分发自定义事件的函数,相当于this.$emit)
47 # 3.ref()函数:
48 # .作用:定义一个响应式的数据
49 # .语法:const xxx = ref(initValue)
50 # 创建一个包含响应式数据的引用对象(reference对象,简称ref对象)
51 # JS中操作数据:xxx.value
52 # 模板中读取数据:不需要.value。直接:<div>{{xxx}}</div>
53 # .备注:
54 # 接收的数据可以是:基本类型、也可以是对象类型
55 # 基本类型的数据:响应式依然是靠Object.defineProperty()的get与set完成的
56 # 对象类型的数据:内部“求助”了Vue3.0中的一个新函数——reactive函数
57 # 4.reactive()函数:
58 # 作用:定义一个对象类型的响应式数据(基本数据类型不要用它,要用ref函数)
59 # 语法:const 代理对象 = reactive(源对象)接受一个对象(或数组),返回一个代理对象(Proxy的实例对象,简称Proxy对象)
60 # reactive定义的响应式数据是“深层次的”
61 # 内部基于ES6的Proxy实现,通过代理对象操作源对象内部数据进行操作。
62 # 5.reactive对比ref
63 # .从定义数据角度对比:
64 # ref用来定义:基本类型数据
65 # reactive用来定义:对象(或数组)类型数据
66 # 备注:ref也可以用来定义对象(或数组)类型数据,它内部会自动通过reactive转为代理对象
67 # .从原理角度对比:
68 # ref通过Object.defineProperty()的get()与set()来事项响应式(数据劫持)
69 # reactive通过使用Proxe来实现响应式(数据劫持),并通过Reflect操作源对象内部的数据。
70 # .从使用角度对比:
71 # ref定义的数据:操作数据需要.value,读取数据是模板直接读取不需要.value
72 # reactive定义的数据:操作数据与读取数据,均不需要.value
73 # 三、Vue3.0响应式实现原理
74 # 通过Proxy(代理):拦截对象中任意属性的变化,包括:属性值的读写、属性的添加、删除等。
75 # 通过Reflect(反射):对源对象中的属性进行操作
76 # MDN文档中描述的Proxy与Reflect
77 # Proxy: https://developer.mozilla.org/zh_CN/Web/JavaScript/Reference/Global_Objects/Proxy
78 # Reflect: https://developer.mozilla.org/zh_CN/Web/JavaScript/Reference/Global_Objects/Reflect
79 let person = {
80 name: '张三',
81 age: 18
82 };
83 # 1.模拟Vue2中实现响应式(Object.defineProperty)
84
85 let p = {}
86 Object.defineProperty(p, 'name', {
87 configurable: true, // 属性可被删除
88 get(){ // 有人读取name时调用
89 return person.name;
90 },
91 set(value){
92 console.log('person.name属性发生修改,我要去更新页面!');
93 person.name = value;
94
95 }
96 });
97 Object.defineProperty(p, 'age', {
98 configurable: true, // 属性可被删除
99 get(){ // 有人读取age时调用
100 return person.age;
101 },
102 set(value){
103 console.log('person.age属性发生修改,我要去更新页面!');
104 person.age = value;
105
106 }
107 });
108
109 # 2.模拟Vue3中实现响应式(window.Proxy)
110 const p = new Proxy(person, {
111 // 有人读取了p的某个属性时调用
112 get(target, propName){
113 console.log(`有人读取了p神圣的${propName}属性`);
114 return Reflect.get(target,propName);
115 },
116 // 有人修改p的某个属性、或给p追加新的属性时调用
117 set(target,propName,value){
118 console.log(`有人修改了p身上的${propName}属性,我要去更新界面了`);
119 Reflect.set(target,propName,value);
120 },
121 // 有人删除p的某个属性时调用
122 deleteProperty(target, propName){
123 console.log(`有人删除了p身上的${propName}属性,我要去更新页面了!`);
124 return Reflect.deleteProperty(target,propName);
125 }
126 })
127
128 # 3.window.Reflect的用法
129 let obj = {a:1,b:2};
130 const x1 = Reflect.defineProperty(obj, 'c', { // 增加一个c属性 (和Object.defineProperty功能一样,唯一区别是:这里会返回bool值来确认操作成功还是失败,而不是报异常)
131 get(){
132 return 3;
133 }
134 });
135 console.log(x1);
136 const x2 = Reflect.defineProperty(obj, 'c', {
137 get(){
138 return 4;
139 }
140 });
141 if (x2){
142 console.log('某某某操作成功了!');
143 }else{
144 console.log('某某某操作失败了!');
145 }

Vue3.0工程创建 && setup、ref、reactive函数 && Vue3.0响应式实现原理的更多相关文章

  1. vue3函数setUp和reactive函数详细讲解

    1 setUp的执行时机 我们都知道,现在vue3是可以正常去使用methods的. 但是我们却不可以在setUp中去调用methods中的方法. 为什么了??? 我们先了解一下下面这两个生命周期函数 ...

  2. Angular Reactive Forms -- Model-Driven Forms响应式表单

    Angular 4.x 中有两种表单: Template-Driven Forms - 模板驱动式表单 (类似于 AngularJS 1.x 中的表单 )  官方文档:https://v2.angul ...

  3. Vue3.0 响应式数据原理:ES6 Proxy

    Vue3.0 开始用 Proxy 代替 Object.defineProperty了,这篇文章结合实例教你如何使用Proxy 本篇文章同时收录[前端知识点]中,链接直达 阅读本文您将收获 JavaSc ...

  4. Vue2.0源码阅读笔记(二):响应式原理

      Vue是数据驱动的框架,在修改数据时,视图会进行更新.数据响应式系统使得状态管理变的简单直接,在开发过程中减少与DOM元素的接触.而深入学习其中的原理十分有必要,能够回避一些常见的问题,使开发变的 ...

  5. vue2与vue3实现响应式的原理区别和提升

    区别: vue2.x: 实现原理: 对象类型:Object.defineProperty()对属性的读取,修改进行拦截(数据劫持): 数组类型:通过重写更新数组的一系列方法来进行拦截(对数组的变更方法 ...

  6. vue3 学习笔记 (五)——vue3 的 setup 如何实现响应式功能?

    setup 是用来写组合式 api ,内部的数据和方法需要通过 return 之后,模板才能使用.在之前 vue2 中,data 返回的数据,可以直接进行双向绑定使用,如果我们把 setup 中数据类 ...

  7. # vue3 ref 和 reactive 函数

    vue3 ref 和 reactive 函数 前言 上一篇博文介绍 setup 函数的时候,最后出现一个问题,就是在 setup 函数中,编写一个事件,直接去修改定义的变量,发现页面上没有更新成功,并 ...

  8. Vue3响应式系统api 之 ref reactive

    reactive 接收一个普通对象然后返回该普调对象的响应式代理.等同于2.x的  Vue.observable() Vue3中响应数据核心是 reactive , reactive 中的实现是由 P ...

  9. Vue3源码分析之 Ref 与 ReactiveEffect

    Vue3中的响应式实现原理 完整 js版本简易源码 在最底部 ref 与 reactive 是Vue3中的两个定义响应式对象的API,其中reactive是通过 Proxy 来实现的,它返回对象的响应 ...

随机推荐

  1. 用python实现自动化登录禅道系统 设置定时器自动执行脚本

    由于各种原因,我想试下用python实现自动登录禅道系统,并且每天定时执行.(本人第一次接触自动化,在大佬眼中门槛都没摸到的类型) 首先缕清思路: 1.实现自动登录禅道系统,用selenium实现2. ...

  2. js循环调用axios异步请求,实现同步

    准备: const axios = require('axios'); // axios请求 const res = []; const arr = ["a", "b&q ...

  3. 盘点微信小程序跨页面传值的若干方式

    直接给大家上干货 1.跳转页面传递参数 pageA.wxml <button type="primary" bindtap="jumpTo">点击跳 ...

  4. 架构师必备:HBase行键设计与应用

    首先要回答一个问题,为何要使用HBase? 随着业务不断发展.数据量不断增大,MySQL数据库存在这些问题: MySQL支持的数据量为TB级,不能一直保留历史数据.而HBase支持的数据量为PB级,适 ...

  5. sklearn练习1 回归

    from sklearn.svm import SVR from sklearn.pipeline import make_pipeline from sklearn.preprocessing im ...

  6. 架构师必备:系统容量现状checklist

    正如飞机在起飞前,机长.副机长要过一遍checklist检查,确认没问题了才能起飞.楼主也整理了一个系统容量现状checklist,方便对照检查.本文搭配架构师必备:如何做容量预估和调优,食用更佳. ...

  7. CMU15445 之 Project#0 - C++ Primer 详解

    前言 这个实验主要用来测试大家对现代 C++ 的掌握程度,实验要求如下: 简单翻译一下上述要求,就是我们需要实现定义在 src/include/primer/p0_starter.h 中的三个类 Ma ...

  8. 用python进行加密和解密——我看刑

    加密和解密 密码术意味着更改消息的文本,以便不知道你秘密的人永远不会理解你的消息. 下面就来创建一个GUI应用程序,使用Python进行加密和解密. 在这里,我们需要编写使用无限循环的代码,代码将不断 ...

  9. Java判断字符串是否为金额

    public static void main(String[] args) { String aa = "5632.2"; //小数点前后是数字即可,无小数点后数据也ok Sys ...

  10. docker实时查看日志

    docker logs -f --tail=10 fo-order -f : 查看实时日志 --tail=10 : 查看最后的10条日志. fo-order: 容器名称