Vue3学习宝典

1.ref函数调用的方式生成响应式数据,可以传复杂和简单数据类型

<script setup>
// reactive接收一个对象类型的数据
import { reactive } from 'vue';

// ref用函数调用的方式生成响应式数据,可以传复杂和简单数据类型
import { ref } from 'vue'
// 简单数据类型
const count = ref(0)

// 复杂数据类型
const user = ref({
  name: '小夏',
  age: 18
})

const subCount = () => {
  count.value--
}

function addCount() {
  count.value++
}

</script>

<style></style>

<template>


  <!-- ref -->
  <div>
    {{ count }}
  </div><br>
  <button @click="subCount">-1</button>
  <button @click="addCount">+1</button>
  <div>{{ user.name + user.age }}</div><br>
</template>

2.computed计算属性(依赖的数据发生变化时实时更新)

<script setup>
import { ref } from 'vue'
const list = ref([1, 2, 3, 4, 5, 6])

//计算属性
import { computed } from 'vue';
const computedList = computed(() => {
  return list.value.filter(item => item > 2)
})

const addFn = () => {
  list.value.push(4)
}
console.log(list.value)
</script>

<style></style>

<template>
  <div>{{ computedList }}</div>
  <button @click="addFn">添加</button>
</template>



3.watch监视单个数据的变化(相当于操作日志)

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

const num = ref(1)
const name = ref('李四')

const changeNum = () => {
  num.value++
}
const changeName = () => {
  name.value = name.value + 1
}


const obj = ref({
  name:'老夏',
  age:18
})
const changeObjName = ()=>{
  obj.value.name = '小夏'
}

//监视单个数据的变化
// 1.watch默认浅层监视,不会监视对象里的属性的值的改变
watch(obj,(newValue,laoValue)=>{
  console.log('监视单个数据的变化')
  console.log(newValue,laoValue)
},{
  // 2.深层监视,可以监视对象里的属性的值的改变
  deep:true
}
)

//监视多个数据的变化
watch([num,name], (newArr, oldArr) => {
  console.log('监视多个数据的变化')
  console.log('新数据:' + newArr, '老数据:' + oldArr)
},
  // 3.immediate一进页面就立即刷新一次
  {
    immediate: true,
  }
)

//监视单个对象属性的变化
watch(()=>obj.value.name,(newValue,oldValue)=>{
  console.log('监视单个对象属性的变化')
  console.log(newValue,oldValue)
})
</script>

<style></style>

<template>
  <div>{{ num }}</div>
  <button @click="changeNum">+++</button>
  <div>{{ name }}</div>
  <button @click="changeName">改名字</button>
  <div>{{ obj.name }}</div>
  <button @click="changeObjName">改对象里面属性的值</button>
</template>




4.Props-Emits组件相互传数据

父组件

<script setup>
import son from '@/components/04-son.vue'
import { ref } from 'vue'

const money = ref(1000)
// ele就是子组件传来的属性值
const changeMoney = (attributeValue) => {
  console.log('子组件花了' +attributeValue)
}
</script>

<style></style>

<template>
  <div>
    <!-- car,money里面的属性值直接传给了子组件 -->
    <!-- layOut是子组件向父组件传的值 -->
    <son car="车车" :money="money" @layOut="changeMoney"></son>
  </div>
</template>



子组件

<script setup>
//子组件
// defineProps是固定的写法,定义接收数据的属性名,和属性值类型
const props = defineProps({
  car: String,
  money: Number
})


//defineEmits([自定义一个属性名])
const emit = defineEmits(['layOut'])

// 通过emit向父组件发送数据
const buy = () => {
  emit('layOut', 100)
}
console.log(props.car)
console.log(props.money)
</script>
<style scoped>
.son {
  width: 100px;
  height: 100px;
  border: 1px solid;
}
</style>
<template>
  <div class="son">
    子组件
  </div>
  <div>父组件给了{{ props.money }}</div>
  <button @click="buy">花钱</button>
</template>

5.defineExpose开放属性和方法

父组件

<script setup>
import { ref,onMounted } from 'vue'
import son05 from '@/components/05-son.vue'

