vue3学习(更新中)

目录

  • 创建一个vue应用
  • 编写APP组件
    • main.ts
    • APP.vue
  • setup
  • ref和reactive
    • ref
    • reactive
  • toRefs和toRef
    • toRefs
    • toRef
  • computed
  • watch和watchEffect
  • 标签的ref属性
  • ts接口范型-自定义类型
  • props的使用
  • 生命周期
  • pina
    • 搭建pina环境
    • 存储+读取数据

创建一个vue应用

npm create vue@latest

编写APP组件

main.ts

import { createApp } from 'vue'
import App from './App.vue'

createApp(App).mount('#app')

APP.vue

<template>
  <div class="app">
    app
  </div>
</template>

<script setup lang="ts">
</script>

<style scoped>
</style>

setup

<template>
   <div>{{ name }}</div>
</template>

<script lang="ts" setup name="Person2">
   const name = 'zhangsan'
</script>

name="Person2"需要安装下面的插件

插件
npm i vite-plugin-vue-setup-extend -d
在这里插入图片描述

ref和reactive

ref

ref() 接收参数,并将其包裹在一个带有 .value 属性的 ref 对象中返回

1、创建基本类型的响应式数据

import { ref } from 'vue'
const name = ref('zhangsan')

2、创建对象类型的响应式数据

<template>
   <div>{{ info.name }}</div>
   <button @click="change">修改</button>
</template>

<script lang="ts" setup name="Person2">
import { ref } from 'vue'
const info = ref({
   name: 'aaa'
})
function change () {
   info.value.name = 'bbb'
}
</script>

reactive

只能创建对象类型的响应式数据

<template>
   <div>{{ info.name }}</div>
   <button @click="change">修改</button>
</template>

<script lang="ts" setup name="Person2">
import { reactive } from 'vue'
const info = reactive({
   name: 'aaa'
})
function change () {
   info.name = 'bbb'
}
</script>

toRefs和toRef

toRefs

toRefs用来把响应式对象转换成普通对象,把对象中的每一个属性,包裹成ref对象

<template>
   <div>{{ info.name }}</div>
   <div>{{ age }}</div>
   <button @click="change">修改</button>
</template>

<script lang="ts" setup name="Person2">
import { reactive, toRefs } from 'vue'
const info = reactive({
   name: 'aaa',
   age: 18
})
let { name, age } = toRefs(info)
function change () {
   name.value = 'bbb'
   age.value = 19
}
</script>

toRef

将响应式对象中的所有属性转换为单独的响应式数据,对象成为普通对象

<template>
   <div>{{ info.name }}</div>
   <button @click="change">修改</button>
</template>

<script lang="ts" setup name="Person2">
import { reactive, toRef } from 'vue'
const info = reactive({
   name: 'aaa',
   age: 18
})
let name = toRef(info, 'name')
function change () {
   name.value = 'bbb'
}
</script>

computed

<template>
   <input type="text" v-model="firstName">
   <input type="text" v-model="lastName">
   <div>{{ fullName }}</div>
</template>

<script lang="ts" setup name="Person2">
import { computed, ref } from 'vue'
let firstName = ref('zhang')
let lastName = ref('san')
// 只读
// let fullName = computed(() => {
//    return firstName.value + lastName.value
// })
// 可读可写
let fullName = computed({
   get() {
      return firstName.value + lastName.value
   },
   set (val) {
      const [ str1, str2 ] = val.split('-')
      firstName.value = str1
      lastName.value = str2
   }
})
fullName.value = 'li-si'
</script>

watch和watchEffect

watch监听一下四种数据
1、ref定义的数据
2、reactive定义的数据
3、函数返回一个值(getter函数)
4、一个包含上述内容的数组

<template>
   <div>{{ sum }}</div>
   <button @click="changeSum">修改</button>
</template>

<script lang="ts" setup name="Person2">
import { ref, watch } from 'vue'
let sum = ref(0)
function changeSum () {
   sum.value += 1
}
const stopWatch = watch(sum, (newVal) => {
   console.log('sum变化了', newVal)
   // 停止监视
   if (newVal === 5) {
      stopWatch()
   }
})
</script>
<template>
   <div>{{ info.name }}</div>
   <button @click="change1">修改属性值</button>
   <button @click="change2">修改整个对象</button>
