初识vue3

文章目录

    • 1.Vue3的好处
    • 2.create-vue搭建vue3项目
    • 3.项目目录和关键文件
    • 4.组合式API - setup选项
    • 5.组合式API - reactive和ref函数
      • ①reactive
      • ②ref()
    • 6.组合式API - computed
    • 7.组合式API - watch
      • ①基础使用 - 侦听单个数据
      • ②基础使用 - 侦听多个数据
      • ③immediate
      • ④精确侦听对象的某个属性
    • 8.Vue3的生命周期函数
    • 9.组合式API - 父子通信
    • 10.组合式API - 模板引用

1.Vue3的好处

在这里插入图片描述
在这里插入图片描述

2.create-vue搭建vue3项目

create-vue是Vue官方新的手脚架工具,底层底层切换到了vite(下一代构建工具),为开发提供极速响应

  1. 前提环境条件
    已安装16.0或更高版本的Node.js √

  2. 创建一个Vue应用

npm init vue@latest 这一指令将会安装并执行create-vue

因为npm的管理员权限问题,我这边不能直接在文件中右击执行windows power shall,所以要在管理员内执行,通过cd ~绝对路径进入文件内,然后再创建vue3👇
在这里插入图片描述
在这里插入图片描述

3.项目目录和关键文件

在这里插入图片描述

关键文件:

  1. vite.config.js-项目的配置文件 基于vite的配置

  2. package.json-项目包文件 核心依赖项变成了Vue3.x和vite

  3. main.js-入口文件 createApp函数创建应用实例

  4. app.vue-根组件SFC单文件组件 script-template-style
    变化一:脚本script和模板template顺序调整
    变化二:模板template不再要求唯一根元素
    变化三:脚本script添加setup标识支持组合式API

  5. index.html-单页入口 提供id为app的挂载点

vue2的插件是Vetur
vue3的插件是Volar


在这里插入图片描述

②导入组件,没有组件注册,可以直接用
在这里插入图片描述
③template不再要求唯一根元素

④main.js

import './assets/main.css'// new Vue() 创建一个实例 => createApp()
// createRouter() createStore()
// 将创建实例进行了封装,保证每个实例的独立封闭性import { createApp } from 'vue'
import App from './App.vue'// 前半段是创建实例,后半段是将app往实例上挂载
// mount是设置挂载点#app的意思
createApp(App).mount('#app')

4.组合式API - setup选项

setup选项的写法和执行时机

在这里插入图片描述

setup需要写成一个函数,跟当前的生命周期钩子是类似的,直接往配置项里面去写

就可以了.将来里面就可以编写组合式的API,可以往里面调各种函数

通过下图可以看当前setup的执行时机👇

在这里插入图片描述

通过这张图可以看到,它的执行实际会比beforCreate这个生命周期钩子还要早

<script>
// setup
// 1. 执行时机, 比beforeCreate还要早
// 2.setup函数中,获取不到this(是undefined)
export default {setup () {console.log('setup函数')},beforeCreate () {console.log('beforeCreate函数')}
}
</script><template><div>学习vue3</div>
</template>

setup选项中写代码的特点

提供的任何数据或者函数想要在模板中应用,必须return.只有在对象当中return了,这个变量才能在页面当中应用

在这里插入图片描述

