Vue3基础(API风格、监听、生命周期、toRefs、组件通信、插槽、axios,Promise)

news2024/11/25 1:27:54

Vue3基础(API风格、监听、生命周期、toRefs、组件通信、插槽、axios,Promise)

目录

  • Vue3基础(API风格、监听、生命周期、toRefs、组件通信、插槽、axios,Promise)
    • API 风格
      • 选项式API
      • 组合式API
      • 混合式
    • 事件监听
      • watchEffect
    • 生命周期
      • 选项式API
      • 组合式API
    • toRefs
    • 父传子defineProps
    • 子传父defineEmits
    • 插槽
      • 具名插槽
    • axios
      • async和await
      • axios其它配置项
    • Promise

API 风格

选项式API组合式API都适用于不同场景,生产项目中,低复杂度场景用选项式API,单页应用用组合式API+单文件组件。

选项式API

该方法也是Vue2中所使用的,其特点是例如 datamethodsmounted等对象所定义的属性都会暴露在函数内部的 this 上,它会指向当前的组件实例

<script>
export default {
  data(){
    return {
      count:100
    }
  },
  methods:{
    handleAdd(){
      this.count++
    }
  }
}
</script>

<template>
  <div class="card">
    <button type="button" @click="handleAdd">count is {{ count }}</button>
  </div>
</template>

组合式API

单文件组件中组合式API通常和

<script setup>
import { ref } from 'vue'
const count = ref(0)
const name = reactive({'name': '张三'})

function handleChange(){
  count.value++
  name.name = '李四'
}
</script>
<template>
  <div class="card">
    <button type="button" @click="handleChange">count is {{ count }},name is {{name.name}}</button>
  </div>
</template>

混合式

<script>
import {reactive, ref} from 'vue'

export default {
  setup() {
    const count = ref(0)
    const name = reactive({'name': '张三'})
    return {
      count,
      name
    }

  },
  methods: {
    handleAdd() {
      this.count++
      this.name.name = '李四'
    }
  }
}

</script>

<template>
  <div class="card">
    <button type="button" @click="handleAdd">count is {{ count }},name is {{ name.name }}</button>
  </div>
</template>

事件监听

watch 函数用于监视一个数据,并在数据变化时执行特定的逻辑

<script setup>
import {reactive, ref, watch} from 'vue'

const count = ref(0)
const name = reactive({'name': '张三'})

function handleAdd() {
  count.value++
  name.name = '李四'
}

watch(count, (newValue, oldValue) => {
  console.log('count数据发生了变化,老数据是:' + oldValue + '新数据是:' + newValue)
})
watch(()=>name.name, (newValue, oldValue) => {
  console.log('count数据发生了变化,老数据是:' + oldValue + '新数据是:' + newValue)
})
</script>

<template>
  <div class="card">
    <button type="button" @click="handleAdd">count is {{ count }},name is {{name.name}}</button>
    <p>
      Edit
      <code>components/HelloWorld.vue</code> to test HMR
    </p>
  </div>
</template>

watchEffect

watchEffect函数不用指定监听谁,只要watchEffect内部用了某个变量,某个变量发送变化,就会触发

import { watchEffect } from 'vue'

watchEffect(()=>{
    const x1 = sum.value
    const x2 - person.name
	console.log('某个数据被改变')
})

生命周期

选项式API

  1. beforeCreate:组件实例被创建,但是数据和事件方法均未初始化时被调用
  2. created:数据观测 (data observer) 和事件配置完成,但尚未挂载到DOM时被调用
  3. beforeMount:模板编译完成,但尚未将模板挂载到DOM时被调用
  4. mounted:组件挂载到DOM之后时被调用
  5. beforeUpdate:数据更新但尚未重新渲染视图时被调用
  6. updated:数据更改导致重新渲染和打补丁完成时被调用
  7. beforeUnmount:组件卸载之前时被调用
  8. unmounted:组件卸载之后时被调用

组合式API

官方文档:组合式API生命周期钩子