</template>

<script lang="ts" setup name="Person2">
import { ref, watch } from 'vue'
let info = ref({
   name: 'zhangsan'
})
function change1 () {
   info.value.name = 'lisi'
}
function change2 () {
   info.value = { name: 'lisi' }
}
// deep 监视属性值的变化 immediate 立即执行
watch(info, (newVal) => {
   console.log(newVal)
}, { deep: true, immediate: true })
</script>
<template>
   <div>{{ info.name }}</div>
   <button @click="change1">修改属性值</button>
   <button @click="change2">修改整个对象</button>
</template>

<script lang="ts" setup name="Person2">
import { reactive, watch } from 'vue'
let info = reactive({
   name: 'zhangsan'
})
function change1 () {
   info.name = 'lisi'
}
function change2 () {
   info = Object.assign(info, { name: 'wangwu' })
}
// reactive定义的对象类型数据,默认开启深度监视且不可关闭
watch(info, (newVal) => {
   console.log(newVal)
})
</script>
<template>
   <div>{{ info.name }}</div>
   <button @click="change1">修改1</button>
   <button @click="change2">修改2</button>
</template>

<script lang="ts" setup name="Person2">
import { reactive, watch } from 'vue'
let info = reactive({
   name: 'zhangsan',
   age: 18
})
function change1 () {
   info.name = 'lisi'
}
function change2 () {
   info.age = 19
}
watch(() => info.age, (newVal) => {
   console.log(newVal)
})
watch([() => info.age, () => info.name], (newVal) => {
   console.log(newVal)
})

watchEffect

watchEffect(() => {
   console.log(info.name)
})

watch和watchEffect都能监视响应式数据的变化,不同的是监听数据变化的方式不同。
watch 只追踪明确侦听的数据源。它不会追踪任何在回调中访问到的东西。另外,仅在数据源确实改变时才会触发回调。watch 会避免在发生副作用时追踪依赖,因此,我们能更加精确地控制回调函数的触发时机。
watchEffect,则会在副作用发生期间追踪依赖。它会在同步执行过程中,自动追踪所有能访问到的响应式属性。这更方便,而且代码往往更简洁,但有时其响应性依赖关系会不那么明确。

标签的ref属性

如果用于普通 DOM 元素,引用将是元素本身;如果用于子组件,引用将是子组件的实例

<template>
   <h1 ref="title">nihao</h1>
   <button @click="showLog">点击</button>
</template>

<script lang="ts" setup name="Person2">
import { ref, defineExpose } from 'vue'
const title = ref()
const a = ref(0)
function showLog() {
   console.log(title.value)
}
// 默认不会暴露任何在 <script setup> 中声明的绑定,使用efineExpose暴露出去,父组件可访问
defineExpose({ a })
</script>

ts接口范型-自定义类型

// 定义一个接口,用于限制person对象的具体属性
export interface PersonInter {
  id: string,
  name: string,
  age: number
}

// 一个自定义类型
// export type Persons = Array<PersonInter>
export type Persons = PersonInter[]

使用

<script lang="ts" setup name="Person2">
import { reactive } from 'vue'
import { type Persons } from '../types'
const personList = reactive<Persons>([
   { id: '1', name: '张三', age: 18 }
])
console.log(personList)
</script>

props的使用

<template>
  <div class="app">
    <Person :list="personList"/>
  </div>
</template>

<script lang="ts" setup name="App">
import Person from './components/TestPerson.vue'
import { reactive } from 'vue'
import { type Persons } from './types'
const personList = reactive<Persons>([
   { id: '1', name: '张三', age: 18 }
])
</script>
<script lang="ts" setup name="Person2">
import { defineProps } from 'vue'
import type { Persons } from '../types';
// 只接收list
//  const props =  defineProps(['list'])
//  console.log(props)

// 接收list + 限制类型
//  defineProps<{ list: Persons }>()

