vue3的核心知识点合集

news2024/9/24 13:13:48
  1. Vue3 中文文档(新)  Vue.js - 渐进式 JavaScript 框架 | Vue.js

vue3的优点:

  1. 首次渲染更快
  2. diff 算法更快
  3. 内存占用更少
  4. 打包体积更小
  5. 更好的 Typescript 支持
  6. Composition API 组合 API

 首先理解一下vite 构建工具:

vite是一种新型前端构建工具,能够显著提升前端开发体验。

对比 webpack:

  • webpack需要查找依赖,打包所有的模块,然后才能提供服务,更新速度会随着代码体积增加越来越慢

而vite 的原理是:

  • 使用原生 ESModule 通过 script 标签动态导入,访问页面的时候加载到对应模块编译并响应

 基于 webpack 构建项目  与  基于 vite 构建项目,谁更快体验更好?vite

基于 webpack 的 vue-cli 也可以创建 vue 项目,只是慢一点而已。

 6.进入项目目录,安装依赖,启动项目即可。npm i         pnpm run dev或npm run dev启动项目

Vue3提供两种组织代码逻辑的写法:

  • 通过data、methods、watch 等配置选项组织代码逻辑是选项式API写法
  • 所有逻辑在setup函数中,使用 ref、watch 等函数组织代码是组合式API写法

 一、组合式api

  • 在setup中通过vue提供的函数组织代码实现功能,就是组合式API写法。
  • 组合式API的好处:可复用,可维护
  • ref 就是一个组合式API

 二、生命周期函数

Vue2和Vue3生命周期对比

 三、Vue3常用核心语法

1.setup函数

特点:

(1)setup函数是vue的特有选项,是组合式api的入口函数

(2)从生命周期看,它在beforeCreate之前执行

(3)作为入口函数,必须要有return

(4)没有this值

注:setup 中返回的对象数据不是响应式的,需要使用ref和reactive转成响应式

 代码示例:

<template>
  <div>
   ===vue3
   ===={{ num }}
   ===={{ obj.age }}==={{ obj.name }}
   <button @click="btn">按钮</button>
  </div>
 </template>
 <script>
 import {ref,reactive} from 'vue'
    export default {
      name:'',
      setup(){
        //  ref定义响应式数据,不限数据类型 更改数据需要.value
       let num=ref(10)
      //  reactive定义响应式数据,只限于复杂数据类型  更改数据不需要.value
       let obj=reactive({age:12,name:'jack'})  
       
       const btn=()=>{
         num.value+=2
         obj.age=18
         obj.name='rose'
         console.log(num.value,obj.age,obj.name,99);
      }
      return {num,obj,btn}
    }
  }  
 </script>
 <style lang='less'  scoped>
  
 </style>

2.setup语法糖: 

作用:简化 setup 固定代码 ,让代码更简洁 

使用:

(1)直接在script标签里面写setup 不用return 和 export default

(2)导入组件之后可以直接使用,不用注册

代码示例:

<template>
  <div>
    ===vue3
    ===={{ num }}
    ===={{ obj.age }}==={{ obj.name }}
    <button @click="btn">按钮</button>
  </div>
</template>

<script setup>
// setup写在script标签上就是语法糖,优化代码,不需要导入导出,在导入组件的时候也不需要注册
import { ref, reactive } from 'vue'
//  ref定义响应式数据,不限数据类型 更改数据需要.value
let num = ref(10)
//  reactive定义响应式数据,只限于复杂数据类型  更改数据不需要.value
let obj = reactive({ age: 12, name: 'jack' })
const btn = () => {
  num.value += 2
  obj.age = 18
  obj.name = 'rose'
  console.log(num.value, obj.age, obj.name, 99);
}
</script>
<style lang='less'  scoped>

</style>

3.ref函数

作用:

(1)定义响应式数据,所有数据类型都可以使用(除复杂数据类型外,其他数据类型常用ref( )  )

使用步骤:

1.从vue中导入ref

2.在 setup 函数中,使用 ref 函数,传入数据,返回一个响应式数据

3.使用 ref 创建的数据,js 中需要 .value来取值 ,template模板 中可省略

 

(2)获取DOM元素,相当于Vue2中的自定义指令

 使用步骤:

1.从vue中导入ref

2.模板中建立关联: ref="自定义属性名"

3.使用: 自定义属性名.value

代码示例: 

<script setup>
  // 常用的 onMounted 组件渲染完毕:发请求,操作dom,初始化图表...
  import {ref, onMounted } from "vue";
  // 生命周期函数:组件渲染完毕
  onMounted(()=>{
    console.log('onMounted触发了')
    console.log(dom,'dom111');
  })

  // 默认值是null,需要在渲染完毕后访问DOM属性。
  let dom=ref(null)
  const btn=()=>{
    console.log(dom.value,'dom222');
  }
</script>

<template>
  <div>生命周期函数
    <h1 ref="dom">我是标题h1</h1>
    <button @click="btn">按钮操作dom</button>
  </div>
</template>

 4.reactive函数

作用:定义复杂数据类型的响应式数据,不能定义简单数据类型

使用步骤:

1.从vue中导入 reactive

2.在 setup 函数中,使用 reactive 函数,传入复杂数据类型数据,返回一个响应式数据

3.使用 reactive 创建的数据,js 和 template 模板中都可以直接使用

5.computed函数 

作用:计算属性

使用步骤:

1.从vue中导入 computed

2.在 setup 函数中,使用 computed 函数,参数是一个函数,函数返回计算好的数据

3.计算好的数据在 js 中需要.value取值,template 模板中可以直接使用

 代码示例: 

<script setup >
    import {ref,reactive,computed} from 'vue'
    let arr=reactive([1,2,3,4,5])
    let val=ref(1)

    // computed动态求和 这里数组发生改变,computed计算属性就会触发  
    const total=computed(()=>{
     return arr.reduce((sum,item)=> sum+Number(item) ,0)
    })
    const handel=()=>{
        arr.push(val.value)
    }
</script>
<template>
 <div>
  御剑乘风来,除魔天地间!===vue3
  ======{{ total }}======={{ arr }}
  <input type="text" @blur="handel" v-model="val" placeholder="请输入数字">
 </div>
</template>
<style lang='less'  scoped>
    
</style>

6.watch函数 

作用:监听数据的变化

使用步骤:

1.从vue中导入 watch

2.在 setup 函数中,使用 watch 函数,参数有以下几种情况:

  (1)监听简单数据类型,参数为:值,(newVal,oldVal)=>  { }  ,配置项

  (2)监听复杂数据类型,参数为:值,(newVal)=>  { }  ,配置项

  (3)监听对象中某个属性,参数为:()=>对象.属性,(newVal,oldVal)=>  { }  ,配置项

  (4)同时监听多个数据,参数为:[数据1,数据2...],(newVal,oldVal)=>  { }  ,配置项

代码示例:

(1)监听简单数据类型

    // watch(需要监听的数据||函数,数据改变执行函数,配置对象) 来进行数据的侦听
    // 1 使用 watch 监听一个简单数据类型
    import {ref,watch } from 'vue'
    let num=ref(0)
   
    // setTimeout只执行一次
    setTimeout(()=>{
      num.value++
    },1000)

    // 监听num的变化
    watch(num,(nerval,olduvai)=>{
      console.log(nerval,olduvai,'num发生改变了');
    })

(2)监听复杂数据类型

     // 2 使用 watch 监听响应式对象数据中的一个属性(简单)
    import {reactive,watch } from 'vue'
    let obj=reactive({age:18,name:'jack'})
   
   const btn=()=>{
    obj.age+=2
    obj.name='rose'
   }

    // 监听obj的变化 ,监听复杂数据类型的时候,只有新值newVal,没有旧值oldVal
  watch(obj,(newVal)=>{
    console.log(obj,newVal);
  })

(3)监听对象中某个属性

    //3 使用 watch 监听响应式对象数据中的一个属性(监听复杂数据类型)
    import { reactive, watch } from "vue";
  const obj = reactive({
    num: 33,
    info: {
      name: "jack",
      age: 18,
    },
  });

   const btn=()=>{
    obj.num+=10
    obj.info.age+=2
    obj.info.name='rose'
   }

  watch(()=>obj.info.age,(newVal,oldVal)=>{
      console.log(obj.info.age,obj.info.name,newVal,oldVal);
  })

(4)同时监听多个数据

// 4 使用 watch 监听多个数据
    import {ref,reactive,watch } from 'vue'
    let num=ref(1)
    let obj=reactive({age:18,name:'jack'})
   
   const btn=()=>{
    num.value+=1
    obj.age+=2
    obj.name='rose'
   }

    // 同时监听多个数据类型 newVal是一个数组
  watch([()=>obj.age,num],(newVal,oldVal)=>{
    console.log('111',newVal,oldVal);
  })

7.ref操作组件-defineExpose函数
作用:使用 <script setup> 的组件是默认关闭的,组件实例使用不到顶层的数据和函数。通过defineExpose函数可以将子组件中的数据和方法暴露出去,父组件直接通过ref就能调用子组件中的数据和方法

 使用步骤:

1.子组件: defineExpose({变量名,函数名,... })

2.父组件: ref名.value.xxx 直接调用

 

8.父传子-defineProps函数 
作用:实现父传子组件通讯

使用步骤:

1.父组件:和vue2语法一样正常传值

2.子组件:用defineProps接收

3.在js中,通过defineProps的返回值来接收使用数据,template 模板中可以直接使用

 

 9.子传父-defineEmits函数
 作用:实现子传父组件通讯

使用步骤:

1.子组件:

通过defineEmits声明事件名称,并接收返回值emit

根据条件触发emit('事件名称','传值'),进行传值

2.父组件:

模板中接收@事件名="新函数"

js中新函数可以通过参数e,接收传值

 

 10.跨级组件通讯provide与inject函数
作用:通过provide和inject函数实现简单的跨级组件通讯

使用步骤:

1.祖先组件

(1)从 vue 中导出 provide 函数

(2)provide('变量名', 变量值);

2.子/孙组件

(1)从 vue 中导出 inject 函数

(2)const value = inject('变量名')

Q:如何通过provide和inject实现响应式数据传值?
1.祖先组件先传变量和函数给子/孙组件
2.子/孙组件接收函数并调用传值
3.祖先组件中的函数接收传值,并对变量重新赋值 

父组件示例代码:

<script setup>
// provide和inject是解决跨级组件通讯的方案
// provide 提供后代组件需要依赖的数据或函数
// inject 注入(获取)provide提供的数据或函数
import Son03 from "./components/Son03.vue";

import { ref, reactive, provide } from 'vue';
const count = ref(100)
const obj = reactive({ age: 18, name: '小花' })
const addFn = (e) => {
  obj.name = e
  console.log(e);
}
// provide 提供后代组件需要依赖的数据或函数
// provide(键,值)  传值
provide('newCount', count.value)  //祖先组件向子组件和sun组件传值
provide('newObj', obj)
provide('newAddFn', addFn)
</script>
<template>
  <div>
    <h3>我是父组件===vue3</h3>
    <div>余额:{{ count }}元</div>
    <div>姓名:{{ obj.name }}</div>
    <hr />
    <Son03></Son03>
  </div>
</template>
<style lang='less'  scoped>

</style>

 子组件示例代码:

<script setup >
// 导入sun组件 
import sun from "./sun.vue";
 
</script>
<template>
  <div>
    <div>我是子组件===Son03</div>
    <hr />
    <sun></sun>
  </div>
</template>
<style lang='less'  scoped>

</style>

 孙组件示例代码:

<script setup >
// 跨级sun组件接收爷爷传过来的值count和obj  addFn函数
import { inject } from 'vue';
let newCount = inject('newCount')
let newObj = inject('newObj')
let newAddFn = inject('newAddFn')
console.log(newCount, 111);
console.log(newObj, 222);
console.log(newAddFn, 333);

const btn = (e) => {
  console.log(e, 444);
  newAddFn('小红')
}
</script>
<template>
  <div>
    <div>我是sun组件===sun</div>
    <div>{{ newCount }}</div>
    <div>{{ newObj }}</div>
    <div>{{ newAddFn }}</div>
    <button @click="btn">按钮</button>
  </div>
</template>
<style lang='less'  scoped>

</style>

11.保持响应式 toRefs函数
作用:在使用reactive创建的响应式数据被展开或解构的时候使用toRefs保持响应式

使用步骤:

1.从 vue 中导出 toRefs 函数

2.将被展开或解构的数据作为参数传入toRefs 函数

3.解构后的数据是一个变量,依然可以保持响应式,但js中需要通过.value取值,模板中不用
 

<script setup >
  import {reactive, toRefs} from 'vue'
  // 当去解构和展开响应式数据对象使用 toRefs 保持响应式
    const user =reactive({name:'tom',age:'18',gender:'男'})
    // const {name,age,gender}=user  //这种解构的写法 响应式失效
    const {name,age,gender}=toRefs(user)  //在解构对象的时候 使用了toRefs 才能保持数据是响应式的

  const btn=()=>{
    user.name='rose'
    user.age=28
    user.gender='女'
  }
</script>
<template>
 <div>
  御剑乘风来,除魔天地间!===vue3
      <!-- ===姓名:{{user.name}}===年龄:{{ user.age }}===性别:{{ user.gender }} -->
      ===姓名:{{name}}===年龄:{{ age }}===性别:{{ gender }}
      <button @click="btn">改变数据按钮</button>
 </div>
</template>
<style lang='less'  scoped>
    
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/340749.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解答vue组件中一级组件可不可以作二级组件这个疑惑

引子 大家请看如下情况&#xff0c;我需要做一个项目&#xff0c;首页上的“产品介绍”部分同样也是导航导向的一部分&#xff1a; 首页中的部分&#xff1a; 导航栏导向的部分&#xff1a; 这里我要表达的是&#xff0c;组件Case在导航栏中属于一级路由&#xff0c;而在首…

解决idea出现的java.lang.OutOfMemoryError: Java heap space的问题

文章目录1. 复现问题2. 分析问题3. 解决问题4. 补充解决java.lang.OutOfMemoryError: PermGen space问题1. 复现问题 今天使用idea开发时&#xff0c;突然报出如下错误&#xff1a; Exception in thread "main" java.lang.OutOfMemoryError: Java heap spaceat org.…

【测试开发】web 自动化测试 --- selenium4

目录1. 什么是自动化为什么要做自动化2. 为什么选择selenium作为我使用的web自动化工具3. 什么是驱动&#xff1f;驱动的工作原理是什么5. 第一个自动化程序演示6. selenium基本语法6.1 定位元素的方法6.2 操作页面元素6.3 等待6.4 信息打印获取当前页面句柄&#xff0c;窗口切…

vue脚手架安装详细

一、vue脚手架安装命令npm i -g vue/cli 或 yarn global add vue/cli安装上面的工具&#xff0c;安装后运行 vue --version &#xff0c;如果看到版本号&#xff0c;说明安装成功或 vue -V工具安装好之后&#xff0c;就可以安装带有webpack配置的vue项目了。创建项目之前&#…

基于java的学生成绩管理系统 完整代码 毕业设计

完整项目代码&#xff1a;https://download.csdn.net/download/qq_38735017/87382417下面是程序界面的详情&#xff1a;分享不易 谢谢&#xff01;主界面首先是开始界面&#xff0c;功能选择窗口&#xff0c;包含 5 个功能按钮清除数据功能清空数据库数据&#xff08;若出现 bu…

问题状态(Conditioning of a problem)

Conditioning of a problem该博客是学习《Numerical Linear Algebra with Applications Using MATLAB》的一些总结&#xff0c;仅供学习使用。 通常即使使用一个稳定的算法来解决一个问题&#xff0c;该问题对数据中小的改变或扰动仍然是敏感的。这些扰动可能来自舍入误差(roun…

Python与Arcgis 获取图像信息

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这里实现一个很简单的功能,批量的获取图像的相关信息,如影像格式、y分辨率等等,并将这些信息写入到一个csv文件中,同时也会为每个图像生成相应的矩形掩模面。 二、实现代码 在真正执行代码之前,我们首先配置一…

PAT——1111 对称日

央视新闻发了一条微博&#xff0c;指出 2020 年有个罕见的“对称日”&#xff0c;即 2020 年 2 月 2 日&#xff0c;按照 年年年年月月日日 格式组成的字符串 20200202 是完全对称的。 给定任意一个日期&#xff0c;本题就请你写程序判断一下&#xff0c;这是不是一个对称日&a…

DDD 参考工程架构

1 背景 不同团队落地DDD所采取的应用架构风格可能不同&#xff0c;并没有统一的、标准的DDD工程架构。有些团队可能遵循经典的DDD四层架构&#xff0c;或改进的DDD四层架构&#xff0c;有些团队可能综合考虑分层架构、整洁架构、六边形架构等多种架构风格&#xff0c;有些在实…

【JUC并发编程】ArrayBlockingQueue和LinkedBlockingQueue源码2分钟看完

文章目录1、BlockingQueue1&#xff09;接口方法2&#xff09;阻塞队列分类2、ArrayBlockingQueue1&#xff09;构造函数2&#xff09;put()入队3&#xff09;take()出队3、LinkedBlockingQueue1&#xff09;构造函数2&#xff09;put()入队3&#xff09;take()出队1、Blocking…

Android Dalvik虚拟机 对象创建内存分配流程

前言 本篇文章介绍我们在日常开发使用Java时new对象的时&#xff0c;Dalvik在堆上的内存分配是如何分配的。内存又和gc相关&#xff0c;下篇文章会分析Dalvik的gc流程。 Dalvik内存管理 内存碎片问题其实是一个通用的问题&#xff0c;不单止Dalvik虚拟机在Java堆为对象分配内…

Python中的类和对象(7)

1.私有变量 在大多数面向对象的编程语言中&#xff0c;都存在着私有变量&#xff08;private variable&#xff09;的概念&#xff0c;所谓私有变量&#xff0c;就是指通过某种手段&#xff0c;使得对象中的属性或方法无法被外部所访问。 Python 对于私有变量的实现是引入了一…

MySQL数据库调优————数据库调优维度及测试数据准备

MySQL性能优化金字塔法则 不合理的需求&#xff0c;会造成很多问题。&#xff08;比如未分页&#xff0c;数据需要多表联查等&#xff09;做架构设计的时候&#xff0c;应充分考虑业务的实际情况&#xff0c;考虑好数据库的各种选择&#xff08;比如是否要读写分离&#xff0c;…

Spring IOC Bean标签属性介绍(内含教学视频+源代码)

Spring IOC Bean标签属性介绍&#xff08;内含教学视频源代码&#xff09; 教学视频源代码下载链接地址&#xff1a;https://download.csdn.net/download/weixin_46411355/87442649 目录Spring IOC Bean标签属性介绍&#xff08;内含教学视频源代码&#xff09;教学视频源代码…

jetson nano(ubuntu)安装Cmake

文章目录安装环境一.命令行安装二.Cmake源码编译安装安装环境 jetson nano 系统&#xff1a;4.6.1 一.命令行安装 sudo apt install cmake这种直接安装cmake的方式&#xff0c;其实安装的版本都太老了&#xff0c;这种方式不推荐 二.Cmake源码编译安装 更新一下系统软件 su…

子词嵌入,词的相似性和类比任务

fastText模型提出了一种子词嵌入方法&#xff1a;基于word2vec中的跳元模型&#xff0c;它将中心词表示为其子词向量之和。 字节对编码执行训练数据集的统计分析&#xff0c;以发现词内的公共符号。作为一种贪心方法&#xff0c;字节对编码迭代地合并最频繁的连续符号对。 子…

文献阅读:Finetuned Language Models Are Zero-Shot Learners

文献阅读&#xff1a;Finetuned Language Models Are Zero-Shot Learners 1. 文章简介2. 方法介绍3. 实验 1. 数据集整理2. 基础实验3. 消解实验 1. finetune任务数量2. 模型size3. Instruct Tuning4. Few-Shot5. Prompt Tuning 4. 结论 文献链接&#xff1a;https://arxiv.o…

简单理解小目标分割中的weighted BCE Loss与weighted IoU Loss

这两个损失函数出自《FNet: Fusion, Feedback and Focus for Salient Object Detection》一文中&#xff0c;用于处理显著性检测(二分割)中小目标的问题。对于传统的BCE Loss&#xff0c;其存在以下三个问题&#xff1a; 只是简单的将每个像素求BCE再平均&#xff0c;忽视了目…

day5——冒泡排序,选择排序和插入排序的学习

选择排序冒泡排序插入排序 选择排序 选择排序的基本思路就是&#xff1a; 首先假定第一个的下表为所有元素中最小的一个&#xff0c; 然后用后面的每一个元素跟这个元素进行比较&#xff0c; 如果后面的元素比这个元素更小一点&#xff0c; 那么就将找到的最小的元素的下标和…

【c++】vector实现(源码剖析+手画图解)

vector是我接触的第一个容器&#xff0c;好好对待&#xff0c;好好珍惜&#xff01; 目录 文章目录 前言 二、vector如何实现 二、vector的迭代器&#xff08;原生指针&#xff09; 三、vector的数据结构 图解&#xff1a; 四、vector的构造及内存管理 1.push_back() …