vue3 新特性

2023-11-19

// 注册全局组件
import HelloWorld from '@/components/HelloWorld.vue'
const app = createApp(App)

//全局挂载属性和方法
// 方法一:
app.config.globalProperties.$Test = () => {
    return '全局挂载属性和方法'
}

// 方法二:提供/注入 后续详细介绍
// app.provide('$Test', 'hi')
app.use(store).use(router).component('HelloWorld', HelloWorld).provide('$Test', 'hi').mount('#app')


// .vue文件

setup(){
	// 接收方法一
	const { ctx } = getCurrentInstance()
    let test1 = ctx.$Test
	// 接收方法二
	let test2 = inject('$Test')
}

setup:

<template>
  <div class="home">
    <img alt="Vue logo" src="../assets/logo.png" />
    <div @click="plusOne">{{ name }}-{{ age }}</div>
    <Child />
    <HelloWorld msg="Welcome to Your Vue.js App" />
  </div>
</template>



setup(props, context)
// props是一个形参, 组件接收的props数据可以访问到
// context上下文对象,可以通过context来访问vue的实例this
// Attribute (非响应式对象)
    // console.log(context.attrs)

    // 插槽 (非响应式对象)
    // console.log(context.slots)

    // 触发事件 (方法)
    // console.log(context.emit)
	// 也可写成setup(props, { attrs, slots, emit })
 {
	/**
	1、setup函数处于生命周期beforeCreate和Created两个钩子函数之间,无法使用data和methods的数据和方法,this为undefined
	2、setup函数是 Composition API(组合API)的入口
	3、方法和变量需要return出去,不然无法使用
	**/
   
    const { ctx } = getCurrentInstance()
    
    // ref将setup函数声明变为响应式,包含且仅有一个value属性
    let name = ref("xxx");
    let age = ref(18);
    // reactive 为引用类型添加响应式
    let r = reactive({a:1, b: {c:2}})
    function plusOne() {
      age.value ++
    }
	// 使用watch
	watch(age, (newVal, oldVal) => {
      // console.log(newVal, oldVal)
    })
	// 使用computed
	const counter = ref(0)
    const twiceTheCounter = computed(() => counter.value * 2)

    counter.value++
    // console.log(counter.value) // 1
    // console.log(twiceTheCounter.value) // 2

	// 返回的内容整个组件内都可以直接使用
     return {
      name,
      age,
      r,
      plusOne
    };
    onBeforeMount(() => {});
    onMounted(() => {});
    onBeforeUpdate(() => {});
    onUpdated(() => {});
    onBeforeUnmount(() => {});
    onUnmounted(() => {});
    onRenderTracked((key, target, type) =>{
      // console.log({ key, target, type });
    })
    // 可监听到数据改变
    onRenderTriggered(({ key, target, type }) => {
      // console.log({ key, target, type });
    })
  },

provide 和 inject

grdFather.vue
import father from '@/components/father'
import { provide } from 'vue'
export default {
    name: 'grdFather',
    components: {father},
    setup(){
        let grdFather = ref('comefrom grafather')
	    // readonly包裹后可以在组件内引用时不被改变
	    provide('grdFather', grdFather)
	    // provide('grdFather', readonly(grdFather))
    }
}

father.vue
import son from '@/components/son'
import { inject } from 'vue'
export default {
    name: 'father',
    components: {son},
    setup(){
        let value= inject('grdFather')
        console.log(1, value)
        return {
            val
        }
    }
}

son.vue
import { inject } from 'vue'
export default {
    name: 'father',
    setup(){
        let value= inject('grdFather')
        console.log(2, value)
        return {
            val
        }
    }
}

在这里插入图片描述

vue3和vue2的比较

Vue3使用Proxy替代了defineProperty
Object.defineProperty(obj,prop,descriptor) 的问题主要有三个:
obj
要定义属性的对象。
prop
要定义或修改的属性的名称或 Symbol 。
descriptor
要定义或修改的属性描述符。

let myobj = {};
 Object.defineProperty(myobj,"name",{
     configurable:true,//configurable 给的说明是 如果为 false , 那么对象属性不可以修改, 不可以删除. true则相反
     /*enumerable可枚举;
     设置为true后可以用这4种方式去操作属性
     1.
     for(let i in myobj){
         console.log(i);
     }
     2.
     Object.keys();
     3.
     JSON.stringify
     4.
     Object.assign
     */
     enumerable:true, 
    get(){//当获取属性的时候会进入get方法,可以对获取的值进行修改操作后返回 (必须返回值)或者获取的就是 undefined
        //value 内置属性 获取对象属性值
        return value;
    },
    set(newValue){//set方法监听设置的值 newValue参数获取要改变的值
    //value 内置属性 可以对对象属性的做更改
    //value="dd";
      value = newValue;
    }
})
  • 不能监听数组的变化
  • 只能劫持对象的属性,从而需要对每个对象,每个属性进行遍历
  • 必须深层遍历嵌套的对象