//  接收list + 限制类型 + 限制必要性 + 指定默认值
withDefaults(defineProps<{list?:Persons}>(), {
   list: () => [{ id: '1', name: 'aa', age: 18 }]
})
</script>

生命周期

1、setup() : 开始创建组件

2、onBeforeMount() : 组件挂载到节点上之前执行的函数;

3、onMounted() : 组件挂载完成后执行的函数;

4、onBeforeUpdate(): 组件更新之前执行的函数;

5、onUpdated(): 组件更新完成之后执行的函数;

6、onBeforeUnmount(): 组件卸载之前执行的函数;

7、onUnmounted(): 组件卸载完成后执行的函数;

8、onActivated(): 若组件实例是 缓存树的一部分,当组件被插入到 DOM 中时调用;

9、onDeactivated(): 若组件实例是 缓存树的一部分,当组件从 DOM 中被移除时调用;

10、onErrorCaptured(): 在捕获了后代组件传递的错误时调用。

pina

搭建pina环境

// 第一步:引入pinia
import { createPinia } from 'pinia'
const app = createApp(App)
// 第二步:创建pinia
const pinia = createPinia()
// 第三步: 安装pinia
app.use(pinia)

存储+读取数据

更新中…

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

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

相关文章

【Java核心能力】高并发在简历上如何体现?

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…

力扣大厂热门面试算法题 12-14

12. 整数转罗马数字&#xff0c;13. 罗马数字转整数&#xff0c;14. 最长公共前缀&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.11 可通过leetcode所有测试用例。 目录 12. 整数转罗马数字 解题思路 完整代码 Java Pytho…

​LeetCode解法汇总1261. 在受污染的二叉树中查找元素

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给出一个满足下述规则的二叉树&#xff1…

基于SpringBoot的“医院信管系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“医院信管系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 功能结构图 系统首页界面图 用户注册界面图 医生…

基于Android的教学课程系统设计与开发

摘 要 移动应用已经成为人们生活必不可缺的一部分&#xff0c;大学生身为移动应用的最大用户群体&#xff0c;在生活学习娱乐各个方面都与移动应用有着紧密联系&#xff0c;然而针对大学生校园学习的移动应用却寥寥无几&#xff0c;因为不同的学校&#xff0c;甚至不同的院系&…

java guide 八股

Java语言特点 简单易学、面向对象&#xff08;继承、封装、多态&#xff09;、平台无关性&#xff08;Java虚拟机jvm&#xff09;、支持多线程、可靠、安全、高效、支持网络编程、编译与解释共存 JVM&#xff1a;Java虚拟机&#xff08;跨平台的关键&#xff09; JRE&#xff…

【maven下载、安装、配置教程】

一、下载 maven 官网&#xff1a;Maven – Download Apache Maven 注意&#xff1a;idea 和 maven 的版本问题&#xff0c;不然 idea 启动项目会发生兼容性错误。如 2020 版本 idea 支持 3.6.3 左右的 maven 版本&#xff0c;用 3.9版本的 maven 会报错。 二、配置maven全局配置…

探索AI时代“芯”路径 软通动力子公司鸿湖万联助阵第八届瑞芯微开发者大会

3月7日-8日&#xff0c;第八届瑞芯微开发者大会&#xff08;RKDC2024&#xff09;在福州成功举办&#xff0c;大会以“AI芯片AI应用AloT”为主题&#xff0c;通过芯片应用及生态伙伴的技术展示、产品和技术论坛等系列活动串联&#xff0c;吸引数千名开发者、合作伙伴以及行业专…

Linux文件与文件系统的压缩

文章目录 Linux文件与文件系统的压缩Linux系统常见的压缩命令gzip&#xff0c;zcat/zmore/zless/zgrepbzip2&#xff0c;bzcat/bzmore/bzless/bzgreppxz&#xff0c;xzcat/xzmore/xzless/xzgrepgzip&#xff0c;bzip2&#xff0c;xz压缩时间对比打包命令&#xff1a;tar打包命令…

Java基础-接口

文章目录 1.快速入门代码&#xff1a;结果&#xff1a; 2.接口基本介绍1.语法注意&#xff1a;在jdk1.8以后接口才可以有静态方法&#xff0c;默认方法 2.代码实例 3.接口的应用场景1.场景介绍2.代码实例4.接口使用细节 5.接口课堂练习题目&#xff1a;答案&#xff1a;注意&am…

