Vue入门项目——WebApi

news2024/10/2 21:16:26

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函数获取数据

效果

跨层组件通信

跨层传递普通数据:

普通数据

跨层传递响应式数据:

响应式数据

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

跨层传递方法
解决方案

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

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

相关文章

YOLOX-PAI 论文学习

1. 解决了什么问题&#xff1f; 对 YOLOX 做加速&#xff0c;在单张 Tesla V100 上取得了 42.8 42.8 42.8mAP&#xff0c;推理速度为 1 毫秒。 2. 提出了什么方法&#xff1f; 2.1 主干网络 YOLOv6 和 PP-YOLOE 都将主干网络从 CSPNet 切换到了 RepVGG。RepVGG 在推理时&a…

PHP在线相册--【强撸项目】

强撸项目系列总目录在000集 PHP要怎么学–【思维导图知识范围】 文章目录 本系列校训本项目使用技术 上效果图phpStudy 设置导数据库项目目录如图&#xff1a;代码部分&#xff1a;主页 配套资源作业&#xff1a; 本系列校训 用免费公开视频&#xff0c;卷飞培训班哈人&…

【深度学习】【Image Inpainting】Free-Form Image Inpainting with Gated Convolution

模型&#xff1a;DeepFillv2 (CVPR’2019) 论文&#xff1a;https://arxiv.org/abs/1806.03589 代码&#xff1a;https://github.com/JiahuiYu/generative_inpainting 文章目录 效果AbstractIntroductionRelated WorkAutomatic Image InpaintingGuided Image Inpainting and Sy…

KaiwuDB 资深解决方案专家周幸骏:打造核心时序引擎,释放数据新价值

以下为浪潮 KaiwuDB 资深解决方案专家周幸骏受邀于7月4日在京举行的可信数据库发展大会发表演讲的实录摘要&#xff0c;欢迎大家点赞、收藏、关注&#xff01; 01 聚焦“时序” 据 IDC 等权威数据统计&#xff0c;预估 2025 年物联网设备产生的数据可达到 79.4ZB &#xff1b;…

ubuntu与windows之间的文件共享

最近在做项目&#xff0c;需要用到ubuntu进行代码编译生成可执行文件&#xff0c;但是我个人阅读和编写代码喜欢用source insight这个软件IDE。安利一下这个软件&#xff0c;阅读代码和编辑代码真的很棒啊&#xff0c;谁用谁知道吧&#xff01; 由于在ubuntu中安装source insig…

ShardingJDBC - 学习笔记

一、简介 官网&#xff1a;Apache ShardingSphere 下载地址&#xff1a;下载 :: ShardingSphere 快速入门&#xff1a;ShardingSphere-JDBC :: ShardingSphere 分库分表框架 ShardingSphere包括Sharding-JDBC、Sharding-Proxy、Sharding-Sidecar三个开源分布式数据库中间件解…

每月被攻击4000万次,全球最不安全的关键基础设施实锤了

在当今不确定的地缘政治环境中&#xff0c;无论是个人还是企业都高度关注潜在的网络攻击。而这其中最令人担忧的是对关键基础设施和工业资产的攻击。 关键基础设施中尤其是电力、交通、通信、金融等系统均在现代社会中发挥着至关重要的作用&#xff0c;因此关键基础设施一直是…

程序员如何向老板提加薪?

今天的问题不仅适用于程序员&#xff0c;对于其他职业同样适用。如果你认为自己所做的工作应该得到更多的报酬&#xff0c;并且想为此做点什么&#xff0c;你有两个选择&#xff1a;找一个新的高薪工作或要求加薪。 这两种选择都会带来新的焦虑&#xff0c;但它们都会带来新的…

【框架篇】Spring Boot 配置文件(详细教程)

Spring Boot 配置文件 一&#xff0c;配置文件的用途 配置文件在Spring Boot项目中的地位是比较重要&#xff0c;其功能可主要归纳为以下几个&#xff1a; 进行配置程序属性&#xff1a;配置文件允许设置应用程序的各种属性&#xff0c;如数据库连接、端口号、日志级别、缓存…

多态及其原理

文章目录 构成多态的条件虚函数作用&#xff1a;完成重写 重写重载 重写 隐藏为什么析构函数要搞成符合多态?原理预热对于基类指针或引用指向父类或者子类的成员函数是如何调用不同的函数呢&#xff1f; 一个类如果是基类&#xff0c;它的析构函数最好加上virtual 构成多态的条…