组件生命周期图示

  1. onMounted():在组件挂载完成后执行
  2. onUpdated():在组件响应状态变更后执行
  3. onUnmounted():当组件实例被卸载后调用
  4. onBeforeMount():组件被挂载之前调用
  5. onBeforeUpdate():组件更新前调用
  6. onBeforeUnmount():组件实例被卸载前调用
  7. onErrorCaptured():捕获了后代组件传递错误时调用
  8. onRenderTracked():组件渲染过程中追踪到响应式依赖时被调用
  9. onRenderTriggered():响应式依赖的变更触发了组件渲染时调用
  10. onActivated():若组件实例是 缓存树的一部分,当组件被插入到 DOM 中时调用
  11. onDeactivated():若组件实例是 缓存树的一部分,当组件从DOM 中移除时调用
  12. onServerPrefetch():组件实例在服务器上被渲染之前调用

示例:

<script setup>
import { onMounted } from 'vue'

onMounted(() => {
  console.log(`the component is now mounted.`)
})
</script>

toRefs

toRefs的作用将一个包含响应式对象属性的普通对象转换为包含 ref 对象的普通对象,通俗一点就是将reactive包裹的对象全部转换成ref对象

其意义在于当组件引用这些属性时能够保持其响应性

<script>
import {reactive, ref, toRefs} from 'vue'

export default {
  setup() {
    const data = reactive({
      count : 0,
      name : {'name': '张三'}
    })
    const handleChange = ()=>{
      data.count++
      data.name.name = '李四'
      console.log(toRefs(data).count.value)
      console.log(toRefs(data).name.value.name)
    }
    return {
      ...toRefs(data),handleChange
    }

  },
}


</script>

<template>
  <div class="card">
    <button type="button" @click="handleChange">count is {{ count }},name is {{ name.name }}</button>
  </div>
</template>
  • ...toRefs(data)toRefs(data)是将data中的数据全部转成ref包裹的对象,使其带有响应性,name : {'name': '张三'}本身就是对象且带有响应性因此不会对其造成影响,...是展开运算符,它的作用是将toRefs(data)展开
// 用...展开
return {
      ...toRefs(data),handleChange
    }

// 没用...的写法
const count = toRefs(data).count
const name = toRefs(data).name
return {
  count, name, handleChange
}

父传子defineProps

父组件:

<script setup>
// 导入子组件
import HelloWorld from './components/HelloWorld.vue'
const info = '你好'
</script>

<template>
  <HelloWorld :msg="info" />
</template>

子组件:

<script setup>
import {reactive, ref, toRefs, defineProps} from 'vue'

// defineProps定义传给子组件的属性
defineProps(['msg'])

const count = ref(0)
const name = reactive({'name': '张三'})
const handleChange = () => {
  count.value++
  name.name = '李四'
}


</script>

<template>
  <div class="card">
      // 调用父组件的属性
    <p>{{ msg }}</p>
    <button type="button" @click="handleChange">count is {{ count }},name is {{ name.name }}</button>
  </div>
</template>

子传父defineEmits

子组件:

<script setup>
import {reactive, ref, defineEmits} from 'vue'

const name = reactive({'name': '张三'})
// 创建defineEmits实例并将自定义事件名取为myevent
let $emit = defineEmits(['myevent'])
function handleSend() {
  // myevent:事件名,name.name:任意参数
  $emit('myevent', name.name)
}
</script>

<template>
  <div class="card">
    <button type="button" @click="handleSend">点我给父组件发数据</button>
  </div>
</template>

父组件:

<script setup>
import son from './components/son.vue'
import {ref} from "vue";

const receivedName = ref('')
const handleGetson = (name) => {
  // 这个name就是子组件传过来的数据
  // 将原name替换为子组价的name
  receivedName.value = name
}
</script>

<template>
  <div>
    <p>{{receivedName}}</p>
	// son标签必须是子组件,意为收到数据后触发handleGetson方法
    <son @myevent="handleGetson"/>
  </div>
</template>

插槽

主组件

<script setup>
import FancyButton from './components/FancyButton.vue'
</script>