【快速上手QT】08-Buttons组件

我们差不多把QT的基础部分讲差不多了。接下来我们把一些组件介绍一下&#xff0c;最后再开始QT的进阶部分&#xff0c;需要先把基础打牢嘛&#xff0c;也当是练习练习怎么使用QT助手了。 就按照QtDesigner里的顺序&#xff0c;今天我们讲一讲Buttons&#xff0c;也就是按钮组件…

Linux命令深入学习——列出帮助手册,开机关机

linux中有多种方法查看一个不熟悉命令的详细信息&#xff0c;如 ls --help&#xff0c;help ls&#xff0c;man ls&#xff0c;info ls 在linux系统中可以使用命令进行开关机以及相关基础操作 同时在进行写入操作时&#xff0c;可以使用快捷键进行操作

微信小程序(一)

WebView app.是全局配置&#xff0c;app.json是全局配置文件&#xff0c;在页面的.json配置文件中的配置会覆盖我们全局的配置 快捷键&#xff1a; .box 敲回车 ----- <view class"box"></view> .row*8 敲回车&#xff1a; .row{$}*8 敲回车 案例1&…

深入浅出Java泛型

公众号「稀有猿诉」 原文链接 深入浅出Java泛型 温故而知新&#xff0c;可以为师矣&#xff01; 在前面的一篇文章中学习了Kotlin的泛型知识&#xff0c;但总感觉还不够深入&#xff0c;因为一些深入的话题和高级的特性并未有讲清楚。但在继续深入之前还是有必要重温一下…

吴恩达深度学习笔记:神经网络的编程基础2.5-2.8

目录 第一门课&#xff1a;神经网络和深度学习 (Neural Networks and Deep Learning)第二周&#xff1a;神经网络的编程基础 (Basics of Neural Network programming)2.5 导数&#xff08;Derivatives&#xff09; 第一门课&#xff1a;神经网络和深度学习 (Neural Networks an…

04-微服务 面试题

目录 1.Spring Cloud 常见的组件有哪些? 2.服务注册和发现是什么意思?(Spring Cloud 如何实现服务注册发现) 3.你们项目负载均衡如何实现的 ? 4.什么是服务雪崩,怎么解决这个问题? 5.你们服务是怎么监控的? 6.微服务限流(漏桶算法、令牌桶算法) 7.解释一下CAP…

scrapy的基本使用介绍

创建项目 ### 1. 创建虚拟环境 conda create -n spiderScrapy python3.9 ### 2. 安装scrapy pip install scrapy2.8.0 -i https://pypi.tuna.tsinghua.edu.cn/simple### 3. 生成一个框架 scrapy startproject my_spider### 4. 生成项目 scrapy genspider baidu https://www.b…

RabbitMQ - 02 - 基本消息模型

目录 部署demo项目 什么是基本消息模型 实现基本消息模型 部署demo项目 首先配置好一个mq的练习demo,并配置好相关依赖 链接&#xff1a;https://pan.baidu.com/s/1oXAqgoz9Y_5V7YxC_rLa-Q?pwdv2sg 提取码&#xff1a;v2sg 如图 父xml文件已经配置好了 AMQP依赖了 什么…

重学SpringBoot3-集成Thymeleaf

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 重学SpringBoot3-集成Thymeleaf 1. 添加Thymeleaf依赖2. 配置Thymeleaf属性&#xff08;可选&#xff09;3. 创建Thymeleaf模板4. 创建一个Controller5. 运行应用并访问页面Thymeleaf基本语法小技巧 国际化步骤 …

Cassandra 安装部署

文章目录 一、概述1.官方文档2. 克隆服务器3.安装准备3.1.安装 JDK 113.2.安装 Python3.3.下载文件 二、安装部署1.配置 Cassandra2.启动 Cassandra3.关闭Cassandra4.查看状态5.客户端连接服务器6.服务运行脚本 开源中间件 # Cassandrahttps://iothub.org.cn/docs/middleware/…