vue3 介绍

# Vue3的变化
# 1.性能的提升
打包大小减少41%
初次渲染快55%, 更新渲染快133%
内存减少54% # 2.源码的升级
使用Proxy代替defineProperty实现响应式
重写虚拟DOM的实现和Tree-Shaking # 3.拥抱TypeScript
Vue3可以更好的支持TypeScript # 4.新的特性
Composition API(组合API)
setup配置
ref与reactive
watch与watchEffect
provide与inject
新的内置组件
Fragment
Teleport
Suspense
其他改变
新的生命周期钩子
data 选项应始终被声明为一个函数

组合式api和配置项api

# 组合式api
都写到一个函数中,定义变量和定义方法,定义计算属性都是放在一起,不是拆到不同的地方
# 配置项api:之前vue2中的写法
new Vue({
data:{
name:'lqz'
},
methods:{
# 使用变量
}
})

Vue3之vue实例

# vue3的app实例
也是个对象,但是以后我们使用东西,不是从this中拿了,this当没了
# vue2的app实例
就是咱们再组件中用的this
this.$store
this.$refs.... # 以后真正的vue3的语法,写法可能变了

创建vue3项目

### vue3 完全兼容vue2 ###

# vue 3 项目创建有两种方式
-vue-cli
-vue create vue_cli_test
-路由选择,选择vue3即可
-跟之前创建vue2是一样的 -vite:vue_vute_test
npm init vue@latest
按下图选择
下载好之后 需要先npm install # 工具链,构建工具
-之前咱们再html中写,可能js可以引入
-可能写了一些 es高版本的语法----》转成低版本
-可能写 xx.vue,浏览器识别不了,浏览器只能识别:html,css,js
-咱们需要 有个东西可以一次性把 es高版本转成低版本,把xx.vue 转成xx.js的方式
-工具链:
webpack
vite

![096376eab3015b61bde8616a0ec88c6](C:\Users\ADMINI~1\AppData\Local\Temp\WeChat Files\096376eab3015b61bde8616a0ec88c6.png)

setup

# setup是个函数 以后vue的代码 都写在这里面
1.里面可以定义变量
2.可以定义函数,可以定义匿名函数
3.如果想在template中使用,必须return
4.如果要对变量加入响应式,需要使用ref包裹变量
5.data,methods都可以用,但是是setup函数先执行,才走其他
6.template中使用函数,变量,都是优先用setup中的
7.setup最先执行,是再生命周期的beforeCreate前执行的,内部没有this,也不能用this了

ref函数

// 包裹变量 实现响应式
let name = ref('xxx') <template>
<div class="home">
名字是:{{ name }},年龄是:{{ age }},爱好:{{hobby}}
<br>
<button @click="handleAdd">点我涨年龄</button>
<hr>
<button @click="handleChange">点击变名字</button>
</div>
</template> <script>
// 导入ref函数
import {ref} from "vue"; export default {
name: 'HomeView',
// 这样写还是支持
data() {
return {
// name: 'xxx',
// age: 18,
// hobby:'足球',
hobby:this.name + '爱打篮球'
}
},
methods: {
handleAdd() {
console.log('methods中的handleAdd')
}
}, // 以后写成这个形式
setup(){
// 以后所有vue3的代码 都写在这里面
// 原来写在data中定义变量
// 如果想在view中使用定义的变量,必须return出去
// var--老语法 let--以后定义变量用这个 const--定义常量 // 1 定义变量,并再页面中渲染
// let name = 'xxx'
// let age = 19
// return {name,age} // 2 定义变量和函数,在页面中使用----->失去了响应式
// let name = 'xxx'
// let age = 19
// const handleAdd = ()=>{
// // alert('我被点了')
// age += 1
// console.log(age)
// }
// return {name,age,handleAdd} // 3 加入响应式
// let name = ref('xxx')
// let age = ref(18) // 用ref包裹着就变成了响应式
// const handleAdd = () => {
// console.log(age.value)
// // 以后需要用哪个值 就对象.value才能取出来
// age.value = age.value + 1
// }
// const handleChange = ()=>{
// name.value = 'zzz'
// // name.value = name.value + 'nb'
// console.log(name)
// }
// return {name,age,handleAdd,handleChange} // 研究一下,原来的data,methods还能不能用
let name = 'xxx'
let age = 19
console.log('---',this)
return {name,age}
}
}
</script>

