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. 渗透:dSploit

    dSploit--开源的专业的Android平台安全管理工具包 只能在横屏模式下工作,即使你旋转你的设备也将继续保持横屏,如果你有一个应用程序,如旋转控制器,迫使每一个应用程序旋转,将导致dSploi ...

  2. 好客租房54-props深入(children属性)

    children属性 表示组件标签的子节点 当组件标签有子节点是 props就会有该属性 props中的组件可以是任意属性 都是可以渲染的 //导入react     import React fro ...

  3. 【单片机】CH32V103串口IDLE空闲中断

    CH32V103c8t6 在寻找解决接收完数据后,怎么即时判断数据已经完成了接收.发现串口有一个IDLE空闲中断.如下图描述: 意思是在串口接收完一帧数据 会产生一个中断,此时程序可判断为数据已接收完 ...

  4. Mac下最好用的SSH连接客户端 (Termius)

    Termius是微软的一款SSH终端工具,它支持多平台.而且操作界面十分ha好看且简洁,今天分享给大家️ 软件下载 关注下方公众号,回复termius获取下载地址   软件功能介绍 Termius M ...

  5. Android Proguard混淆对抗之我见

    关于何为Proguard,可以参考GuardSquare官网其优化业务及Wikipedia相关条目. Proguard:https://www.guardsquare.com/proguard Wik ...

  6. [杂项]从子域名接管到Subtaker

    子域名接管安全性分析及落地化 能说只是为了学Go嘛?33333 Github项目直通车 简介 子域名接管,主要原因归结于失效dns记录未删除. 譬如,一条指向test.sec.com的CNAME记录未 ...

  7. django框架3

    内容概要 注册登录功能编写 django请求生命周期流程图 路由层相关知识 1.路由匹配 2.无名有名分组 3.反向解析 4.名称空间 5.路由分发 内容详情 注册登录功能编写 1.使用自带的sqli ...

  8. 2021.05.05【NOIP提高B组】模拟 总结

    T1 给你一棵树,要求增加最少的边权是的从根到每一个叶子的长度相等 不能改变原有的最大长度 这是一个贪心:尽可能往深度小的边增加 先预处理出 \(mx_i\) 表示从 \(i\) 到叶子的最大长度 然 ...

  9. 【Spring】事务的执行原理(二)

    前置知识 事务的执行步骤如下: 获取事务管理器 创建事务 执行目标方法 捕捉异常,如果出现异常进行回滚 提交事务 public abstract class TransactionAspectSupp ...

  10. JS:函数

    Function:函数 1. 定义一个函数:function functionname(argument) { 代码块 return }: 调用此函数:fn() 2.函数是定义了一种方法,只有被调用才 ...