Vue3学习宝典

news2025/1/23 4:09:25

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>

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

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

相关文章

Linux——基础命令(2) 文件内容操作

目录 ​编辑 文件内容操作 1.Vim &#xff08;1&#xff09;移动光标 &#xff08;2&#xff09;复制 &#xff08;3&#xff09;剪切 &#xff08;4&#xff09;删除 &#xff08;5&#xff09;粘贴 &#xff08;6&#xff09;替换,撤销,查找 &#xff08;7&#xff…

openwrt利用nftables在校园网环境下开启nat6 (ipv6 nat)

年初写过一篇openwrt在校园网环境下开启ipv6 nat的文章&#xff0c;利用ip6tables控制ipv6的流量。然而从OpenWrt22版本开始&#xff0c;系统内置的防火墙变为nftables&#xff0c;因此配置方法有所改变。本文主要参考了OpenWRT使用nftables实现IPv6 NAT 这篇文章。 友情提示 …

go语言的成神之路-筑基篇-gin框架渲染模板

第一节-gin框架渲染模板 因为电脑打不开了&#xff0c;所以用朋友的电脑来写的&#xff0c;也是体验了一次从零开始用vscode配置环境&#xff0c;忙活了一上午才配置好环境。太难配置了。好了废话不多说开始今天的进修之旅。 今天开始gin框架的正式学习希望大家认真观看并检查…

【软考网工笔记】网络基础理论——网络层

文章目录 中断处理过程数据包组装RIPRSVPipv4RIPv1 & RIPv2HFC 混合光纤同轴电缆&#xff08;Hybrid Fiber Coax&#xff0c;简称HFC&#xff09;BGP (边界网关协议)BGP-4 协议的四种报文ICMP 协议数字语音电子邮件协议MPLS 多协议标记交换ipv6DHCPDNS名称解析过程查询顺序…

linux网络抓包工具

linux网络抓包工具 一、tcpdump1.1 基本用法1.2 龙芯平台实例操作 二、wireshark2.1 主要功能2.2 龙芯平台实例操作 一、tcpdump tcpdump 指令可列出经过指定网络界面的数据包文件头&#xff0c;可以将网络中传送的数据包的 “头” 完全截获下来提供分析。它支持针对网络层、协…

NaviveUI框架的使用 ——安装与引入(图标安装与引入)

文章目录 概述安装直接引入引入图标样式库 概述 &#x1f349;Naive UI 是一个轻量、现代化且易于使用的 Vue 3 UI 组件库&#xff0c;它提供了一组简洁、易用且功能强大的组件&#xff0c;旨在为开发者提供更高效的开发体验&#xff0c;特别是对于构建现代化的 web 应用程序。…

WPF DataGrid 列隐藏

Window节点加上下面的 <Window.Resources><FrameworkElement x:Key"ProxyElement" DataContext"{Binding}" /></Window.Resources>然后随便加一个隐藏控件 <ContentControl Content"{StaticResource ProxyElement}" Visi…

【Gitlab】CICD使用minio作为分布式缓存

1、安装minio 下载适合自己系统版本的安装文件https://dl.min.io/server/minio/release/windows-amd64/ yum install xxx.rpm 2、配置/etc/profile export MINIO_ACCESS_KEYroot [ui登录账号] export MINIO_SECRET_KEYminioDev001 [ui登录密码] export MINIO_OPTS"…

用到动态库的程序运行过程

当我们写好了一段代码然后编译运行后会生成可执行文件&#xff0c;该文件会存在磁盘的当前目录下&#xff0c;而当我们开始运行这段程序时&#xff0c;操作系统&#xff08;加载器&#xff09;需要将其从磁盘加载进内存然后执行相关操作&#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密…

高效集成:将聚水潭数据导入MySQL的实战案例

聚水潭数据集成到MySQL&#xff1a;店铺信息查询案例分享 在数据驱动的业务环境中&#xff0c;如何高效、准确地实现跨平台的数据集成是每个企业面临的重要挑战。本文将聚焦于一个具体的系统对接集成案例——将聚水潭的店铺信息查询结果集成到MySQL数据库中&#xff0c;以供BI…

Spark基本命令详解

文章目录 Spark基本命令详解一、引言二、Spark Core 基本命令1、Transformations&#xff08;转换操作&#xff09;1.1、groupBy(func)1.2、filter(func) 2、Actions&#xff08;动作操作&#xff09;2.1、distinct([numTasks])2.2、sortBy(func, [ascending], [numTasks]) 三、…

[在线实验]-ActiveMQ Docker镜像的下载与部署

镜像下载 下载ActiveMQ的Docker镜像文件。通常&#xff0c;这些文件会以.tar格式提供&#xff0c;例如activemq.tar。 docker的activemq镜像资源-CSDN文库 加载镜像 下载完成后&#xff0c;您可以使用以下命令将镜像文件加载到Docker中&#xff1a; docker load --input a…

CQ 社区版 2024.11 | 新增“审批人组”概念、可通过SQL模式自定义审计图表……

CloudQuery 社区 11 月新版本来啦&#xff01;本月版本依旧是 CUG&#xff08;CloudQuery 用户组&#xff09;尝鲜版的更新。 针对审计模块增加了 SQL 模式自定义审计图表&#xff1b;在流程模块引入了“审批人组”概念。此外&#xff0c;在 SQL 编辑器、连接管理等模块都涉及…

mac终端自定义命令打开vscode

1.打开终端配置文件 open -e ~/.bash_profile终端安装了zsh&#xff0c;那么配置文件是.zshrc&#xff08;打开zsh配置&#xff0c;这里举&#x1f330;使用zsh&#xff09; sudo open -e ~/.zshrc 2.在zshrc配置文件中添加新的脚本&#xff08;这里的code就是快捷命令可以进…

关于单片机的原理与应用!

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///目前正在学习C&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于单片…

深入解析 MySQL 启动方式:`systemctl` 与 `mysqld` 的对比与应用

目录 前言1. 使用 systemctl 启动 MySQL1.1 什么是 systemctl1.2 systemctl 启动 MySQL 的方法1.3 应用场景1.4 优缺点优点缺点 2. 使用 mysqld 命令直接启动 MySQL2.1 什么是 mysqld2.2 mysqld 启动 MySQL 的方法2.3 应用场景2.4 优缺点优点缺点 3. 对比分析结语 前言 MySQL …

简单介绍下 VitePress 中的 vp-doc 和 vp-raw

VitePress 是一个轻量级的静态网站生成器&#xff0c;专为快速构建文档网站而设计。它是基于 Vite 和 Vue 3 构建的&#xff0c;旨在提供快速的开发体验和高效的构建过程。 存在两个需要注意的点&#xff1a;vp-doc 和 vp-raw&#xff0c;它们代表了不同的 CSS 样式类和用途&a…

HTML前端开发-- Flex布局详解及实战

引言 Flex布局&#xff0c;全称为Flexible Box Layout&#xff0c;是一种现代CSS布局技术&#xff0c;它提供了一种更有效的方式来设计响应式布局和复杂页面布局。本文将详细介绍Flex布局的基本概念、属性以及实战应用。 一、基本概念 Flex布局的核心是Flex容器&#xff08;…

【前端】理解 JavaScript 中 typeof 操作符的独特行为

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;typeof 操作符的基本使用&#x1f4af;为什么 typeof 数组是 "object"&#xff1f;&#x1f4af;为什么 typeof {} 返回 "object"&#xff1f;&…