从今天开始来和大家一起学习 vue3 相信大家都不陌生,已经火了一段时间了,但是还是有不少人没有学习,那就跟着六扇老师来简单的入个门
废话不多说,来开始今天的学习
2020年,9月,18日,Vue.js发布3.0版本,耗时两年多,2600+次提交,99位贡献值
github 上的 tags 地址 :https://github.com/vuejs/core/releases/tag/v3.0.0
Composltlon API (组合 API)
新的内置组件
其他
新的生命周期钩子
data 不再是对象,始终是一个函数
......
上边的东西只是一个了解,混一个脸熟,不会,看不懂也没有关系,后边我们会一个个讲,看一遍就会的,尤其是有 vue2 基础的
说了怎么,不如上手写写一遍,下面我们就开始创建我们的 vue3
创建 vue3 项目有两种方式,一种是 vue 传统的创建方式 一种是 vite 创建
vue create vue3项目的name
当然这里插一个题外话,什么是 vite ----- 下一代前端构建工具差不多也是新一代了,现一代是webpack
vite 官网 :https://cn.vitejs.dev/
vite 有什么优势呢?
vite 优势也差不多就是特点
传统的构建相信用过 webpack 都知道,他是通过入口文件然后分析路由,再去分析模块,都分析完了进行打包,然后告诉你服务器准备好了

vite 构建的工作模式,一上来就给用户准备好服务器,然后等待用户请求,假如你发起了一个请求,然后 vite 会根据你的路径 进入 入口文件然后找到 你的路由,分析该路由的模块,然后给你 (动态的引入和代码分割)

用 vite 创建 vue3
npm init vite-app vue3项目的name
当然 vite 创建是没有依赖的,需要进入项目自己在 npm i
而且 vite 自配置的启动 是 npm run dev
vite 会更快,不信你就都下载然后对比一下,实践出真理
接下来让我们分析一下 vue3 的工程结构 看看和 vue2 到底有什么区别,我们以 vue-cli 下载好的 vue3 项目为例
打开文件,我们发现 vue3 的目录结构和摆放位置都和 vue2 一样没什么区别
只不过 vue3 文件里面的一些语法和 vue2 不同
接下来我们来分析吧,如何分析?
首先我们打开项目的入口文件 main.js,一共写了三行代码,和 vue2 不同了吧
import { createApp } from 'vue'
import App from './App.vue'
createApp(App).mount('#app')
其中 import App from './App.vue' 我们见过在 vue2 中也有 意思是 引入所有组件的外壳组件,也就是所有组件的父亲
import { createApp } from 'vue' 引入的不再是 Vue 构造函数了 是有一个 createApp 应用的实例对象,工厂函数
vue2 里面 我们是 new 一个 vue 是一个构造函数
vue3 createApp 直接是 一个工厂函数 ,可以直接调用
有什么不同呢?
来我们先回忆一下 vue2 中的写法,
new Vue({
render:(h)=>{
return h(app)
}
}).$mount('#app')
我们拆解一下
const vm = new vue({render:h => h(app)})
vm.$mount('#app')
这是之前的写法,接下来我们再把 createApp(App).mount('#app') 拆解
const app = createApp(App)
app.mount('#app')
这样一对比是不是明白了
const app = createApp(App) 其实就是 创建实例应用对象 (和 vue2 里面的 vm 类似 但 app 更轻)
app本质就是一个对象,里面好多东西,vm里面很多需要的不需要的都放在里面,但 app 更精,减少了不需要的东西,所以“轻”了
入口文件分析完了,我们按照代码执行的方式,接下来分析 App.vue
进入 App.vue 和 vue2 一样 template script style 没区别
但是有一个地方发生变化了,那就是 template 里边没有 div 了
vue3 组件中的模板结构可以没有根标签了(可以有,可以没有)写不写都行了
composition 组合式 API 这概念有点长,有点多,不太好理解,先不讲,暂时知道 composition 是组合式 AIP 就行
想玩 vue3 最好就是先学 setup,因为 setup 是 所有组合式API(comosition)的大舞台
是 vue3 中一个新的配置项,一个函数,新增
页面中需要的数据,也就是组件中所应用的数据,方法,生命周期,计算属性等等等,都要配置写在 setup 中
那怎么配置呢,直接上手,写代码
export default {
name: 'App',
setup(){
let name = '六扇老师'
let age = '18'
// 方法
function sayHello(){ alert(`你们好,我是${name},今年${age}`) }
},
}
和 vue2 不一样了,我们 vue3 需要数据不用 data 了 直接写就行了
写完问题也就来了,诶六扇老师,我光写完数据和方法了,我在组件中怎么使用呢?
这里就要说 setup 的返回值了,它有两种一种是返回对象,一种是渲染函数
setup(){
let name = '六扇老师'
let age = '18'
function sayHello(){ alert(`你们好,我是${name},今年${age}`) }
return { name, age, sayHello, }
},
我们直接在 setup 最后加一个 return 返回我们的 数据
然后再模板中和 vue2 一样去引用,启动项目
接下来我们再看 setup 的另一种返回值