<script>
// setup
// 3.数据和函数需要在setup最后return,才能在模板中应用
export default {setup () {// 数据const message = 'hello vue3'// 函数const logMessage = () => {console.log(message)}return {message,logMessage}},beforeCreate () {console.log('beforeCreate函数')}
}
</script><template><div>{{ message }}</div><button @click="logMessage">按钮</button>
</template>

在这里插入图片描述

问题:问题是每次都要return,好麻烦

解答:<script setup>

在这里插入图片描述

<script setup>
const message = 'this is a message'
const logMessage = () => {console.log(message)
}
</script><template><div>{{ message }}</div><button @click="logMessage">按钮</button>
</template>

5.组合式API - reactive和ref函数

①reactive

作用:接收对象类型数据的参数传入并返回一个响应式的对象

核心步骤:

<script setup>
// 导入
import { reactive } from 'vue'// 执行函数 传入参数 变量接收
const state = reactive(对象类型数据)
</script>
  1. 从vue包中导入 reactive函数
  2. <script setup>中执行reactive函数并传入类型为对象的初始值,并使用变量接收返回值
<script setup>
// reactive:接收一个对象类型的数据,返回一个响应式的对象
import { reactive } from 'vue'
const state = reactive({count: 100
})
const setCount = () => {state.count++
}
</script><template><div><div>{{ state.count }}</div><button @click="setCount">+1</button></div>
</template>

在这里插入图片描述

②ref()

作用:接收简单类型或者对象类型的数据传入并返回一个响应式的对象

核心步骤:

<script setup>
// 导入
import { ref } from 'vue'// 执行函数 传入参数 变量接收
const count = ref(简单类型或者复杂类型数据)</script>
  1. 从vue包中导入ref函数
  2. <script setup>中执行 ref 函数并传入初始值,使用变量接收 ref 函数的返回值
<script>
// ref:接收简单类型 或 复杂类型, 返回一个响应式的队形
// 本质:是在原有传入数据的基础上,外层包了一层对象,包成了复杂类型
// 底层,包成复杂类型之后,再借助 reactive 实现的响应式
// 注意点:
//       1. 访问数据,需要通过 .value 
//       2. 在template中, .value 不需要加(帮我们扒了一层)// 推荐: 以后声明数据,统一用 ref => 统一了编码规范
import { ref } from 'vue'
const count = ref(0)
//console.log(count)
const setCount = () => {count.value++
}
</script><template><div><div>{{ count }}</div><button @click="setCount">+1</button></div>
</template>

在这里插入图片描述
在这里插入图片描述

6.组合式API - computed

computed计算属性函数

计算属性基本思想和Vue2的完全一致,组合式API下的计算属性只是修改了写法

核心步骤:

  1. 导入computed函数
  2. 执行函数 在回调参数中return基于响应式数据做计算的值,用变量接收
<script setup>
// 导入
import { computed } from 'vue'// 执行函数 变量接受 在回调参数中return计算值
const computedState = computed(() => {return 基于响应式数据做计算之后的值
})
</script>

计算属性小案例

在这里插入图片描述

<script setup>
// const 计算属性 = computed(()=>{
// return 计算返回的结果
//})import { computed, ref } from 'vue'// 声明数据
const list = ref([1, 2, 3, 4, 5, 6, 7, 8])// 基于list派生一个计算属性,从list中过滤出 >2
const computedList = computed(() => {return list.value.filter(item => item > 2) // 但凡是在script脚本中访问数据,都要通过 .value
})// 定义一个修改数组的方法
const addFn = () => {list.value.push(666)
}
</script><template><div><div>原始数据: {{ list }}</div><div>计算后的数据: {{ computedList }}</div><button @click="addFn" type="button">修改</button></div>
</template>

在这里插入图片描述
在这里插入图片描述

7.组合式API - watch

作用:侦听一个或多个数据的变化,数据变化时执行回调函数

两个额外参数:

  1. immediate (立刻执行)
  2. deep (深度侦听)

①基础使用 - 侦听单个数据

  1. 导入watch函数
  2. 执行watch函数传入要侦听的响应式数据 (ref对象) 和回调函数
<script setup>//1. 导入watch
import { ref, watch } from 'vue'
const count = ref(0)// 2. 调用watch 侦听变化// watch后面跟上一个ref对象(count),后面再去写一个回调
watch(count, (newValue, oldValue) => {console.log(`count发生了变化,老值为${oldValue},新值为${newValue}`)
})
// 上面代码的意思式:一旦当当前这个这个count变化了,就会执行后面的回调,后面的回调当中可以拿到新值和老值(即变化前和变化后的)</script>

②基础使用 - 侦听多个数据

说明:同时侦听多个响应式数据的变化,不管哪个数据变化都需要

<script setup>import { ref, watch } from 'vue'
const count = ref(0)
const name = ref('cp')//侦听多个数据源
watch([count, name],([newCount, newName], [oldCount, oldName]) => {console.log('count或者name变化了’,[newCount,newName],[oldCount,oldName])}
)
</script>
<script setup>
import { ref, watch } from 'vue'
const count = ref(0)
const nickname= ref('张三’)const changeCount = () => {count. value++
}const changeNickname = () => {nickname.value='李四'
}})//1. 监视单个数据的变化
//   watch(ref对象,(newValue,oldValue)=>{ …. })
// watch(count, (newValue, oldValue) => {
//   console.log(newValue, oldValue)
// })//2. 监视多个数据的变化
//   watch([ref对象1,ref对象2],(newArr,oldArr)=>{ …..
watch([count, nickname], (newArr, oldArr) => {console.log(newArr, oldArr)
})</script><template><div>{{ count }}</div><button @click="changeCount">改数字</button><div>{{ nickname }}</div><button @click="changeNickname">改昵称</button>
</template>

③immediate

说明:在侦听器创建时立刻触发回调,响应式数据变化之后继续执行回调

<script>
const count = ref(0)
watch(count, () => {console.log('count发生了变化变化')
}, {immediate: true
})
</script>
<script setup>
import { ref, watch } from 'vue'
const count = ref(0)
const nickname= ref('张三’)const changeCount = () => {count. value++
}const changeNickname = () => {nickname.value='李四'
}})I// 3. immediate 立刻执行
watch(count, (newValue, oldValue) => {console. log(newValue, oldValue)
}, {immediate: true})//4. deep 深度监视,默认 watch 进行的是 浅层监视
const ref1=ref(简单类型)可以直接监视
const ref2=ref(复杂类型)监视不到复杂类型内部数据的变化const userInfo = ref({name: 'zs',age: 18
})
const setUserInfo = () => {// 修改了 userInfo.value 修改了对象的地址,才能监视到// userInfo.value = { name: '1s', age: 50 }userInfo.value.age++
}
watch(userInfo, (newValue) => {console.log(newValue)
}, {deep: true
})</script><template><div>{{ count }}</div><button @click="changeCount">改数字</button><div>{{ nickname }}</div><button @click="changeNickname">改昵称</button><div>------------------------</div><div>{{ userInfo }}</div><button @click="setUserInfo">修改userInfo</button>
</template>