Proxy(target, handler)的特点:

let myobj = {};
//Proxy必须实例化 返回新的对象
//用起来比较方便 主要传入要劫持的对象,不用每个属性设置劫持
let obj  = new Proxy(myobj,{
    get(target,key){//target 表示当前实例的对象 key 表示获取属性名
     
        console.log("get..")
        return  target[key];
    },
    set(target,key,value){//target 表示当前实例的对象 key 表示获取属性名 value获取当前属性的值
        target[key] = value;
    }
})
  • 针对对象:针对整个对象,而不是对象的某个属性,所以也就不需要对keys进行遍历
  • 支持数组:Proxy不需要对数组的方法进行重载
  • Proxy的第二个参数有13种拦截方法

diff算法
vue2中diff算法思路:
diff算法采用两端比较的算法,同时从新旧VNode的两端开始进行比较,借助key值找到可复用的节点,再进行相关操作。
vue3中diff算法思路:
在创建VNode时就确定其类型,以及在mount/patch的过程中采用位运算来判断一个VNode的类型,在这个基础上再配合核心的diff算法。在创建虚拟dom树的时候,会添加一个PatchFlags(静态标记),进行对比的时候就直接对比带有静态标记的节点。
静态提升
不参与更新的内容节点做静态提升,渲染时直接复用
Tree-shaking友好
常用的API value、computed、watch等都是从vue中使用import引进来的,所以支持tree-shaking。即如果没有使用这些api,那么这些相应的代码就不会被打包,缩小了文件大小。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue3 新特性 的相关文章

  • 六、Vite 常用第三方库(axios、mockjs、sass、echars、element-plus、开箱即用)

    文章目录 一 参考 二 vite 创建 Vue 项目工程 2 1 create vite和vite的关系是什么呢 2 2 vue团队希望弱化vite的一个存在感 但是我们去学习的时候不能弱化的 2 3 创建工程 三 第三方库的安装 开箱即用
  • vue3中实现一个动态滚动的时钟效果

    前言 用vue3如何来实现一个滚动的时钟效果呢 这里来分享下方法 注意 因为vue3很多写法都不同 所以这里多分享点东西 实现效果 实现步骤 1 路由添加 import createRouter createWebHashHistory f
  • 如果使用Vue3.0实现一个 Modal,你会怎么进行设计?

    一 组件设计 组件就是把图形 非图形的各种逻辑均抽象为一个统一的概念 组件 来实现开发的模式 现在有一个场景 点击新增与编辑都弹框出来进行填写 功能上大同小异 可能只是标题内容或者是显示的主体内容稍微不同 这时候就没必要写两个组件 只需要根
  • vue3-vant4-vite-pinia-axios-less学习日记

    代码地址 GitHub vue3 vant4 vite pinia axios less 效果如图 1 首页为导航栏 2 绑定英雄页 3 注册页 4 英雄列表页 5 后面不截图了 没啥了 模块 1 vant4 按需引入组件样式文档 2 安装
  • Vue3头像(Avatar)

    效果如下图 在线预览 APIs 参数 说明 类型 默认值 必传 shape 指定头像的形状 circle square circle false size 设置头像的大小 number large small default Respons
  • vite 配置自动补全文件的后缀名

    vite 不建议自动补全 文件的后缀名的 const Home gt import views Home vue 文件是必须要加上 vue 的后缀名的 如果 想要像 webpack 一样的不用写 可以在vite config js中配置如下
  • vue3+vite 使用 postcss-pxtorem、autoprefixer 实现自适应和自动添加前缀

    自动添加前缀 自适应 1 安装 postcss pxtorem 和 autoprefixer npm install postcss pxtorem save npm i autoprefixer 2 vite config js引入并配置
  • vue3的一些知识点plus--3

    二十 兄弟组件传值 Bus 兄弟组件直接的传值 最基础的是通过同一个父级进行数值的传递 使用prop和emit 太过繁琐 父级 div a a b b div let flag ref false let getFlag params bo
  • Vue3的fragment

    vue2时 组件的模板结构中出现多个标签时 需要使用根标签 vue3时 组件的模板结构中出现多个标签时 可以不用根标签 这是因为vue3会自动将多个标签用fragment包裹 举个例子 main js import createApp fr
  • 25_Vue3路由-VueRouter的基本使用及动态路由和路由嵌套

    Vue3路由之Vue router的基本使用及路由嵌套和动态路由 认识前端路由 路由其实是网络工程中的一个术语 在架构一个网络时 非常重要的两个设备就是路由器和交换机 当然 目前在我们生活中路由器也是越来越被大家所熟知 因为我们生活中都会用
  • vue3.0基础知识浅谈

    vue3 0 首先创建vue3 0 项目 相比于vue2的变化 1 模板中可以没有根标签 2 main js中变化 组合API 一 setup 1 作用 2 返回值 3 注意点 4 参数 二 Ref函数 三 reactive函数 四 Ref
  • vue3+Element-plus el-select 下拉表格组件(2023-08-21 解决TSelectTable组件表单编辑回显设置defaultSelectVal 无效)

    2023 08 21 解决TSelectTable组件表单编辑回显设置defaultSelectVal 无效 2023 06 28 TSelectTable组件新增查询条件 效果如下 一 最终效果 二 代码示例
  • Vue3 + Element Plus 按需引入 - 自动导入

    文章目录 1 前言 1 1 目的 1 2 最终效果 2 准备工作 3 按需引入 3 1 安装插件 3 2 修改 vite config ts 文件 4 其他 4 1 ElMessageBox 使用时报错 4 1 1 Eslint 报错 El
  • 拥抱vite + vue3,制作一款属于自己的音乐播放器。

    VUE3 MUSIC 拥抱vite vue3 制作一款属于自己的音乐播放器 一 项目介绍 基于 VITE VUE3 TS PINIA TAILWINDCSS 开发的音乐播放器 界面模仿网易云音乐客户端 参考 SmallRuralDog vu
  • vue3+ts深入组件(四)动态组件

    一 引入 掌握程度 了解 使用Vue时 有时会遇到tab切换 如下图 1 可实现方法 1 v if 2 component动态组件 3 使用vue Router 路由切换 2 对比 第一种方法 v if 这可能是我们能最快想到的解决办法 但
  • 不习惯的 Vue3 起步六 の Echarts绘制下钻地图

    序 看过一些可视化大屏展示地图的例子 准备动手做做 既然要开始比制作 那么先把目标定好 做一个展示中国城市的下钻地图 使用 Vue3 Vite Typescript echarts 实现效果 准备工作 创建项目 因为准备使用Vue3 Vit
  • Vue3.0 PC端滑块拼图验证,配合后端验证

    Vue3 0 PC端滑块拼图验证 配合后端验证 简介 最近因为产品需要实现一个滑块拼图验证 而且需要配合后端进行验证 不想接入第三方SDK 所以自己手写了一个 主要是配合element plus 实现UI大致框架 背景图片和拼图都是通过后端
  • vue3组件之间通信(三)——爷孙组件传递属性和方法

    文章目录 1 setup函数传递属性和方法 attrs 1 代码 2 主要代码和详细讲解 3 注意点 2 script setup 语法糖传递属性和方法 1 代码 2 主要代码和详细讲解 3 注意点 前言 爷孙组件使用prop一层一层传值和
  • vue3中实现el-dialog弹窗

    vue3中的父子组件传递依然和vue2中的一样使用props和emit 但是写法略有不同 emit 自定义事件 子传父 props 父传子 父组件中
  • vue3中实现音频播放器APlayer

    前言 vue2的时候 分享了一个很好用的插件是vue aplayer 但是他是不支持vue3的 这里分享vue3使用APlayer来实现一个播放器的方法 实现效果 官方 git地址 点我 api地址 点我 实现步骤 1 安装 npm npm