【【51单片机的LCD1602 最简单的一集】】

最简单的一集&#xff0c;明白运算显示就没问题 这一节相对简单 其实只要明白显示行列就可以了 剩下来的取什么基本上就是遍历 然后读取到\0停止 下面是基础的LCD1602的功能 #include <REGX52.H> sbit LCD_RSP2^6; sbit LCD_RWP2^5; sbit LCD_EP2^7; #define LCD_Data…

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

一、介绍 Generator 函数是 ES6 提供的一种异步编程解决方案&#xff0c;语法行为与传统函数完全不同 回顾下上文提到的解决异步的手段&#xff1a; 回调函数promise 那么&#xff0c;上文我们提到promsie已经是一种比较流行的解决异步方案&#xff0c;那么为什么还出现Gen…

归并排序法解释

什么是归并排序法 归并排序是一种常见的排序算法&#xff0c;它基于分治策略&#xff0c;将一个大问题分解为小问题来解决。归并排序的主要思想是将待排序的数组分成两个子数组&#xff0c;分别对这两个子数组进行排序&#xff0c;最后将两个有序的子数组合并成一个有序的数组…

Openlayers入门,Openlayers调整中心点坐标、Openlayers调整缩放级别、Openlayers调整地图可视角度和地图复位

专栏目录: OpenLayers入门教程汇总目录 前言 本章介绍一下Openlayers最基础的调整中心点坐标方式、调整缩放级别、调整地图可视角度和地图复位的小功能示例,非常简单,可直接上手。 二、依赖和使用 "ol": "^6.15.1"使用npm安装依赖npm install ol@6…

重学C++系列之继承

一、什么是继承 继承是面向对象三大特性之一&#xff0c;C中&#xff0c;被继承的类称为基类&#xff08;父类&#xff09;&#xff0c;继承别的类的类成为派生类&#xff08;子类&#xff09;&#xff0c;继承除了基类的构造函数和析构函数不继承外&#xff0c;其余成员全部继…

【安卓】视频播放器实现过程,超详细注释,自定义视频进度条,打开本地文件播放视频等功能。

一、实现效果 废话不多说&#xff0c;直接上代码&#xff0c;里面有详细注释&#xff0c;不清楚的评论区留言。 二、布局代码 <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res…

Android安卓实战项目(3)—一个炫酷的健身APP界面

Android安卓实战项目&#xff08;3&#xff09;—一个炫酷的健身APP界面 一.项目运行介绍 1.大致浏览 2.功能介绍 &#xff08;1&#xff09;功能一 上导航条 &#xff08;2&#xff09;功能二 下导航条 二.具体实现 MainActivity.java package com.rckdeveloper.fitene…

python 面向对象编程的特点 - 封装 - 继承(经典类、新式类) - 多态 - 静态方法、类方法 - 下划线的使用 - 回合制攻击游戏实验

目录 面向对象编程的特点&#xff1a; 封装&#xff1a;封装是将数据和操作&#xff08;方法&#xff09;封装在一个对象中的能力 继承&#xff1a;继承是指一个类&#xff08;子类&#xff09;可以继承另一个类&#xff08;父类&#xff09;的属性和方法。 我们为什么需要继…

Python采集法外狂徒张三所有视频【含jS逆向解密】

传说中&#xff0c;有人因为只是远远的看了一眼法外狂徒张三就进去了&#x1f602; 我现在是获取他视频&#xff0c;岂不是直接终生了&#x1f929; 网友&#xff1a;赶紧跑路吧 &#x1f60f; 好了话不多说&#xff0c;我们直接开始今天的内容吧&#xff01; 你需要准备 …

详解STM32的GPIO八种输入输出模式,GPIO各种输入输出的区别、初始化的步骤详解,看这文章就行了(超详细)

在STM32微控制器中&#xff0c;常见的输入输出(GPIO)模式有八种&#xff0c;分别是推挽输出、开漏输出、复用推挽输出、复用开漏输出、浮空输入、上拉输入、下拉输入和模拟输入。下面我将为你解释每种模式的特点和区别&#xff0c;并提供相应的示例代码。 文章目录 介绍区别初…