④精确侦听对象的某个属性

需求:在不开启deep的前提下,侦听age的变化,只有age变化时才执行回调在这里插入图片描述
在这里插入图片描述

8.Vue3的生命周期函数

下面是 Vue 3 中的组合式 API 生命周期函数列表:

onBeforeMount:在组件挂载之前调用。
onMounted:在组件挂载后调用。
onBeforeUpdate:在组件更新之前调用,但在重新渲染之前。
onUpdated:在组件更新之后调用,但在重新渲染之后。
onBeforeUnmount:在组件卸载之前调用。
onUnmounted:在组件卸载后调用。
onErrorCaptured:在捕获子组件错误时调用。
onRenderTriggered:在组件渲染时调用。
onRenderTracked:在追踪组件渲染时调用。

这些函数在 setup 函数中以普通函数的形式使用,而不是作为 Vue 2.x 中的钩子函数的字符串属性。例如:

import { onMounted, onBeforeUnmount } from 'vue'export default {setup() {onMounted(() => {console.log('Component mounted')})onBeforeUnmount(() => {console.log('Component will be unmounted')})// ...其他的生命周期函数return {// ...}}
}
<script setup>
import { onMounted } from 'vue';//beforeCreate 和 created 的相关代码
//一律放在 setup 中执行const getList = () => {setTimeout(() => {console.log('发送请求,获取数据')},2000)
//一进入页面的请求
getList()//如果有些代码需要在mounted生命周期中执行
onMounted(() => {console.log('mounted生命周期函数 -逻辑1')
})//写成函数的调用方式,可以调用多次,并不会冲突,而是按照顺序依次执行
onMounted(() => {console.log('mounted生命周期函数 -逻辑2)
})</script>

在这里插入图片描述
可以调用多次,如若调用多次,他会按照顺序依次执行

9.组合式API - 父子通信

组合式API下的父传子

基本思想:

  1. 父组件中给子组件绑定属性
  2. 子组件内部通过props选项接收
    在这里插入图片描述
    在这里插入图片描述

组合式API下子传父

基本思想

  1. 父组件中给子组件标签通过@绑定事件
  2. 子组件内部通过emit方法触发事件

在这里插入图片描述

在组合式 API 中,父子组件之间的通信可以通过propsprovide/inject来实现。

使用props,父组件可以通过props将数据传递给子组件。在子组件中,可以通过接

收props来获取父组件传递过来的数据。

下面是一个示例:

// Parent.vue
<template><div><Child message="Hello from parent!" /></div>
</template><script>
import Child from './Child.vue';export default {components: {Child}
}
</script>
// Child.vue
<template><div><p>{{ message }}</p></div>
</template><script>
export default {props: {message: {type: String,required: true}}
}
</script>

在上面的示例中,父组件通过props将message数据传递给子组件Child。子组件通

过在props中声明message,接收父组件传递过来的数据,并在模板中显示。

除了使用props,还可以使用provide/inject来实现父子组件之间的通信。通过

provide,在父组件中可以将数据提供给所有子组件。在子组件中使用inject可以获

取提供的数据。

下面是一个示例:

// Parent.vue
<template><div><Child /></div>
</template><script>
import { provide } from 'vue';
import Child from './Child.vue';export default {components: {Child},setup() {provide('message', 'Hello from parent!');}
}
</script>
// Child.vue
<template><div><p>{{ message }}</p></div>
</template><script>
import { inject } from 'vue';export default {setup() {const message = inject('message');return {message}}
}
</script>

在上面的示例中,父组件使用provide将message数据提供给子组件。在子组件

Child中,使用inject来获取提供的message数据,并在模板中显示。

通过这两种方式,父子组件之间可以方便地进行数据传递和通信。你可以根据你的

需求选择合适的方式来实现。

10.组合式API - 模板引用

通过ref表示获取真实的dom对象或者组件实例对象

在这里插入图片描述
如何使用( 以获取do为例 组件同理 )

在这里插入图片描述

  1. 首先一同ref函数生成一个ref对象
  2. 创建完这个对象之后,页面中需要通过ref标识绑定ref对象到标签
App.vue<script setup>
import TestCom from '@/components/test-com. vue'
import { onMounted, ref } from 'vue'// 模板引用(可以获取dom,也可以获取组件)
//1. 调用ref函数,生成一个ref对象
//2. 通过ref标识,进行绑定
//3.通过ref对象.value即可访问到绑定的元素(必须渲染
const inp = ref(null)// 生命周期钩子 onMounted
onMounted(() => {//console. log(inp. value)//inp.value.focus()
})const clickFn = () => {inp.value.focus()
}//------------------------------------------------------
const testRef = ref(null)
const getCom = () => {console.log(testRef.value)
}</script><template><div><input ref="inp" type="text"><button @click="clickFn">点击让输入框聚焦</button>//点按钮聚焦</div><TestCom ref="testRef"></TestCom><button @click="getCom">获取组件</button> //点击按钮获取组件
</template>

在这里插入图片描述

defineExpose()
在默认情况下<script setup>语法糖下组件内部的属性和方法是不开放给父组件访问的
可以通过defineExpose编译宏 指定哪些属性和方法允许访问
在这里插入图片描述
components/test-com.vue

<script setup>
const count = 999
const sayHi = () => {console.log('打招呼')
}defineExpose({count,sayHi
})</script><template><div>我是用于测试的组件 -{{ count }}</div>
</template>

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于在Tkinter + Pillow图片叠加中出现的问题

这段时间我一直在尝试对多图层图片进行一个叠加的操作&#xff0c;想用tkinter实现出来&#xff0c;先看错误 这里我其实已经选择了图片&#xff0c;但是发现是ValueError&#xff0c;我尝试断点检测但是也无动于衷&#xff0c;因为设置变量检测的时候发现变量并没有错误&…

面试八股文(3)

文章目录 1.HashSet如何检查重复2.comparable和Comparator区别3.ConcurrentHashMap和Hashtable区别4.线程和进程5.并发与并行的区别6.为什么使用多线程7.使用多线程可能带来问题8.线程的生命周期和状态9.什么是上下文切换10.线程死锁11.产生死锁四个条件12.如何避免死锁 1.Hash…

单片机最小系统讲解

一最小系统解释&#xff1a; 面试当中常常问到的&#xff0c;一个题目什么是单片机最小系统&#xff1f; 本质上是问&#xff1f;要能够使单片机能够工作的最小组部分有哪些。 对于单片机而言&#xff0c;要想能够工作&#xff0c;就和人一样我们要有心脏推动我们身体器官的…

Docker基础(持续更新中)

# 第1步&#xff0c;去DockerHub查看nginx镜像仓库及相关信息# 第2步&#xff0c;拉取Nginx镜像 docker pull nginx# 第3步&#xff0c;查看镜像 docker images # 结果如下&#xff1a; REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest 60…

【DDD】学习笔记-代码模型的架构决策

代码模型属于软件架构的一部分&#xff0c;它是设计模型的进化与实现&#xff0c;体现出了代码模块&#xff08;包&#xff09;的结构层次。在架构视图中&#xff0c;代码模型甚至会作为其中的一个视图&#xff0c;通过它来展现模块的划分&#xff0c;并定义运行时实体与执行视…

Cmake语法学习3:语法

1.双引号 1.1 命令参数 1&#xff09;介绍 命令中多个参数之间使用空格进行分隔&#xff0c;而 cmake 会将双引号引起来的内容作为一个整体&#xff0c;当它当成一个参数&#xff0c;假如你的参数中有空格&#xff08;空格是参数的一部分&#xff09;&#xff0c;那么就可以使…

Python中with管理上下文

上下文管理器 上下文管理器本质就是能够支持with操作。 任何实现了 __enter__() 和 __exit__() 方法的对象都可称之为上下文管理器&#xff0c;上下文管理器对象可以使用 with 关键字。显然&#xff0c;文件&#xff08;file&#xff09;对象也实现了上下文管理器协议。 实现…

一文速学-selenium高阶操作连接已存在浏览器

前言 不得不说selenium不仅在自动化测试作为不可或缺的工具&#xff0c;在数据获取方面也是十分好用&#xff0c;能够十分快速的见到效果&#xff0c;这都取决于selenium框架的足够的灵活性&#xff0c;甚至在一些基于web端的自动化办公都十分有效。 通过selenium连接已经存在…

幻兽帕鲁能在Mac上运行吗?幻兽帕鲁Palworld新手攻略

幻兽帕鲁能在Mac上运行吗&#xff1f; 《幻兽帕鲁》目前还未正式登陆Mac平台&#xff0c;不过通过一些方法是可以让游戏在该平台运行的。 虽然游戏不能在最高配置下运行&#xff0c;但如果你安装了CrossOver这个软件&#xff0c;就可以玩了。这是为Mac、Linux和ChromeOS等设计…

oracle19C 密码包含特殊字符@ 导致ORA-12154

oracle 19C 密码包含特殊字符 出现登录失败&#xff0c;针对此问题一次说个明白 ORA-12154: TNS:could not resolve the connect identifier specified Oracle 19c之前密码是可以包含特殊字符&#xff0c;但是如果包含特殊字符需要双引号 比如oracle11g 正常 如果密码包含特殊…

MongoDB从入门到实战之MongoDB快速入门

前言 上一章节主要概述了MongoDB的优劣势、应用场景和发展史。这一章节将快速的概述一下MongoDB的基本概念&#xff0c;带领大家快速入门MongoDB这个文档型的NoSQL数据库。 MongoDB从入门到实战的相关教程 MongoDB从入门到实战之MongoDB简介&#x1f449; MongoDB从入门到实战…

大数据本地环境搭建03-Spark搭建

需要提前部署好 Zookeeper/Hadoop/Hive 环境 1 Local模式 1.1 上传压缩包 下载链接 链接&#xff1a;https://pan.baidu.com/s/1rLq39ddxh7np7JKiuRAhDA?pwde20h 提取码&#xff1a;e20h 将spark-3.1.2-bin-hadoop3.2.tar.gz压缩包到node1下的/export/server目录 1.2 解压压…

数据结构——实验01-线性表的链式存储和操作

一、实验内容 二、算法思想与算法实现 1、解题思想 &#xff08;1&#xff09;逆序创建链表La就是使用头插法创建一个链表&#xff0c;所谓头插法就是在创建链表时始终将新元素插入到头结点之后&#xff0c;而正序创建链表Lb就是使用尾插法创建一个链表&#xff0c;所谓尾插法…

Pycharm python用matplotlib 3D绘图显示空白解决办法

问题原因&#xff1a; matplotlib版本升级之后显示代码变了&#xff0c;修改为新的 # ax Axes3D(fig) # 原代码 ax fig.add_axes(Axes3D(fig)) # 新代码import numpy as np import matplotlib.pyplot as plt from matplotlib import cm from mpl_toolkits.mplot3d import Ax…

五大架构风格之一:数据流风格

数据流风格详细介绍 系统架构数据流风格是一种软件体系结构风格&#xff0c;它强调了系统内部不同部分之间的数据流动。这种风格侧重于描述系统中的数据处理过程&#xff0c;以及数据是如何从一个组件传递到另一个组件的。以下是系统架构数据流风格的详细介绍&#xff1a; 1 基…

Hadoop:HDFS学习巩固——基础习题及编程实战

一 HDFS 选择题 1.对HDFS通信协议的理解错误的是&#xff1f; A.客户端与数据节点的交互是通过RPC&#xff08;Remote Procedure Call&#xff09;来实现的 B.HDFS通信协议都是构建在IoT协议基础之上的 C.名称节点和数据节点之间则使用数据节点协议进行交互 D.客户端通过一…

代码随想录算法训练营29期Day41|LeetCode 343,96

文档讲解&#xff1a;整数拆分 不同的二叉搜索树 343.整数拆分 题目链接&#xff1a;https://leetcode.cn/problems/integer-break/description/ 思路&#xff1a; 题目要求我们拆分n&#xff0c;拆成k个数使其乘积和最大&#xff0c;然而题目中并没有给出k&#xff0c;所以…

影院购票|电影院订票选座小程序|基于微信小程序的电影院购票系统设计与实现(源码+数据库+文档)

电影院订票选座小程序目录 目录 基于微信小程序的电影院购票系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户功能实现 2、管理员功能实现 &#xff08;1&#xff09;影院信息管理 &#xff08;2&#xff09;电影信息管理 &#xff08;3&#xff09;已…

算法学习——华为机考题库6(HJ36 - HJ40)

算法学习——华为机考题库6&#xff08;HJ36 - HJ40&#xff09; HJ36 字符串加密 描述 有一种技巧可以对数据进行加密&#xff0c;它使用一个单词作为它的密匙。下面是它的工作原理&#xff1a;首先&#xff0c;选择一个单词作为密匙&#xff0c;如TRAILBLAZERS。如果单词中…

链表——C语言——day17

链表 链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。在用数组存放数据时&#xff0c;必须事先定义固定的长度&#xff08;即元素个数&#xff09;。链表则没有这种缺点&#xff0c;它根据需要开辟内存单元。 链表有一个“头指针“变量&#xff0c;图中…