<template>
  <div>
    // 在FancyButton内定义插槽内容
    <FancyButton>
      按钮
    </FancyButton>
  </div>
</template>

FancyButton组件

<script setup>
function sayHello() {
  console.log('你好')
}
</script>

<template>
  <div class="card">
    <button @click="sayHello">
      // 插槽出口
      <slot></slot>
    </button>
    <p>上面是插槽</p>
  </div>
</template>

实际效果就相当于:

<button @click="sayHello">
	按钮
</button>

具名插槽

  • v-slot:buttonName指定要使用的插槽
  • slot name="buttonName"为插槽命名
<button @click="sayHello">
  <slot name="buttonName"></slot>
</button>
<FancyButton v-slot:buttonName>
	按钮
</FancyButton>

axios

基础示例:使用前先安装npm install axios

<script setup>
import axios from "axios"

function sendAxios() {
  axios.get('https://jsonplaceholder.typicode.com/todos/1').then(res => {
    console.log('请求成功' + res.data)
  }).catch(error => {
    // 处理请求失败的情况
    console.error('请求失败:', error);
  })
}
</script>

<template>
  <div class="card">
    <button @click="sendAxios">
      发送请求
    </button>
  </div>
</template>

post请求:

axios.post('https://jsonplaceholder.typicode.com/posts', {
  body: 'bar',	// 请求体
  userId: 1
})
.then(response => {
  console.log('成功发送 POST 请求:', response.data);
})
.catch(error => {
  console.error('发送 POST 请求失败:', error);
});

async和await

<script setup>
import axios from "axios"

const sendAxios = async () => {
  try {
    const response = await axios.get('https://jsonplaceholder.typicode.com/todos/1');
    console.log(response)
  } catch (error) {
    console.error('请求失败:', error);
  }
}
</script>

<template>
  <div class="card">
    <button @click="sendAxios">
      发送请求
    </button>
  </div>
</template>

axios其它配置项

常用参数:

axios({
    url:'地址'method:'post',
    headers: {'token': 'adsfa.adsfa.adsf',contentType:'application/json'},
    params: {name: lqz,age:19},
    data: {firstName: 'Fred'},
    timeout: 1000, 
})

更多参数

Promise

  • resolve:Promise状态成功时会将成功结果传递给then方法中的成功处理函数
  • reject:Promise状态失败时会将失败结果传递给catch方法
<script setup>

function handlePromise() {
  const myPromise = new Promise((resolve, reject) => {
    const randomNum = Math.random()
    if (randomNum > 0.5) {
      // 将randomnum传给.then方法
      resolve(randomNum)
    } else {
      // 将error信息传给.catch方法
      reject(new Error('数据小于0.5'))
    }
  })

  myPromise.then((res) => {
    console.log('操作成功:' + res)
  }).catch((error) => {
    console.log('操作失败:' + error.message)
  })
}

</script>

<template>
  <div class="card">
    <button @click="handlePromise">
      调用Promise
    </button>
  </div>
</template>
olve, reject) => {
    const randomNum = Math.random()
    if (randomNum > 0.5) {
      // 将randomnum传给.then方法
      resolve(randomNum)
    } else {
      // 将error信息传给.catch方法
      reject(new Error('数据小于0.5'))
    }
  })

  myPromise.then((res) => {
    console.log('操作成功:' + res)
  }).catch((error) => {
    console.log('操作失败:' + error.message)
  })
}

</script>

<template>
  <div class="card">
    <button @click="handlePromise">
      调用Promise
    </button>
  </div>
</template>

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

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

相关文章

第二证券|1.73万亿“聪明钱”A股扫货买了什么?

跟着A股上市公司一季报披露收官&#xff0c;备受商场重视的险资、社保基金和QFII等各大组织持仓数据浮出水面。 Wind计算数据显现&#xff0c;719家A股上市公司的十大流通股股东有QFII身影&#xff0c;险资和社保基金分别现身754只和659只个股的前十大流通股股东&#xff0c;Q…

ECC 号码总结

