当前位置: 首页 > news >正文

Vue入门项目——WebApi

Vue入门——WebApi

    • vue3项目搭建
    • 组合式API
      • 响应式API
        • reactive()
        • ref()
      • 生命周期钩子
      • computed计算属性函数
      • watch监听函数
      • 父子通信
      • 模板引用
      • 组合选项

vue3项目搭建

简单看下Vue3的优势吧
vue3优势
下载安装npm及node.js16.0以上版本(确保安装成功可用如下代码检查版本)

npm -v
node -v

确保版本安装正确
下一步创建vue3项目,输入项目名字后并进行选择插件(可以直接回车全部no)

npm init vue@latest

然后找到项目用vsCode打开,并进行初始化

npm install

初始化完成后,把项目跑起来,可点击链接进行查看,看到如下画面就完成咯

npm run dev

在这里插入图片描述

组合式API

响应式API

语法糖

reactive()

接收一个普通对象然后返回该普通对象的响应式代理(众所周知括号里的内容一般才是最重要的,没错,reactive只能封装对象类型的参数
🍊个🌰:

<script setup>
//1、导入函数
import { reactive } from 'vue';
//2、执行函数,传入一个对象类型参数,用变量接收
const state = reactive({count: 0 //参数是常规对象,不会引起视图更新
})
//使用reactive函数包装后,会变成响应式对象
const addCount = () => {state.count++
}const state2 = {count2: 0 //参数是常规对象,不会引起视图更新
}
const addCount2 = () => {state2.count2++
}
</script>
<template><div><button @click="addCount" id="btn1">{{ state.count }}</button> <!--这个按钮中的参数被reactive包裹,会被视图响应--><button @click="addCount2" id="btn2">{{state2.count2}}</button><!--这个参数没有被包裹不会响应--><!--但是会累积点击,在下一次点击第一个按钮时会被响应,一次性累计添加--></div>
</template>  

ref()

接受一个参数值并返回一个响应式且可改变的 ref 对象。(找不同咯,对没错,ref()支持任何类型的参数对其进行封装)

<script setup>
//1、导入函数
import { ref } from 'vue';
//2、执行函数,传入一个参数(简单类型与对象类型均可),用变量接收
const count = ref(0)
const addCount = () => {//脚本区域修改ref产生的响应式对象,必须通过.value属性修改count.value++
}const person = ref({name: '芋头'
})
const setPerson = () => {person.value.name = '一哑7'
}
</script>
<template><div><button @click="addCount">{{ count }}</button><!--点击button数字添加--></div><div><button @click="setPerson">{{ "这个人是" + person.name }}</button><!--点击button修改人名--></div>
</template>  

冷知识:ref函数内部实现时依赖reactive函数,一般使用ref更多

生命周期钩子

先来看一张图熟悉一下api
在这里插入图片描述

详细的生命周期API使用请参考Vue3官网API介绍

生命周期函数:引入函数后执行并传入回调,会自动执行回调 多次执行生命周期函数时,回调会依次执行

<script setup>
//引入函数
import { onMounted } from 'vue'//执行函数并传入回调
onMounted( () => {console.log('执行回调~')console.log('执行回调~')
}) //多次执行函数时依次执行
onMounted( () => {console.log('执行回调2~')console.log('执行回调2~')
})</script>

computed计算属性函数

<script setup>
//1、导入函数
import { ref , computed } from 'vue';
let list = ref([1 , 2 , 3 , 4 , 5 , 6 , 7 , 8])
//2、执行函数;return经过计算的值;用变量接受这个值
const computedList = computed(() => {return list.value.filter(item => item > 2)
})
//计时器观察实时更新
setTimeout(() => {list.value.push(-1 , 10 , 12 , 0)
} , 3000)
</script>
<template><div>{{`原始数组是:[${list}]`}}</div><div>{{`新数组是:[${computedList}]`}}</div>
</template>  

watch监听函数

  • 监听单个数据:
    watch需要两个参数,第一个参数是需要监听的数据,第二个参数是在所需要监听的数据发生变化时所需要执行的回调函数。
<script setup>
//1、导入函数
import { ref , watch } from 'vue';
//2、设置需要监听的数据和回调函数
const count = ref(0)
const setCount = () => {count.value++
}
//3、watch监听单个数据
watch(count , () => {alert('哦豁,变了哦')
})
</script>
<template><div><button @click="setCount">{{count}}</button></div>
</template>  
  • 监听多个数据:
    这时只需要用数组把需要监听的数据封装起来就好了
<script setup>
//1、导入函数
import { ref , watch } from 'vue';
//2、设置需要监听的数据和回调函数
const count = ref(0)
const setCount = () => {count.value++
}const name = ref('芋头')
const setName = () => {name.value = '一哑7'
}
//3、watch监听多个数据,用数组把需要监听的数据封装起来就好了
watch([count , name] , ([newCount , newName] , [odlCount , oldName]) => {alert('哦豁,变了哦' +  [odlCount , oldName] + '变成了' + [newCount , newName] )
})
</script>
<template><div><button @click="setCount">{{count}}</button><button @click="setName">{{name}}</button></div>
</template>  

不要忘了关于watch还有两个参数哦,immediate:立即执行;deep:深度监听

  • immediate : 在第一次刚刚监听到的时候就先执行一次
<script setup>
watch(count , () => {alert('变了哦') } , {immediate: true}
)
</script>
  • deep :通过watch监听的ref对象默认浅层监听,直接修改嵌套对象都不会出发回调函数,此时便需要开启deep
    没理解?把下面代码复制下来删掉deep对比一下就知道咯
<script setup>
watch(name , () => {alert('变了哦') } , {deep: true}
)
</script>
  • 精确监听:监听多个属性中的一个属性(deep会有性能损耗建议不开启deep而是使用精确监听)
    只需要把watch函数的参数变成两个回调函数,第一个是需要监听的东西,第二个是监听到之后需要执行的回调函数

🍊个🌰:

<script setup>
import { ref, watch } from 'vue'
const state = ref({name: '芋头',age: 22,sex: '男'})
const chanheName = () => {//修改姓名state.value.name = '一哑7' 
}
const changeAge = () => {//修改年龄~state.value.age = 23
}
const changeSex = () => {//去一趟泰国state.value.sex = '女'
}
//精确侦听具体属性
watch(() => state.value.age,() => {console.log('长大一岁了哦')}
)
watch(() => state.value.name,() => {console.log('还顺路改了个名字')}
)
</script>
<template><div><div>这个人现在的名字:{{state.name}}</div><div>这个人现在的年龄:{{state.age}}</div></div><div><button @click="chanheName">修改姓名</button><button @click="changeAge">修改年领</button></div>
</template>

父子通信

父传子:在子组件中用defineProps接收父组件中绑定的数据就好了

//父亲页
<template><div>I am dadTest</div><div><sonTest /></div><div>父传子<!-- 父亲上绑定属性 --><sonTest message="father Data" /></div>
</template>
<script setup>
import sonTest from './views/sonTest.vue';
</script>
//儿子页
<template><div>I am sonTest {{message}}</div>
</template>
<script setup>//用defineProps接收数据就好了defineProps({message: String})
</script>

子传父:父组件通过@绑定事件,子组件内部通过defindEmits函数生成emit方法触发事件
defindEmits 传递参数是数组哦~,因为可传递所有绑定事件

//儿子页
<template><div><button @click="sendMsg">点击按钮查看来自子组件的信息</button></div>
</template>
<script setup>//利用defindEmits函数生成emit方法const emit = defineEmits(['giveMeMessqge'])const sendMsg = () => {//出发绑定事件emit('giveMeMessqge' , '儿子消息')}
</script>
//父亲页
<template><div><sonTest @giveMeMessqge="getMessage"/></div>
</template>
<script setup>
import sonTest from './views/sonTest.vue';
const getMessage = (msg) => {alert(msg)
}
</script>

模板引用

默认情况下<script setup>语法糖下组件内部的属性与方法不对父组件开放,可以通过defineExpose编译宏指定哪些属性和方法允许访问

//子组件
<template><div>Test 组件</div>
</template>
<script setup>import { ref } from 'vue';const name = ref('nameTest')const setName = () => {name.value = 'newNameTest'}// defineExpose({//     name,//     setName// })
</script>
//父组件
<template><div><!-- 用ref标识绑定ref对象 --><h1 ref="h1Ref">dom标签h1</h1><sonTest ref="sonRef"/></div>
</template>
<script setup>
import sonTest from './views/sonTest.vue';
import { ref , onMounted } from 'vue'//调用ref函数生成ref对象当然组件也是可以的
const h1Ref = ref(null)
const sonRef = ref(null)//不过要注意在获取对象时要等组件挂在完毕哦,可以使用
onMounted(() => {alert(h1Ref.value)alert(sonRef.value)
})
</script>

组合选项

顶层组件向任意底层组件传递参数和方法,实现跨层组件通信顶层组件通过provide函数提供数据,底层组件通过inject函数获取数据

效果

跨层组件通信

跨层传递普通数据:

普通数据

跨层传递响应式数据:

响应式数据

跨层传递方法:顶层组件可以向底层组件传递方法,底层组件调用方法修改顶层组件中的数据

跨层传递方法
解决方案

相关文章:

Vue入门项目——WebApi

Vue入门——WebApi vue3项目搭建组合式API响应式APIreactive()ref() 生命周期钩子computed计算属性函数watch监听函数父子通信模板引用组合选项 vue3项目搭建 简单看下Vue3的优势吧 下载安装npm及node.js16.0以上版本&#xff08;确保安装成功可用如下代码检查版本&#xff0…...

【电源专题】电量计参数RSOC/RM/FCC定义

在文章【电源芯片】电量计(Gauge)介绍中我们讲到电量计的功能就是监测电池、计量电量。 那么电量计其实也是有很多算法的,比如【电源专题】电量计估计电池荷电状态方法(开路电压法及库仑计法)的差别文章所说的开路电压法和库仑计法。当然还有如阻抗跟踪法、CEDV算法等。 …...

实际开发中,React应用常见问题【持续更新中】

实际开发中&#xff0c;React应用常见问题【持续更新中】 实际开发中&#xff0c;React应用常见问题【持续更新中】 一、路由相关 “react-router-dom”: “^6.14.2”, “react”: “^18.2.0”, 1、监听路由 import { useLocation } from react-router-domexport default func…...

HTML5前端开发工程师的岗位职责说明(合集)

HTML5前端开发工程师的岗位职责说明1 职责 1、根据产品设计文档和视觉文件&#xff0c;利用HTML5相关技术开发移动平台的web前端页面; 2、基于HTML5.0标准进行页面制作&#xff0c;编写可复用的用户界面组件; 3、持续的优化前端体验和页面响应速度&#xff0c;并保证兼容性和…...

Go编写服务监管程序

前言 程序的目的&#xff1a;一个基于Linux系统下的进程监控与管理工具&#xff0c;它能够监控指定的进程或服务的运行情况&#xff0c;并在发现它们不存在或出现异常时自动进行重启操作。这个程序就像一个可靠的看门狗&#xff0c;时刻守护着系统的稳定运行。 程序的本身是周期…...

API商品详情:详尽呈现产品信息的利器

API商品详情&#xff1a;详尽呈现产品信息的利器 随着电子商务的迅速发展&#xff0c;越来越多的企业和开发者开始关注和利用API来实现灵活、高效的商品展示和推广。而在这一领域中&#xff0c;API商品详情成为了无可替代的利器&#xff0c;为用户提供了极为详尽的产品信息。 …...

Cisco 路由器配置管理

大多数网络中断的最常见原因是错误的配置更改。对网络设备配置的每一次更改都伴随着造成网络中断、安全问题甚至性能下降的风险。计划外更改使网络容易受到意外中断的影响。 Network Configuration Manager 网络更改和配置管理 &#xff08;NCCM&#xff09;解决方案&#xff…...

java面试真题附参考答案【下册】

tips&#xff1a;下面简述题为java面试真题&#xff0c;阅读本文且感兴趣的&#xff0c;还有将要面试的小伙伴有条件的准备一下笔和纸&#xff0c;将之转述出来成为自己的知识&#xff0c;希望接下来的面试好运连连 上一册&#xff1a;java面试真题【上册】_CsDn.FF的博客-CSD…...

2023牛客多校第三场 B.Auspiciousness

传送门 前题提要:没得说,赛时根本没想到dp,赛后翻各大题解看了很久,终于懂了dp的做法,故准备写一篇题解. 首先,先定义一下我们的 d p dp dp方程,考虑将处于 [ 1 , n ] [1,n] [1,n]的数当做小数,将处于 [ n 1 , 2 ∗ n ] [n1,2*n] [n1,2∗n]的数当做大数.那么对于我们的摸牌结…...

Numpy—数组的分隔与转置

⛳数组的切分 split 分隔 numpy.split 函数沿特定 的轴将数组分割为子数组&#xff0c;格式如下&#xff1a; numpy.split(ary, indices_or_sections, axis)参数说明&#xff1a; arry&#xff1a;被分割的数组。indices_or_sections&#xff1a;如果是一个整数&#xff0c;就…...

PyTorch中级教程:深入理解自动求导和优化

在你已经掌握了如何使用PyTorch构建神经网络的基础上&#xff0c;接下来我们将深入探讨PyTorch的两个核心特性&#xff1a;自动求导&#xff08;Autograd&#xff09;和优化&#xff08;Optimization&#xff09;。这两个特性在深度学习模型的训练过程中起着至关重要的作用。 …...

ES6基础知识六:你是怎么理解ES6中 Promise的?使用场景?

一、介绍 Promise&#xff0c;译为承诺&#xff0c;是异步编程的一种解决方案&#xff0c;比传统的解决方案&#xff08;回调函数&#xff09;更加合理和更加强大 在以往我们如果处理多层异步操作&#xff0c;我们往往会像下面那样编写我们的代码 doSomething(function(resu…...

数据库CAST()函数,格式(CAST AS decimal)

语法&#xff1a; CAST (expression AS data_type) 参数说明&#xff1a; expression&#xff1a;任何有效的SQServer表达式。 AS&#xff1a;用于分隔两个参数&#xff0c;在AS之前的是要处理的数据&#xff0c;在AS之后是要转换的数据类型。 data_type&#xff1a;目标系统…...

LRU 缓存结构

文章目录 LRU实现 LRU 优先去除最久没有访问到的数据。 实现 通过组合哈希表&#xff08;Hash Table&#xff09;和双向链表&#xff08;Doubly Linked List&#xff09;实现 LRU 缓存。并且以 O(1) 的时间复杂度执行 get 和 put 操作核心是对节点的新增、访问都会让节点移动…...

DAY1,Qt [ 手动实现登录框(信息调试类,按钮类,行编辑器类,标签类的使用)]

1.手动实现登录框&#xff1b; ---mychat.h---头文件 #ifndef MYCHAT_H #define MYCHAT_H#include <QWidget> #include <QDebug> //打印信息 #include <QIcon> //图标 #include <QPushButton> //按钮 #include <QLineEdit> //行编辑器类 #in…...

25.8 matlab里面的10中优化方法介绍—— 拉各朗日乘子法求最优化解(matlab程序)

1.简述 拉格朗日乘子法&#xff1a; 拉格朗日乘子法&#xff08;Lagrange multipliers&#xff09;是一种寻找多元函数在一组约束下的极值的方法。通过引入拉格朗日乘子&#xff0c;可将有 变量与 约束条件的最优化问题转化为具有变量的无约束优化问题求解 举个例子&#xff…...

2023年自然语言处理与信息检索国际会议(ECNLPIR 2023) | EI Compendex, Scopus双检索

会议简介 Brief Introduction 2023年自然语言处理与信息检索国际会议(ECNLPIR 2023) 会议时间&#xff1a;2023年9月22日-24日 召开地点&#xff1a;中国杭州 大会官网&#xff1a;ECNLPIR 2023-2023 Eurasian Conference on Natural Language Processing and Information Retr…...

Python - 嵌入式数据库Sqlite3的基本使用

SQLite是一种轻量级的嵌入式关系型数据库管理系统&#xff0c;而Python标准库中提供了与SQLite交互的模块&#xff0c;sqlite3。下面是一个Python 3中使用sqlite3模块的详细示例与解析。 import sqlite3 # 创建或连接数据库 conn sqlite3.connect(example.db) # 创建一个…...

VB制作网页自动填表

VB制作简单模拟器教程入门版 第一讲 如何用VB编程打开一个网页&#xff1a; 由于是为做模拟器做铺垫&#xff0c;所以就不介绍别的方法&#xff0c;只介绍一种最简单的用webbrowser控件实现&#xff08;实际是其他的方法我还没有学会&#xff09;。 下面我们就开始步入模…...

Kotlin 和 Java对比,具体代码分析

目录 一、语法比较二、案列分析 Kotlin 和 Java 都是广泛使用的编程语言&#xff0c;它们有一些共同点&#xff0c;例如都追求面向对象编程&#xff0c;但也有许多不同之处。下面是 Kotlin 和 Java 之间的一些比较&#xff1a; 一、语法比较 声明变量&#xff1a;Kotlin 使用 …...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...