const input = ref()

// 生命周期钩子 onMounted ,一进页面输入框就聚焦
onMounted(() =>{
  // input.value.focus()
})

//绑定事件聚焦
const onClick = ()=>{
  input.value.focus()
}

const getSonData = ref()
const putSonData = ()=>{
  const fatherName = getSonData.value.name
  console.log(getSonData.value.greeting())
  console.log(fatherName)
}


</script>

<style></style>

<template>
<input type="text" ref="input">
<button @click="onClick">聚焦</button>
<son05  ref="getSonData"></son05>
<button @click="putSonData">获取儿子组件中的数据</button>
</template>



子组件

<script setup>
const name = "儿子的数据"
const greeting = () => {
  console.log('hello儿子的数据')
  return '默认rturn未定义'
}

// setup语法糖下的组件内部的属性和方法不供外部组件访问
// 可以通过defineExpose编译宏指定哪些属性和方法允许访问
defineExpose({
  name,
  greeting
})


</script>
<template></template>

6.provide-inject提供和注入数据

父组件

<script setup>
import inject from '@/components/06-inject.vue'
import { provide,ref } from 'vue';

//1.提供普通数据给其他组件
provide('commonData',"这是我提供的普通数据哦")

//2.提供响应数据给其他组件
const responseData = ref({
  msg:'这是我提供的响应数据哦',
})
provide('responseData',responseData)

//3.提供给数据调用者修改数据的权力
provide('setResponseData',(newResponseData)=>{
  responseData.value.msg = newResponseData
})
</script>

<style></style>

<template>
<inject></inject>
</template>



子组件

<script setup>
import {inject,ref} from 'vue'
//注入数据
const getResponseData = inject('responseData')
const getCommonData = inject('commonData')

//注入修改数据的set方法
const setData = inject('setResponseData')
const changeData = ()=>{
  setData('这是调用者修改后的数据')
}
</script>
<template>
  <div> {{getResponseData.msg}}</div>
  <div>{{getCommonData}}</div>
  <button @click="changeData">点击按钮修改数据</button>
</template>

7.defineModel数据双向绑定 ,其他组件使用v-model就可以获取此属性数据

父组件

<script setup>
import sonDefineMOdel from '@/components/07-defineModel.vue'
import { ref } from 'vue';

// 其他组件传来的数据也可以修改
const getSonData = ref('')
</script>

<style></style>

<template>
<sonDefineMOdel v-model="getSonData"></sonDefineMOdel>
<div>
  {{ getSonData }}
</div>
</template>


子组件

<script setup>
import { defineModel } from 'vue';
 // 数据双向绑定 ,其他组件使用v-model就可以获取此属性数据
const modelValue = defineModel()


</script>
<template>
  <!-- @input事件用于实时监控输入框的变化,每次用户输入都会触发该事件。 -->
  <input type="text" :value="modelValue"
  @input="e => modelValue = e.target.value">
  <!-- 箭头函数 e => modelValue 的意思是:
    当事件触发时,将事件对象 e 作为参数传递给箭头函数,
    并将输入框的新值(即 e.target.value)赋给 modelValue。 -->
</template>

8.pinia管理自己创建的store.js仓库

自己创建的仓库

// store的作用类似于Java的父类,被子类继承数据和方法
import {
  defineStore
} from 'pinia'
import {
  ref,computed
} from 'vue'

// 声明一个store
export const useStore = defineStore('myStore', {
  state: () => {
    const name = ref('小夏')
    // 声明数据 state
    let age = ref(17)

    // 声明操作数据的方法 action(普通函数)
    const func = () => {
      console.log('我是方法')
    }
    const addAge = () => {
      age.value++
    }

    // 声明基于数据派生的计算属性
    const judge = computed(
      ()=>{
        if (age.value>=18){
          return "已成年"
        }else{
          return "未成年"
        }
      }
    )

    return {
      name,
      age,
      func,
      addAge,
      judge
    }
  }
})

在组件中引入自己创建的仓库

<script setup>
import Pinia08 from '@/components/08-pinia.vue'
// 引入自己创建的store
import { useStore } from '@/store/myStore'
const getStoreData = useStore()
</script>

<template>
  <div>{{ getStoreData.name }}</div>
  <Pinia08></Pinia08>
  <div>{{ getStoreData.func() }}</div>
  <div>{{ getStoreData.judge}}</div>
  <button @click="getStoreData.addAge">加年龄</button>
</template>

<style scoped></style>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构——排序第三幕(深究快排(非递归实现)、快排的优化、内省排序,排序总结)超详细!!!!

文章目录 前言一、非递归实现快排二、快排的优化版本三、内省排序四、排序算法复杂度以及稳定性的分析总结 前言 继上一篇博客基于递归的方式学习了快速排序和归并排序 今天我们来深究快速排序&#xff0c;使用栈的数据结构非递归实现快排&#xff0c;优化快排&#xff08;三路…

数字经济发展的新视角:数字产业化、数据资产化、产业数字化与数据产业

在当今数字化、网络化和智能化的时代&#xff0c;数字经济的快速发展催生了一系列新兴概念&#xff0c;其中“数字产业化、数据资产化、产业数字化与数据产业”尤为引人注目。这四个概念不仅代表了数字经济发展的不同阶段和方向&#xff0c;也深刻影响着传统产业的转型升级和经…

springboot370高校宣讲会管理系统(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 高校宣讲会管理系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c…

ansible自动化运维(一)配置主机清单

目录 一、介绍 1.1了解自动化运维 1.2 ansible简介 1.3 ansible自动化运维的优势 1.4 ansible架构图 二、部署ansible 2.1 基本参数 2.2 Ansible帮助命令 2.3 配置主机清单 2.3.1 查看ansible的所有配置文件 2.3.2 /etc/ansible/ansible.cfg常用配置选项 2.3.3 ssh密…

计算机网络 —— HTTP 协议(详解)

前一篇文章&#xff1a;网页版五子棋—— WebSocket 协议_网页可以实现websocket吗-CSDN博客 目录 前言 一、HTTP 协议简介 二、HTTP 协议格式 1.抓包工具的使用 2.抓包工具的原理 3.抓包结果 4.HTTP协议格式总结 三、HTTP 请求 1. URL &#xff08;1&#xff09;UR…

GaussDB的BTree索引和UBTree索引

目录 一、简介 二、BTree索引和UBTree索引结构 三、BTree索引和UBTree索引优势 四、总结与展望 一、简介 数据库通常使用索引来提高业务查询的速度。本文将深入介绍GaussDB中最常用的两种索引&#xff1a;BTree索引和UBTree索引。我们将重点解读BTree索引和UBTree索引的存储…

通义灵码走进北京大学创新课堂丨阿里云云原生 10 月产品月报

云原生月度动态 云原生是企业数字创新的最短路径。 《阿里云云原生每月动态》&#xff0c;从趋势热点、产品新功能、服务客户、开源与开发者动态等方面&#xff0c;为企业提供数字化的路径与指南。 趋势热点 &#x1f947; 通义灵码走进北京大学创新课堂&#xff0c;与 400…

python 练习题

目录 1&#xff0c;输入三个整数&#xff0c;按升序输出 2&#xff0c;输入年份及1-12月份&#xff0c;判断月份属于大月&#xff0c;小月&#xff0c;闰月&#xff0c;平月&#xff0c;并输出本月天数 3&#xff0c;输入一个整数&#xff0c;显示其所有是素数因子 4&#…

IDEA 2024 配置Maven

Step 1:确定下载Apache Maven版本 在IDEA 2024中&#xff0c;随便新建一个Maven项目&#xff1b; 在File下拉菜单栏中&#xff0c;找到Setings&#xff1b; 在Build&#xff0c;Execution&#xff0c;Deployment中找到Maven 确定下载的Apache Maven版本应略低于或等于IDEA绑…

ubuntu20.04更换安装高版本CUDA以及多个CUDA版本管理

Ubuntu 20.04下多版本CUDA的安装与切换 CUDA安装配置环境变量软连接附上参考博客CUDA安装 cuda官方下载地址 因为我需要安装的是11.1版本的,所以这里按着11.1举例安装 安装命令如下: wget https://developer.download.nvidia.com/compute/cuda/11.1.0/local_installers/cu…

Web基础

实践目标 &#xff08;1&#xff09;Web前端HTML&#xff08;2&#xff09;Web前端javascipt&#xff08;3&#xff09;Web后端&#xff1a;MySQL基础&#xff1a;正常安装、启动MySQL&#xff0c;建库、创建用户、修改密码、建表&#xff08;4&#xff09;Web后端&#xff1a…

C++:unordered_map与unordered_set详解

文章目录 前言一、KeyOfT1. 为什么需要仿函数&#xff1f;2. MapKeyOfT与SetKeyOfT代码实现 二、迭代器1. 设计背景2. 为什么需要存储哈希表指针3. operator 的逻辑4. begin() 和 end() 的实现5. 友元和前置声明的作用6. 完整代码 三、迭代器map与set的复用1. map的复用&#x…

redis下载、基础数据类型、操作讲解说明,持久化、springboot整合等

1 Redis是什么 官网&#xff1a;https://redis.io 开发者&#xff1a;Antirez Redis诞生于2009年全称是Remote Dictionary Server 远程词典服务器&#xff0c;是一个基于内存的键值型NoSQL数据库。 Redis是一个开源的、高性能的键值对存储系统&#xff0c;它支持多种数据结构&…

《 C++ 修炼全景指南:二十五 》缓存系统的技术奥秘:LRU 原理、代码实现与未来趋势

摘要 本篇博客深入解析了 LRU&#xff08;Least Recently Used&#xff09;缓存机制&#xff0c;包括其核心原理、代码实现、优化策略和实际应用等方面。通过结合双向链表与哈希表&#xff0c;LRU 缓存实现了高效的数据插入、查找与删除操作。文章还对 LRU 的优化方案进行了详…

【k8s】给ServiceAccount 创建关联的 Secrets

说明 k8s v1.24.0 更新之后进行创建 ServiceAccount 不会自动生成 Secret 需要对其手动创建. 创建步骤 创建SA apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata:namespace: jtkjdevname: gitcicd-role rules: - apiGroups: ["apps"]resources: [&…

C++(4个类型转换)

1. C语言中的类型转换 1. 隐式 类型转换&#xff1a; 具有相近的类型才能进行互相转换&#xff0c;如&#xff1a;int,char,double都表示数值。 2. 强制类型转换&#xff1a;能隐式类型转换就能强制类型转换&#xff0c;隐式类型之间的转换类型强相关&#xff0c;强制类型转换…

Linux——命名管道及日志

linux——进程间通信及管道的应用场景-CSDN博客 文章目录 目录 文章目录 前言 一、命名管道是什么&#xff1f; 理解&#xff1a; 2、编写代码 makefile 管道封装成类&#xff0c;想用中管道时只需要调用实例化 读端 写端 日志 1、日志是什么&#xff1f; 2、日志有什么&#x…

动态代理如何加强安全性

在当今这个信息爆炸、网络无孔不入的时代&#xff0c;我们的每一次点击、每一次浏览都可能留下痕迹&#xff0c;成为潜在的安全隐患。如何在享受网络便利的同时&#xff0c;有效保护自己的隐私和信息安全&#xff0c;成为了每位网络使用者必须面对的重要课题。动态代理服务器&a…

5G学习笔记之随机接入

目录 1. 概述 2. MSG1 2.1 选择SSB 2.2 选择Preamble Index 2.3 选择发送Preamble的时频资源 2.4 确定RA-RNTI 2.5 确定发送功率 3. MSG2 4. MSG3 5. MSG4 6. 其它 6.1 切换中的随机接入 6.2 SI请求的随机接入 6.3 通过PDCCH order重新建立同步 1. 概述 随机接入…

《DSL-FIQA》论文翻译

《DSL-FIQA: Assessing Facial Image Quality Via Dual-Set Degradation Learning and Landmark-Guided Transformer》 原文链接&#xff1a;DSL-FIQA: Assessing Facial Image Quality via Dual-Set Degradation Learning and Landmark-Guided Transformer | IEEE Conference…