reactive函数

# 使用方式
let data = reactive({'name': 'xxx', 'age': 19, 'hobby': '篮球'})
const handelAdd = () => {
data.age += 1 // 使用reactive包裹的对象,直接当对象用即可
console.log(data)
}
return {data, handelAdd} # 从定义数据角度对比:
ref用来定义:基本数据类型
reactive用来定义:对象(或数组)类型数据
# 从原理角度对比:
ref通过Object.defineProperty()的get与set来实现响应式(数据劫持)。
reactive通过使用Proxy来实现响应式(数据劫持), 并通过Reflect操作源对象内部的数据。
# 从使用角度对比:
ref定义的数据:操作数据需要.value,读取数据时模板中直接读取不需要.value。
reactive定义的数据:操作数据与读取数据:均不需要.value
<template>
<div class="home">
<h1>首页</h1>
<!-- 名字是:{{name.value}}-->
名字是:{{data.name}}-----年龄是:{{data.age}}
<button @click="handleAdd">点我加年龄</button>
</div>
</template> <script> import {ref,reactive} from "vue"; export default {
name: 'HomeView',
setup(){
// 1 要让变量有响应式 要用ref包裹一下,包裹的都是字符串,数字,布尔
// js中再使用这个变量取值赋值是要 变量名.value才能拿到
// template中使用变量不要用 .value
// let name = ref('xxx')
// name.value = 'zzz'
// return {name} // 2 如果想让对象有响应式 reactive
let data = reactive({'name':'xxx','age':19,'hobby':'足球'})
const handleAdd = () => {
data.age += 1
}
return {data,handleAdd}
}
}
</script>

计算、监听属性

### 监听属性 就是使用watch 三种方式
# 1 方式一
// 1.监听属性之监听普通属性
// let name = ref('xxx')
// const handleClick = () => {
// name.value = 'zzz'
// }
// // vue3的写法
// watch(name,(newValue,oldValue)=>{
// console.log(oldValue)
// console.log(newValue)
// console.log('name 真的变了')
// }) # 2 监听属性之监听对象中的某个属性
// let person = reactive({name:'xxx',age:19})
// watch(()=>person.name,()=>{
// console.log('person中的name变了')
// })
// const handleClick = () => {
// person.name = 'zzz'
// }
// return {person,handleClick} # 3 同时监听多个变量
let sum = ref(100)
let msg = ref('很好')
watch([sum,msg],(newValue,oldValue)=>{
console.log('sum或msg变化了', newValue, oldValue)
})
const handleClick = () =>{
sum.value = 200
}
return {sum,msg,handleClick} ### 计算属性 使用computed 只有取值触发或取值赋值触发函数
# 1 基本使用
// 1 原来写法照常使用
// let name = ref('')
// let newName = computed(()=>{
// return name.value + 'nb'
// })
// return {name,newName} # 2 了解:计算属性可以取值用,还可以改值
let name = ref('')
let newName = computed({
get(){
// 使用计算属性 会触发这里
return name.value + '=nb'
},
set(value){
// 只要计算属性发生变化 就会执行这里
// 只要newName变了 name理应也变 需要我们写代码变
let res = value.split('=')
name.value = res[0]
console.log('计算属性变了,变成',value)
}
})
return {name,newName}

生命周期

# 8个生命周期钩子

# vue3不建议使用 配置项api 把所有代码都写在setup函数中
以后没有:beforedestory和destory这俩了,换成了unmounted
可以写配置项api
beforeCreate
created
beforeMoun
mounted
beforeUpdate
updated
beforeUnmount
unmounted
### 但是不建议了(以后写组合式aip)
import {onBeforeMount,onMounted,onBeforeUpdate,onUpdated,onBeforeUnmount, onUnmounted, reactive} from 'vue'
setup(){
// 生命周期钩子
// beforeCreate===>setup()
// created=======>setup()
// beforeMount ===>onBeforeMount
// mounted=======>onMounted
// beforeUpdate===>onBeforeUpdate
// updated =======>onUpdated
// beforeUnmount ==>onBeforeUnmount
// unmounted =====>onUnmounted
let t = setInterval(()=>{
console.log('hello world')
},3000) onBeforeUnmount(()=>{
console.log('onBeforeUnmount')
clearInterval(t)
t = null
})
onUnmounted(()=>{
console.log('onUnmounted')
})
}

toRef

// ...{对象}----》相当于解压
// 在setup函数中return时,使用return {...toRefs(data)},以后在template中直接使用内层的变量即可 import {toRefs} from "vue"; setup(){
// let a = {hobby:'足球',gender:'男'}
// let b = {...a,name:'zzz'}
// let c = {...toRefs(a),name:'zzz'}
// console.log(b) // {hobby: '足球', gender: '男', name: 'zzz'}
// console.log(c) // {hobby: ObjectRefImpl, gender: ObjectRefImpl, name: 'zzz'}
let data = reactive({name:'xxx',age:19})
const handleClick = () => {
alert('美女')
}
const handleAdd = () => {
data.age += 1
}
// ...toRefs(data) 等同于 {name:data.name,age:data.age}
// return {name: data.name, age: data.age, handleClick,handleAdd}
return {...toRefs(data),handleClick,handleAdd}
},

vue3 setup写法

<script setup>
// <script setup> 表示,这个script里的所有东西是setup函数,原来写在setup中的,现在顶格写即可
import {ref} from "vue"; let name = ref('xxx')
const handleClick = () => {
name.value = 'zzz'
}
// watch,computed
// 生命周期钩子
// 组件导入,自动注册
// 不需要return
</script>