1、问题背景 在手机开发过程中&#xff0c;经常遇见各种紧急号码问题&#xff0c;在此特意总结下紧急号码相关知识。 2、紧急号码来源 在MTK RILD EccNumberSource.h中&#xff0c;定义了如下几种紧急号码来源。 按优先级排序介绍如下 2.1、SOURCE_NETWORK 网络下发&#xff…

MinimogWP WordPress 主题下载——优雅至上,功能无限

无论你是个人博客写手、创意工作者还是企业站点的管理员&#xff0c;MinimogWP 都将成为你在 WordPress 平台上的理想之选。以其优雅、灵活和功能丰富而闻名&#xff0c;MinimogWP 不仅提供了令人惊叹的外观&#xff0c;还为你的网站带来了无限的创作和定制可能性。 无与伦比的…

CentOS 7 :虚拟机网络环境配置+ 安装gcc(新手进)

虚拟机安装完centos的系统却发现无法正常联网&#xff0c;咋破&#xff01; 几个简单的步骤&#xff1a; 一、检查和设置虚拟机网络适配器 这里笔者使用的桥接模式&#xff0c;朋友们可以有不同的选项设置 二、查看宿主机的网络 以笔者的为例&#xff0c;宿主机采用wlan上网模…

Could not resolve placeholder ‘xx.xxx.host’ in value “xxx“问题解决

Could not resolve placeholder ‘xx.xxx.host’ in value "xxx"问题解决 众多原因其中之一 springboot 项目&#xff0c;idea 配置apollo 时&#xff0c;运行指定了配置文件 uat 所以使用本地配置文件启动 时&#xff0c;一直去找uat 配置文件&#xff0c;结果自…

CSS引用

CSS定义 层叠样式表&#xff1a;&#xff08;Cascading Style Sheets,缩写为css&#xff09;,是一种样式表语言&#xff0c;用来描述HTML文档的呈现&#xff08;美化内容&#xff09; 书写位置&#xff1a;title标签下方添加style双标签&#xff0c;style标签里写入CSS代码 在s…

LVS 集群

一、集群和分布式 系统性能扩展方式&#xff1a; Scale UP&#xff1a;垂直扩展&#xff0c;向上扩展,增强&#xff0c;性能更强的计算机运行同样的服务 Scale Out&#xff1a;水平扩展&#xff0c;向外扩展,增加设备&#xff0c;并行地运行多个服务调度分配问题&#xff0c;…

OpenSPG docker 安装教程

文章目录 前言自述 一、OpenSPG1.介绍 二、安装步骤1.安装服务端2.客户端部署 前言 自述 我最近是想结合chatglm3-6b和知识图谱做一个垂直领域的技术规范的问答系统&#xff0c;过程中也遇到了很多困难&#xff0c;在模型微调上&#xff0c;在数据集收集整理上&#xff0c;在知…

RJ45网口温湿度传感器MQTT/http协议配云平台

产品概述 RJ45网口版主机 SC-GP-THLAN温湿度传感终端是上海数采物联网科技有限公司推出的一款基于网口有线传输&#xff0c;直流宽电压供电的通用型温湿度传感器&#xff0c;可采集环境中的温度、湿度数据。 网口温湿度终端广泛应用于工业、农业等温湿度测量场景。 服务理念…

阿里easyExcel -- excel单元格自定义下拉选择(升级版)

背景 很久很久以前写了一篇类似的文章 阿里easyExcel – excel下载/导出/读取 (单元格自定义下拉选择、不支持图片) &#xff0c;用了没多久就发现不好用&#xff0c;限制太多&#xff08;以后遇到你就知道了&#xff09;&#xff0c;然后就有了现在迟到很久的文章&#xff0c…

从U盘到云端:企业数据泄露的那些事

在企业的日常运营中&#xff0c;数据安全无疑是极为关键的一环。无论是U盘还是云&#xff0c;数据泄露事件的发生都可能导致企业的核心机密被窃取&#xff0c;甚至损害企业的商业利益和声誉。以下是关于从U盘到云端&#xff0c;企业数据泄露的一些常见情况和应对策略。 U盘&…

数据结构-线性表-应用题-2.2-12

1&#xff09;算法的基本设计思想&#xff1a;依次扫描数组的每一个元素&#xff0c;将第一个遇到的整数num保存到c中&#xff0c;count记为1&#xff0c;若遇到的下一个整数还是等于num,count,否则count--,当计数减到0时&#xff0c;将遇到的下一个整数保存到c中&#xff0c;计…

Android 终端查看CPU信息源码分析

代码如下&#xff1a; 终端获取信息&#xff08;左为H9&#xff0c;右为H5&#xff09; 觉得本文对您有用&#xff0c;麻烦点赞、关注、收藏&#xff0c;您的肯定是我创作的无限动力&#xff0c;谢谢&#xff01;&#xff01;&#xff01;

DOTA-Gly-Asp-Tyr-Met-Gly-Trp-Met-Asp-Phe-NH2,1306310-00-8,是一种重要的多肽化合物

一、试剂信息 名称&#xff1a;DOTA-Gly-Asp-Tyr-Met-Gly-Trp-Met-Asp-Phe-NH2CAS号&#xff1a;1306310-00-8结构式&#xff1a; 二、试剂内容 DOTA-Gly-Asp-Tyr-Met-Gly-Trp-Met-Asp-Phe-NH2是一种重要的多肽化合物&#xff0c;其CAS号为1306310-00-8。该多肽包含一个DO…

微火全域外卖系统是什么?为什么市场占有率这么高?

近日&#xff0c;全域外卖领域又出现了新变动&#xff0c;一个名为微火的品牌凭借着其全域外卖系统&#xff0c;在短短几个月的时间里&#xff0c;就占领了大部分市场。截止发稿日期前&#xff0c;微火全域外卖系统的市场占有率已经超过48%。 据了解&#xff0c;所谓的全域外卖…

怿星 × NI丨联合成功打造行业领先的L4自动驾驶数据回灌系统

怿星NI 联合成功打造行业领先的L4自动驾驶数据回灌系统&#xff08;终版&#xff09; 怿星与于NI&#xff08;恩艾&#xff09;公司联合打造的L4自动驾驶数据回灌系统&#xff0c;在支持多种数据同步回灌、实时模拟故障、高带宽数据传输的同时&#xff0c;具有视频链路扩展性高…

IST——In-System-Test

1、背景 安全性是自动驾驶平台的关键特性之一&#xff0c;而这些架构中使用的半导体芯片必须保证ISO 26262标准所要求的功能安全方面。为了监控由于现场缺陷导致的故障&#xff0c;在启动和/或关闭期间会自动运行系统内结构测试。当系统内测试&#xff08;IST&#xff0c;In-Sy…

跨界探索:在苹果系统M系列处理器上安装Windows 11系统的实践经历

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路。] 大家好&#xff0c;我是【WeiyiGeek/唯一极客】一个正在向全栈工程师(SecDevOps)前进的技术爱好者 作者微信&#xff1a;WeiyiGeeker 公众号/知识星球&#xff1a;全栈工程师修炼指南 主页博…

uni-app 从vue3项目创建到Pinia管理数据全局使用 持久化存储数据 详细教程

1、使用 HBuilderX 创建一个 vue3的新项目 点击左上角的文件 --> 选择新建 --> 项目 3、查看当前项目的版本 4、把项目可以先跑起来----我这里是运行在谷歌浏览器 也可以运行在微信小程序开发者工具上 5、看运行结果 2、在项目中配置Pinia --> Pinia 官网---&…

3. 分布式链路追踪的链路日志设计

前言 分布式链路追踪的客户端实现中&#xff0c;我们会通过各种手段和规则得到一个又一个的Span&#xff0c;得到这些Span后&#xff0c;需要在分布式链路追踪的服务端这边汇总这些Span并拼接出一条请求链路&#xff0c;那么这里就存在一个问题&#xff0c;客户端得到的Span如…