随机推荐

  • GPT4来了?10秒钟做一个网站

    GPT4来了 10秒钟做一个网站 好了 我可以像雪容融一样躺平了 为什么雪容融都会wei gui 言归正传 3月15日 GPT4做一个网站只要十秒 登上热搜 根据视频中的演示 首先在草稿纸上画出一个基本的网页框架 图源视频截图 过了仅仅10
  • 【小沐学C++】C++ 常用命令行开发工具(Linux)

    文章目录 1 简介 2 gcc g 2 1 system 执行shell 命令 2 2 popen 建立管道I O 2 3 vfork exec 新建子进程 3 clang 3 1 下载和安装clang 3 2 clang和gcc比较 3
  • Blow Up 3macOS图片放大锐利的详细使用教程与安装方法

    软件介绍 Blow Up 3 macOS是一个Photoshop和Lightroom插件 亲测有效 适合于Adobe Photoshop CS6和Adobe Photoshop CC 2015或更高版本 Adobe Lightroom 6或
  • VsCode远程调试服务器python代码(解决相对路径相关问题)

    1 首先在本地使用VsCode调试python代码 可参考链接 VSCode启动Debug模式调试Python文件 2 vscode远程连接服务器 调试python文件 可参考链接 一文掌握vscode远程调试python代码 3 调试时
  • Google guava之Multiset简介说明

    转自 Google guava之Multiset简介说明 下文笔者讲述guava中Multiset集合的简介说明 如下所示 guava之Multiset集合简介 Multiset集合 可用于存储重复元素 Multiset是ArrayList
  • 一文1000字彻底搞懂Web测试与App测试的区别

    总结分享一些项目需要结合Web测试和App测试的工作经验给大家 从功能测试区分 Web测试与App测试在测试用例设计和测试流程上没什么区别 而两者的主要区别体现在如下几个方面 1 系统结构方面 Web项目 B S架构 基于浏览器的 Web测
  • Unity编辑器界面概述

    了解界面 如果您对编辑器界面没有非常地了解 那么请花一些时间查看并熟悉 Editor 编辑器 界面 Editor 主窗口由选项卡式窗口组成 这些窗口可重新排列 因此 Editor 的外观可能因项目或者开发者而异 具体取决于个人偏好 Wind
  • GitHub博客搭建

    git官网文档 https git scm com book zh v2 E6 9C 8D E5 8A A1 E5 99 A8 E4 B8 8A E7 9A 84 Git E7 94 9F E6 88 90 SSH E5 85 AC E9
  • mmdetection入门介绍-train.py解析

    四 train py解析 同样 上面有单GPU测试和多GPU测试 其实上面的测试是由训练导致的 单GPU训练 python tools train py CONFIG FILE 如果要在命令中指定工作目录 则可以添加参数 work dir
  • Oracle数据泵、exp/imp工具导入导出数据

    一 最常用导出导入方案 exp imp命令工具 1 ssh工具连接服务器主机 exp命令导出 1 1将数据库全部数据导出 exp system password TestDB file bak dmp log exp log full y
  • Vue 弹出层时 禁止页面滑动

    页面中加顶部蒙层 发现滑动时底部页面内容会正常滚动 一 移动端 直接在蒙层所在div上加 touchmove prevent就好了 div class masktop div 二 PC端 显示弹层调用stop 否则调用move stop 滑
  • 华为OD机试真题- 阿里巴巴找黄金宝箱(V)-2023年OD统一考试(B卷)

    题目描述 一贫如洗的樵夫阿里巴巴在去砍柴的路上 无意中发现了强盗集团的藏宝地 藏宝地有编号从0 N的箱子 每个箱子上面贴有一个数字 阿里巴巴念出一个咒语数字k k
  • leaflet geojson行政区域展示

    目录 获取geoJson数据 下载数据 获取本地json数据 L poylgan绘制图形 效果展示 完整代码 获取geoJson数据 下载数据 阿里云上下载不了的话 我把json数据放在网盘了 链接 百度网盘 请输入提取码 提取码 ifso
  • vue+django项目部署

    vue django项目部署 部署相关概念 项目服务器架构 反向代理 前端部署 docker docker安装 mac 使用常见命令 nginx 下载安装nginx镜像 域名解析 后端部署 MySQL镜像 Redis镜像 部署前处理 从服务
  • C语言:求最小值

    强数据版本 大佬写 include
  • 扁平化数组(多层嵌套)

    方法一 var arr 1 2 3 4 5 function flatten arr var len arr length var temp for var i 0 i
  • Ollydbg之进程线程调试

    目录 预备知识 1 进程 线程 实验目的 实验环境 实验内容和步骤 实验步骤 1 使用OD调试进程 2 使用OD调试线程 预备知识 本实验要求实验者具备如下的相关知识 1 进程 线程 进程 Process 和线程 Thread 是操作系统的
  • 华三交换机查看上层交换机vlan

    您可以使用Huawei三层交换机查看和配置上层交换机的VLAN设置 可以使用命令 display vlan vlan id 查看指定的VLAN配置 使用命令 vlan vlan id vlan name 配置VLAN设置
  • 【廖雪峰python入门笔记】tuple_创建单元素

    tuple和list一样 可以包含 0 个 1个和任意多个元素 包含多个元素的 tuple 前面我们已经创建过了 包含 0 个元素的 tuple 也就是空tuple 直接用 表示 t print t 创建包含1个元素的 tuple 呢 来试
  • vue3 新特性

    注册全局组件 import HelloWorld from components HelloWorld vue const app createApp App 全局挂载属性和方法 方法一 app config globalPropertie