Vue3基本功能实现的更多相关文章

  1. vue3导出功能

    proxy.$axios.own.get(url,{ responseType: 'blob' //首先设置responseType字段格式为 blob}).then(res => { let ...

  2. vue3 迫不得已我硬着头皮查看了keepalive的源代码,解决了线上的问题

    1.通过本文可以了解到vue3 keepalive功能 2.通过本文可以了解到vue3 keepalive使用场景 3.通过本文可以学习到vue3 keepalive真实的使用过程 4.通过本文可以学 ...

  3. 做个开源博客学习Vite2 + Vue3 (四)实现博客功能

    我们再来看一下管理类的设计. Composition API,就是组合API的意思,那么是不是应该把js代码分离出来,做成独立的管理类的形式呢? 这样代码可以更整洁一些,主要是setup里面的代码就不 ...

  4. 使用 vue3 的自定义指令给 element-plus 的 el-dialog 增加拖拽功能

    element-plus 提供的 el-dialog 对话框功能非常强大,只是美中不足不能通过拖拽的方式改变位置,有点小遗憾,那么怎么办呢?我们可以通过 vue 的自定义指令来实现一个可以拖拽的对话框 ...

  5. vue3 自己做一个轻量级状态管理,带跟踪功能,知道是谁改的,还能定位代码。

    上一篇 https://www.cnblogs.com/jyk/p/14706005.html 介绍了一个自己做的轻量级的状态管理,好多网友说,状态最重要的是跟踪功能,不能跟踪算啥状态管理? 因为vu ...

  6. 用Typescript 的方式封装Vue3的表单绑定,支持防抖等功能。

    Vue3 的父子组件传值.绑定表单数据.UI库的二次封装.防抖等,想来大家都很熟悉了,本篇介绍一种使用 Typescript 的方式进行统一的封装的方法. 基础使用方法 Vue3对于表单的绑定提供了一 ...

  7. 区块相隔虽一线,俱在支付同冶熔,Vue3.0+Tornado6前后端分离集成Web3.0之Metamask区块链虚拟三方支付功能

    最近几年区块链技术的使用外延持续扩展,去中心化的节点认证机制可以大幅度改进传统的支付结算模式的经营效率,降低交易者的成本并提高收益.但不能否认的是,区块链技术也存在着极大的风险,所谓身怀利器,杀心自起 ...

  8. .Net+Vue3实现数据简易导入功能

    在开发的过程中,上传文件或者导入数据是一件很常见的事情,导入数据可以有两种方式: 前端上传文件到后台,后台读取文件内容,进行验证再进行存储 前端读取数据,进行数据验证,然后发送数据到后台进行存储 这两 ...

  9. 简单对比vue2.x与vue3.x响应式及新功能

    简单对比vue2.x与vue3.x响应式 对响应方式来讲:Vue3.x 将使用Proxy ,取代Vue2.x 版本的 Object.defineProperty. 为何要将Object.defineP ...

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

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

随机推荐

  1. css中所有的选择器(包括比较少见的选择器)

    jQuery.CSS常用选择器 符号 描述 示例 说明 紧接无符号 相当于"并且"关系 input.k-textbox{   ...} 选出input并且包含k-textbox类的 ...

  2. 四月八号java基础

    1.复合语句:JAVA语言不允许在两个嵌套的复合语句内声明同样的变量 2.注释:1)单行注释// 2)多行注释/*......*/3)/**......*/文件注释 3.else总是与之最近的if结构 ...

  3. mysql运维------分库分表

    1. 介绍 问题分析: 随着互联网以及移动互联网的发展,应用系统的数据量也是成指数式增长,若采用单数据库进行数据存储,存在以下性能瓶颈: IO瓶颈:热点数据太多,数据库缓存不足,产生大量磁盘IO,效率 ...

  4. day110:MoFang:重新构造用户关系状态&添加好友&处理好友申请&获取申请好友历史记录&好友列表显示

    目录: 1.用户关系状态:重新构造 2.添加好友 3.处理好友申请 4.获取申请好友历史记录 5.好友列表 day109+day110所学内容流程图 1.用户关系状态:重新构造 在day109博客的前 ...

  5. Linux(三)磁盘管理

    Linux磁盘管理 Linux中的tree工具 tree可以查看目录的树形结构,前提是需要自行安装 yum install tree -y [root@hadoop100 ~]# tree ./ ./ ...

  6. day05-优惠券秒杀01

    功能03-优惠券秒杀01 4.功能03-优惠券秒杀 4.1全局唯一ID 4.1.1全局ID生成器 每个店铺都可以发布优惠券: 当用户抢购时,就会生成订单,并保存到tb_voucher_order这张表 ...

  7. [C++项目] 职工管理系统

    文章目录 职工管理系统 1.管理系统需求 2.创建项目 2.1 创建项目 2.2 添加文件 3.创建管理类 3.1创建文件 3.2 头文件实现 3.3 源文件实现 4.菜单功能 4.1 添加成员函数 ...

  8. ai问答:vue3+pinia+WebSocket 封装断线重连(实战)

    把socket实例 挂载到全局 为方便梳理,请忽略typescript # main.ts import {createApp} from 'vue' import App from './App.v ...

  9. 2020-01-25:redis中,哨兵如何选举?

    福哥答案2020-01-25: [答案1:](https://bbs.csdn.net/topics/398982967)redis-sentinel故障转移的流程:1.当多个sentinel发现并确 ...

  10. 2022-04-07:给定一个只由‘a‘和‘b‘组成的字符串str, str中“ab“和“ba“子串都可以消除, 消除之后剩下字符会重新靠在一起,继续出现可以消除的子串... 你的任务是决定一种消除的

    2022-04-07:给定一个只由'a'和'b'组成的字符串str, str中"ab"和"ba"子串都可以消除, 消除之后剩下字符会重新靠在一起,继续出现可以消 ...