可以看到我们上边写的也不生效了,setup 返回的渲染函数为主了
当然返回的渲染函数前提需要引入 h ,渲染函数
题外话:vue3 是向下兼容的,你可以在 vue3 中写 vue2 语法的代码,如果都写一起得话,在 vue2 的方法中能获取到 vue3 里面 setup 的值
但是 在 vue3 中 不能获取到 vue2 中 data 的值,而且如果有同名的,setup 优先
不建议与 vue2 配置混用,因为不知道什么时候就不兼容了,要不还学 vue3 干嘛
setup 不能是一个 async 函数,因为返回值不再是 return 的对象,而是 promise, 模板看不到 retuen 里面的数据对象
我们在 vue2 的时候学过 ref ,是一个标签属性,给一个元素打标识,方便我们拿到,然后使用
但 vue3 里面多了一个名为 ref 的函数
在学习 ref 函数之前我们先思考一个问题,上边我们已经写了数据,那如何修改呢?
老师我知道,直接写一个函数,然后调用,让 name 等于别的就修改了

我们可以看到,这样写了之后,数据是修改了,但是页面却没有修改,也就是 vue 没有发现
vue 不认识,也就是说你这样定义的数据它只是普通的数据,根本不是响应式数据
那如何把普通的数据变成 vue 可以监测到的响应式数据呢,这就用到了 ref 函数
首先我们要先引入我们的 ref 函数
import {ref} from 'vue'
export default {
setup(){
let name = ref('六扇老师')
let age = ref('18')
function changeInfo(){
console.log(name,age)
}
return { name, age, changeInfo, }
}

我们看用 ref 函数更改完的数据,它是一个 RefImpl 的实例对象,那什么是 RefImpl 对象?
我们拆开来看,Ref ---> reference 引用,Impl implement 实现
那 RefImpl 标准的称呼就是"引用实现的实例对象",简称引用对象
然后我们看里面,其他的值我们不看,就看一个 value 和 原型对象里面的 set 和 get
熟悉吧,和 vue2 一样,拿到你的数据,然后通过 set 和 get 修改,然后页面等等等
那怎么修改呢,直接在你要修改的值后边加上 .value 就修改完成了

小知识:template 组件里面的发现 ref 对象会自动获取到 value 值,所以直接写就能获取到值
弄完基本类型数据,我们用 ref 写一个对象类型

数据有了,那我们怎么更改呢,其实也简单,看图我也经把 job.value 打印出来了
直接 job.value.type = 什么值,就可以更改了
那问题来了 ref 加工之后不是都 RefImpl 对象吗,为什么 job.value 变成 Proxy 对象了呢,带着这个问题,往下看 reactive 函数
总结:
ref 的作用,定义了一个响应式数据。创建了一个包含响应式数据的引用对象(reference对象,简称 ref 对象)
接受的数据可以是:基本类型,也可以是:对象类型
基本类型的数据:和 vue2 一样响应式依然是靠 Object.defineProperty() 的 get 与 set 完成的
对象类型的数据:内部 求助 了 vue3 中的一个新函数 reactive 函数
题外话:vue3 接受到 对象类型的数据,底层就是 用 ES6 新语法 Proxy 来处理的,但是在 vue3 中并没有直接使用,而是被封装到 reactive 函数里面
reactive 只能定义对象类型和数组的响应式数据 (基本类型用 ref ),之所以 ref 可以是因为 ref 内部求助了 reactive

用完 reactive 之后就和正常使用一样了,直接点就行
当然数组也是同理,直接放在里面写就行了,对象怎么用他怎么用,而且还能直接通过索引去改,这是 vue2 办不到的
let arr = reactive(["学习","喝酒","烫头"])
function changeInfo(){
arr[0] = "抽烟"
}
const 代理对象 = reactive(原对象),接受到一个对象或数组,返回一个代理对象(Proxy的实例对象)
reactive 定义的响应式数据是更深层次的,不管有多深都能点出来
内部是通过 ES6 的 Proxy 实现,通过代理对象操作原对内部数据进行操作,并且这种操作是可以被 vue 所捕获到的,也就是我们说的数据劫持
题外话:
学到这里有同学该问了,那老师这样写太墨迹了,一会 ref . vaule 一会 reactive 不点咋解决呢
还是那句话,代码是死的人是活的,就像我们这几个数据,你可以直接这样去写

这样是不是语法语义都正确了,而且还省事了,但是我还是觉得有点麻烦,不想点来点去的,别急留一个问题,我们下章再讲
出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在
如何使用RSpec::Core::RakeTask初始化RSpecRake任务?require'rspec/core/rake_task'RSpec::Core::RakeTask.newdo|t|#whatdoIputinhere?endInitialize函数记录在http://rubydoc.info/github/rspec/rspec-core/RSpec/Core/RakeTask#initialize-instance_method没有很好的记录;它只是说:-(RakeTask)initialize(*args,&task_block)AnewinstanceofRake
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?
我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法
我正在尝试按0-9和a-z的顺序创建数字和字母列表。我有一组值value_array=['0','1','2','3','4','5','6','7','8','9','a','b','光盘','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','','u','v','w','x','y','z']和一个组合列表的数组,按顺序,这些数字可以产生x个字符,比方说三个list_array=[]和一个当前字母和数字组合的数组(在将它插入列表数组之前我会把它变成一个字符串,]current_combo['0','0','0']
这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/
我正在尝试在Rails上安装ruby,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf