关于VUE3的一些基础知识点笔记

news2024/11/20 8:36:50

关于VUE3的一些基础知识点笔记

VUE3

vue2与vue3的一个重要区别是vue2是选项式API(composition API)而vue3是组合式API(option API)。

组合式API就是所有逻辑都在setup函数中,使用ref、watch等函数来组织代码,而不像vue2中分别写在data、methods、watch等配置选项中。有可复用、易于维护等优点。

vue3的生命周期

与vue2对比:created钩子变成setup函数了,其他的都加了on

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qv5xKhAR-1685463643360)(C:\Users\28132\AppData\Roaming\Typora\typora-user-images\1685460357487.png)]

用的时候需要先导入函数

如:

<template>
  <div>生命周期函数</div>
</template>
<script setup>
  import { onMounted } from "vue";
  // 生命周期函数:组件渲染完毕
  onMounted(()=>{
    console.log('onMounted触发了')
  })

  onMounted(()=>{
    console.log('onMounted也触发了')
  })
</script>



1.setup函数

  • setup 函数是 Vue3 特有的选项,作为组合式API的起点
  • 从组件生命周期看,它在 beforeCreate 之前执行
  • 函数中 this 不是组件实例,是 undefined,所有的vue3项目中几乎没有this,都是通过函数来获取
  • 下面的例子可以先只看setup部分,15行的setup函数里面写的所有逻辑都需要用return来返回出来才可以在模板中使用
<template>
  <div>
    {{ name }}
    num: {{ obj.num }}
    <br>ref: {{ refNum }}
    <br>
    refObj:{{ refObj.name }}
    <button @click="btn">按钮</button>
  </div>
</template>

<script >
import { reactive, ref } from 'vue'
export default {
  setup () {
    // 普通对象不是双向绑定
    let name = "嘻嘻嘻"
    // reactive将里面的数据变成响应式数据 ,注意要导入,一般解决复杂数据类型转换响应式数据
    const obj = reactive({
      num: 1
    })
    // ref 定义简单数据类型和复杂数据类型为响应式数据
    //  ref简单数据类型
    const refNum = ref(1)
    //  ref复杂数据类型
    const refObj = ref({ name: 'jack' })
    /**
     * 是对象建议用reactive 其他用ref
     */

    const btn = function () {
      obj.num++
      refNum.value++
    }
    return { name, obj, btn, refNum, refObj }
  },

}
</script>

<style>

</style>

setup语法糖的使用来简化代码

  • 下面的写法是在script标签中写,定义的num可以直接使用
  • script setup 中的顶层变量都可以在模板使用,数据,函数,组件。
<template>
  <div>
    {{ num }}
  </div>
</template>

<script lang="ts" setup>
let num = 1

</script>

<style>

</style>

2. reactive函数

  • reactive 函数通常定义复杂类型的响应式数据,参数必须是对象或者数组,如果要让对象的某个元素实现响应式时比较麻烦。需要使用toRefs(后面会说)
  • reactive的响应式是深层次的,reactive方法内部是利用ES6的Proxy API来实现的,底层本质是将传入的数据转换为Proxy对象

使用步骤:

  • vue 中导出 reactive 函数
  • setup 函数中,使用 reactive 函数,传入一个普通对象,返回一个响应式数据对象
  • 最后 setup 函数返回一个对象,包含该响应式对象即可,模板中可使用
<template>
  <div>
    <p>姓名:{{state.name}}</p>
    <p>年龄:{{state.age}}</p>
  </div>
</template>

<script>
// 1. 导入函数
import { reactive } from "vue"; 
export default {
  setup() {
    // 2. 创建响应式数据对象
    const state = reactive({ name: 'sunny', age: 24 })
    // 3. 返回数据
    return { state }
  }
};
</script>

toRefs函数 保持响应式

  • 在使用reactive创建的响应式数据被展开或解构的时候使用toRefs保持响应式
<template>
  <div>
    这是vue3的框架!
    <br> obj: {{ name }}{{ age }}
    <br> <button @click="btn"></button>
  </div>
</template>
<script setup>
import { reactive, toRefs } from "vue";
let obj = reactive({
  name: 'jack',
  age: 1
})
// obj是reactive的响应式数据,
// 使用了解构后就不是响应式的了
// 用toRefs转换成响应式数据
const { name, age } = toRefs(obj)

const btn = function () {
  name.value = 'rose',
    age.value++
}
</script>
<style>

</style>

3.ref 函数

3.1 ref定义数据

  • ref通常用来定义响应式数据,不限类型
  • ref响应式原理是依赖于Object.defineProperty()get()set()的。
  • ref参数一般接收简单数据类型,若ref接收对象为参数,本质上会转变为reactive方法,系统会自动根据我们给ref传入的值转换成ref(1)->reactive({value:1}) ,ref函数只能操作浅层次的数据,把基本数据类型当作自己的属性值;深层次依赖于reactive

使用步骤:

  • vue 中导出 ref 函数
  • setup 函数中,使用 ref 函数,传入普通数据(简单or复杂),返回一个响应式数据
  • 最后 setup 函数返回一个对象,包含该响应式数据即可
  • 注意:在template中访问,系统会自动添加.value;在js中需要手动.value
<template>
  <div>
    <p>
      计数器:{{ count }}
      <button @click="count++">累加1</button>
      <!-- template中使用可省略.value -->
      <button @click="increment">累加10</button>
    </p>
  </div>
</template>

<script>
// 1. 导入函数
import { ref } from "vue";
export default {
  setup() {
    // 2. 创建响应式数据对象
    const count = ref(0);
    const increment = () => {
      // js中使用需要.value
      count.value += 10;
    };
    // 3. 返回数据
    return { count, increment };
  },
};
</script>

  • reactive与ref该如何选择?

如果能确定数据是对象且字段名称也确定,可使用 reactive 转成响应式数据,其他一概使用 ref

ref使用起来有点麻烦呀,需要.value 增加代码量,所以确认是复杂数据类型咱就用reactive

3.2 ref 获取DOM元素

  • 元素上使用 ref属性关联响应式数据,获取DOM元素
<script setup>
import { ref } from 'vue'
const hRef = ref(null) 
//在onMounted钩子中来获取dom元素
onMounted(()=>{
    console.log(dom)
})

</script>

<template>
  <div>
    <h1 ref="dom">我是盒子</h1>
  </div>
</template>

3.3 ref操作组件-defineExpose

  • 组件上使用 ref属性关联响应式数据,获取组件实例
  • 使用 <script setup> 的组件是默认关闭的,组件实例使用不到顶层的数据和函数。
  • 需要配合 defineExpose 暴露给组件实例使用,暴露的响应式数据会自动解除响应式。

子组件:将数据与方法暴露出去

<template>
  <div>
    <h1>son</h1>
  </div>
</template>
<script setup>

// 子向父传数据
let num = 1
let str = 'son'
const handle = function () {
  return '123son321'
}
// 要让父组件获取数据与方法,需要用defineExpose({})将数据暴露出去,参数是对象
defineExpose({ num, str, handle })
</script>
<style>

</style>

父组件:使用子组件暴露出来的方法与数据

<template>
  <div>
    这是父组件
    <Son ref="sonDom"></Son>
  </div>
</template>
<script setup>
import Son from './components/son.vue'
import { ref, onMounted } from "vue";
// 获取子组件的数据与方法
const sonDom = ref()
onMounted(() => {
  console.log(sonDom.value);
  console.log('Son的num值:', sonDom.value.num); //1
  console.log('Son的str值:', sonDom.value.str); //son
  console.log('Son的handle方法:', sonDom.value.handle()); //123son321
})
</script>
<style>

</style>

4. computed函数

  • 定义计算属性

大致步骤:

  • vue 中导出 computed 函数
  • setup 函数中,使用 computed 函数,传入一个函数,函数返回计算好的数据
  • 最后 setup 函数返回一个对象,包含该计算属性数据即可,然后模板内使用
<template>
  <div>
    {{ total }}4111

  </div>
</template>
<script setup>
import { computed } from 'vue'
// 计算属性
let arr = [12, 45, 65, 32, 12]
const total = computed(() => {
  return arr.reduce((sum, item) => sum + item, 0)
})
console.log(total);
</script>
<style>

</style>

小例子:动态求和:

<template>
  <div>
    {{ arr }}:{{ total }}
    <input v-model="num" type="text" @change="handle" placeholder="请输入数字" />
  </div>
</template>
<script setup>
import { computed, ref } from 'vue'
// 计算属性
let arr = ref([12, 45, 65, 32, 12])
const total = computed(() => {
  return arr.value.reduce((sum, item) => (sum += Number(item)), 0)
})

let num = ref(0)
const handle = () => {
  arr.value.push(num.value)
}
// console.log(total);
</script>
<style>

</style>

5.watch函数

  • 使用watch函数监听数据的变化
  • watch(需要监听的数据,数据改变执行函数,配置对象) 来进行数据的侦听
  • 数据:单个数据,多个数据,函数返回对象属性,属性复杂需要开启深度监听
  • 配置对象:deep 深度监听 immediate 默认执行

见代码中的注释:

<template>
  <div>
    num:{{ num }} <br>
    obj:{{ obj }} <br>
    <button @click="btn">点我加1</button>
  </div>
</template>
<script setup>
import { ref, reactive, watch } from 'vue'
let num = ref(0)
const btn = function () {

  return num.value++, obj.id++
}
let obj = reactive({ id: 1, name: 'jack' })
// watch监听数据 watch(基本数据类型 || 数组 || 回调函数, 回调函数 , 配置项)

// 1. 监听基本数据类型
// watch(num, (newVal, oldVal) => {
//   console.log('newVal:', newVal, '===oldVal', oldVal);
// })

// 2.监听整个复杂数据类型 只能监听到新值,旧值无法显示
// watch(obj, (newVal, oldVal) => {
//   console.log('newVal:', newVal, '===oldVal', oldVal);
// })

// 3.监听复杂数据类型的某一项数据,第一项改为函数
// watch(() => obj.id, (newVal, oldVal) => {
//   console.log('newVal:', newVal, '===oldVal', oldVal);
// })

// 4.同时监听简单数据类型和复杂数据类型,第一项改为数组
watch([() => obj.id, num], (newVal, oldVal) => {
  console.log('newVal:', newVal, '===oldVal', oldVal);
})
/**i
 * 
 * newVal: (2) [2, 1] ===oldVal (2) [1, 0]
   newVal: (2) [3, 2] ===oldVal (2) [2, 1]
   newVal: (2) [4, 3] ===oldVal (2) [3, 2]
   newVal: (2) [5, 4] ===oldVal (2) [4, 3]
 */
</script>
<style>

</style>

  • 使用 watch 监听,配置默认执行:

  •   {
        // 开启深度监听
        deep: true,
        // 默认执行一次
        immediate: true
    }
    

6. 父传子与子传父(defineProps与defineEmits)

  • 实现组件通讯中的父子组件通讯

子组件:

<template>
  <div>
    <h1>son</h1>
    <button @click="toFather">子向父传值</button>
  </div>
</template>
<script setup>
// 父传子---子接收:
const props = defineProps({
  name: String,
  num: String
})
console.log(props);
console.log(props.name, props.num);
//--------------------
// 子向父传值
const emit = defineEmits(['sonHandle'])
const toFather = function () {
  emit('sonHandle', '我是子组件son')
}

</script>
<style>

</style>

父组件:

<template>
  <div>
    <Son name="sunny" :num="num" @sonHandle="sonHandle($event)"></Son>===
  </div>
</template>
<script setup>
import Son from './components/son.vue'
import { ref } from "vue";
const num = ref('123')
const sonHandle = (e) => {
  console.log(e);
}
</script>
<style></style>

在这里插入图片描述

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

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

相关文章

使用HTTP协议在k780网站上获取天气-----天气预报

文章目录 项目介绍一、项目任务二、项目流程规划以及代码实现1.总流程2.引入库3.总体流程相关函数 三、功能函数的实现1. TCP函数2. 输入城市信息3. 查询今天天气4. 查询未来一周天气5. 查询历史天气6. 退出 总结 项目介绍 本期主要使用TCP网络编程实现天气预报的功能&#xff…

基于Html5的在线资料库的设计与实现(asp.NET,SQLServer)

在线资料库系统采用.NET开发平台进行开发&#xff0c;开发工具采用Microsoft Visual Studio 2010集成开发环境&#xff0c;后台编程语言采用C#编程语言来进行编程开发&#xff0c;数据库我们采用当下流行的SQL Server 2008数据库管理系统来存放平台中的数据信息&#xff0c;整个…

【Windows设置篇】字符集-简繁体的切换

【Windows设置篇】字符集-简繁体的切换 微软自带键盘&#xff0c;有次傻啦吧唧的一直找繁体切换简体的方法&#xff0c;进设置里面切换地区&#xff0c;更换地址也不行&#xff0c;后面才发现是在"字符集"里面切换—【蘇小沐】 文章目录 【Windows设置篇】字符集-简…

Maven jar 包下载失败问题处理【配置Maven国内源】

前言 很多同学在Maven里下载一些依赖的时候&#xff0c;即下载【jar 包】的时候总是会出现一些问题&#xff0c;这里专门做一个教程讲解一下 其实这和你的Maven配置是有关系的&#xff0c;因为Maven是一个国际站点&#xff0c;它的仓库是在国外的&#xff0c;所以我们有时候在下…

【C++】函数高级 - 默认参数,占位参数,函数重载基本语法,函数重载注意事项

No.Contents1【C】基础知识 - HelloWorld&#xff0c;注释&#xff0c;变量&#xff0c;常量&#xff0c;关键字&#xff0c;标识符2【C】数据类型 - 整型&#xff0c;sizeof&#xff0c;实型&#xff0c;字符型&#xff0c;转义字符&#xff0c;字符串类型&#xff0c;布尔类型…

chatgpt赋能python:Python中浮点数的定义

Python中浮点数的定义 什么是浮点数&#xff1f; 在计算机科学中&#xff0c;浮点数&#xff08;floating-point number&#xff09;是一种用于表示实数的近似值的数值类型。Python中的浮点数是由整数部分和小数部分组成的&#xff0c;可以使用小数点来表示。例如&#xff0c…

考研C语言第七章

7.2函数的声明定义&#xff0c;函数的分类和调用 1、函数声明要在main函数上面&#xff0c;这样main函数才可以进行调用 第一节课主要就学了函数的调用&#xff0c;项目在开发的时候分工用的比较多 主要结构&#xff1a; func.c里面进行函数的定义 不是很重要&#xff0c;进…

IDEA+Mysql+Sqlserver安装步骤_kaic

下载Intellij 开发工具&#xff0c;如果有请检查软件是否过期&#xff0c;如果过期卸载电脑上的Intellij软件。卸载步骤&#xff1a; 打开控制面板&#xff0c;选择卸载程序找到Intellij右键卸载 如果没有请保存文档中的Intellij.zip压缩包,进行安装&#xff0c;安装步骤 双…

查看 HTTP 请求的数据.

文章结构 如果是 GET 请求如果是 POST 请求方法1&#xff1a;DEBUG 窗口&#xff08;**爽、超级爽、吴迪爽**&#xff09;&#xff1a;方法2&#xff1a;写方法读取流中数据&#xff08;繁琐&#xff0c;难用&#xff09;&#xff1a; 我们可能会碰到 MVC 拿不到前端的参数&…

何时加索引,性别字段和逻辑删除字段应不应该加

首先哪些地方加索引&#xff08;按照sql执行顺序写&#xff09; 1、from表扫描连接处索引 2、where后条件去走索引 3、group by加索引 4、select查询不用加 5、order by排序加索引 &#xff08;对于第四点&#xff0c;覆盖索引&#xff1a;查询的字段都被索引覆盖&#xff0c;…

chatgpt赋能python:Python中用什么表示空格

Python中用什么表示空格 空格在编程中是一个非常重要的概念&#xff0c;特别是在Python中。Python是一门非常灵活的语言&#xff0c;空格是它语法的一个关键组成部分。今天我们将探讨的是Python中用什么表示空格。 空格是Python中的一个重要概念&#xff0c;它被用来表示代码…

spdk记录

spdk记录 hello_bdev命令行参数 往期文章&#xff1a; spdk环境搭建 hello_bdev 代码路径&#xff1a;examples/bdev/hello_world/hello_bdev.c 可执行文件路径&#xff1a;build/examples/hello_bdev 刚开始直接执行hello_bdev显示找不到Malloc0 ./build/examples/hello_b…

Vue3-devtools开发者工具正确安装方法

目录 前言&#xff1a;1、下载安装2、添加扩展 前言&#xff1a; 最近在学习Vue3&#xff0c;学习Vue3自然离不开调试工具Vue3-Devtools&#xff0c;所以我们需要来下载这个调试工具并放入谷歌浏览器里的扩展程序里面。帮助我们更好的调试vue3里的程序。 1、下载安装 Github下…

【C#图解教程】第四章 类型、存储和变量 学习笔记总结

类型 C#是一组类型声明&#xff0c;这个与第三章&#xff1a;命名空间就是一组类型声明可以一起理解。类型是一个用来创建数据结构的模板&#xff1a; 使用这个模板创建对象的过程叫做实例化&#xff0c;所以创建的对象也叫实例 类型成员 简单类型可能只包含一个数据成员&…

JavaEE HTTPS加密原理

HTTPS加密原理✿✿ヽ(▽)ノ✿ 文章目录 JavaEE & HTTPS加密原理1. 为什么要加密2. HTTPS加密原理2.1 初始想法2.2 引入非对称加密2.3 中间人攻击2.4 引入证书 JavaEE & HTTPS加密原理 1. 为什么要加密 例子&#xff1a;&#xff08;运营商劫持&#xff09; 你可能经常…

C语言system()函数

文章目录 C语言system()函数system(“pause”)system(“color num1num2”)system(“cls”)system(“title name”)system(“time /T”) & system(“date /T”) C语言system()函数 头文件&#xff1a; #include<stdlib.h>system(“pause”) 作用&#xff1a;暂停程序进…

AI Canon精选资源清单;带AI功能的PS安装文件与教程;讯飞星火10月对标 ChatGPT;直播换脸工具盘点 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; AI Canon&#xff1a;人工智能精选资源清单 思维导图 ShowMeAI知识星球资源编码&#xff1a;R106 AI Canon 是由美国著名的风投机构 …

【靶场实战】Vulnhub - JANGOW: 1.0.1 靶标实战

靶场地址&#xff1a;https://www.vulnhub.com/entry/jangow-101,754/ 靶场IP&#xff1a;192.168.160.215 信息收集 使用Nmap对目标进行扫描 Nmap -sV -O -p- 192.168.160.215 经过漫长的等待扫描完成&#xff0c;该靶标开启了21、80两个端口&#xff0c;21端口运行服务为f…

chatgpt赋能python:Python中按钮的位置摆放

Python中按钮的位置摆放 在Python应用程序中&#xff0c;按钮是常见的交互元素之一。按钮通常用于响应用户的操作&#xff0c;例如提交表单或执行某些功能。然而&#xff0c;在设计应用程序时&#xff0c;按钮的位置是一个重要的问题&#xff0c;因为它将直接影响用户体验和应…

chatgpt赋能python:Python中的画图——创建漂亮的可视化图像

Python中的画图——创建漂亮的可视化图像 Python是一个高度可编程的语言&#xff0c;因此它非常适合用于创建各种类型的可视化。 在本文中&#xff0c;我们将介绍Python中的画图。我们将讨论如何使用Python和一些流行的数据可视化库来创建漂亮的可视化图像。我们还将探讨如何…