Vue3(一)

1.Vue3概述

Vue3的API由Vue2的选项式API改为了组合式API。但是,也是Vue2中的选项式API也是兼容的。

2.创建Vue3项目

create-vue 是 Vue 官方新的脚手架工具,底层切换到了 vite。使用create-vue创建项目的步骤如下:

安装 create-vue

npm init vue@latest

项目中关键文件的含义

3.组合式API

3.1.setup选项

setup 函数是在 beforeCreate 钩子之前执行。并且,在setup函数中写的数据和方法需要在末尾以对象的方式 return,才能给模版使用。

<script>
  export default {
    setup(){
      const message = 'this is message'
      const logMessage = ()=>{
        console.log(message)
      }
      // 必须return才可以
      return {
        message,
        logMessage
      }
    }
  }
</script>

也可以给 script 标签添加 setup 标记,这样 script 标签内部所有的代码相当于都是在 setup 函数内,导出语句也会被默认添加上。

<script setup>
  const message = 'this is message'
  const logMessage = ()=>{
    console.log(message)
  }
</script>

3.2.reactive和ref函数

reactive:用来接受对象类型数据的传入并返回一个响应式的对象。

<script setup>
 // 导入
 import { reactive } from 'vue'
 // 执行函数 传入参数 变量接收
 const state = reactive({
   msg:'this is msg'
 })
 const setSate = ()=>{
   // 修改数据更新视图
   state.msg = 'this is new msg'
 }
</script>

<template>
  {{ state.msg }}
  <button @click="setState">change msg</button>
</template>

ref:接收简单类型或者对象类型的数据传入并返回一个响应式的对象。基本用的都是这种。

<script setup>
 // 导入
 import { ref } from 'vue'
 // 执行函数 传入参数 变量接收
 const count = ref(0)
 const setCount = ()=>{
   // 修改数据更新视图必须加上.value
   count.value++
 }
</script>

<template>
  <button @click="setCount">{{count}}</button>
</template>

通过 ref 定义出了响应式数据之后,在<template>和<script>标签中访问数据的格式是不一样的。

//在<template>中访问数据,直接访问即可
<template>
{{ data }}
<template>

<scrirt>
const data = ref(4)
<!-- 在<scrirt>中访问 -->
consolo.log(data.value)
</scrirt>

3.3.computed

会基于现有的数据,计算出来的新属性。依赖的数据发生了变化,计算属性也会自动重新计算。

<script setup>
// 导入
import {ref, computed } from 'vue'
// 原始数据
const count = ref(0)
// 计算属性
const doubleCount = computed(()=>count.value * 2)

// 原始数据
const list = ref([1,2,3,4,5,6,7,8])
// 计算属性list
const filterList = computed(() => {
    return list.value.filter(item => item > 2)
})
</script>

3.4.watch

侦听一个或者多个数据的变化,数据变化时执行回调函数,俩个额外参数 immediate控制立刻执行,deep开启深度侦听。

1.侦听单个数据

<script setup>
  // 1. 导入watch
  import { ref, watch } from 'vue'
  const count = ref(0)
  // 2. 调用watch 侦听变化
  watch(count, (newValue, oldValue)=>{
    console.log(`count发生了变化,老值为${oldValue},新值为${newValue}`)
  })
</script>

2.侦听多个数据

<script setup>
  // 1. 导入watch
  import { ref, watch } from 'vue'
  const count = ref(0)
  const name = ref('cp')
  // 2. 调用watch 侦听变化
  watch([count, name], ([newCount, newName],[oldCount,oldName])=>{
    console.log(`count或者name变化了,[newCount, newName],[oldCount,oldName])
  })
</script>

3.immediate和deep参数

<script setup>
  // 1. 导入watch
  import { ref, watch } from 'vue'
  const count = ref(0)
  // 2. 调用watch 侦听变化
  watch(count, (newValue, oldValue)=>{
    console.log(`count发生了变化,老值为${oldValue},新值为${newValue}`)
  },{
    immediate: true, // 侦听器创建出来之后立即执行一次
    deep: true // watch默认是浅层监听,对象内部的属性发生变化时不会触发,开启deep后即可监听内部属性
  })
</script>

3.5.生命周期函数

1.选项式对比组合式

2.生命周期函数的使用

<scirpt setup>
// 1.导入生命周期函数
import { onMounted } from 'vue'
// 2.定义生命周期函数,编写自定义逻辑
onMounted(()=>{
  // 自定义逻辑
})
</script>

相同的生命周期函数可以定义多个,会按照定义的顺序执行

<scirpt setup>
import { onMounted } from 'vue'
onMounted(()=>{
  // 自定义逻辑
})

onMounted(()=>{
  // 自定义逻辑
})
</script>

3.6.父子组件的通信

1.父传子

2.子传父

3.7.模版引用

<script setup>
import { ref } from 'vue'
// 1.调用ref函数得到ref对象
const h1Ref = ref(null)
</script>

<template>
    <!--- 2.通过ref标识绑定ref对象 -->
    <h1 ref="h1Ref">我是dom标签</h1>
</template>

3.8.provide和inject

provide和inject用来跨层传递数据和方法。

//在顶层组件中使用 provide 来传递数据
<template>
  <div>
    <Child />
  </div>
</template>

<script setup>
import { provide } from 'vue';
import Child from './Child.vue';

// 提供数据给子组件
provide('myData', 'Hello from Parent!');


const setCount = () => {
    count.value++
}
// 提供方法给子组件
provide('setCount-key', setCount);
</script>
//在底层组件中使用 inject 来接收数据
<template>
  <div>
    <p>{{ myData }}</p>
  </div>
</template>

<script setup>
import { inject } from 'vue';

// 注入顶层组件提供的数据
const myData = inject('myData');

// 注入顶层组件提供的方法
const setCount = inject('setCount-key')
</script>

4.宏函数

4.1.defineExpose

默认情况下在 <script setup> 语法糖下组件内部的属性和方法是不开放给父组件访问的,可以通过 defineExpose 编译宏指定哪些属性和方法容许访问。

4.2.defineOptions

使用 setup 函数的时候,如果要定义 props, emits,可以轻而易举地添加一个与 setup 平级的属性。但是,用了 <script setup> 后,就没法添加与其平级的属性了。

为了解决这一问题,在 Vue 3.3 中新引入了 defineOptions 宏,用来定义 Options API 的选项。可以用 defineOptions 定义任意的选项。

<script setup>
defineOptions({
  name:'组件名',
  inheritAttrs: false,
  // ... 更多自定义属性
})
</setup>

props、emits、expose、slots 这些除外,这些是使用对应的宏函数 defineXXX 来做到。

4.3.defineModel

在 Vue3 中,父组件在子组件上使用 v-model 进行双向数据绑定,相当于给子组件传递一个 modelValue 属性,同时监听并触发来自子组件的 update:modelValue 事件。

在子组件中,我们需要先定义 props,再定义 emits,会非常麻烦,并且会有许多重复的代码。

<scirpt setup>
import MyInput from '@/components/my-input.vue'
import { ref } from 'vue'
const txt = ref('123456')
</script>

<template>
<div>
  <MyInput v-model="txt"></MyInput>
  {{ txt }}
</div>
</template>
<scirpt setup>
defineProps({
  modelValue: String
})
const emit = defineEmits(['update:modelValue'])
</script>

<template>
<div>
  <input
    type="text"
    :value="modelValue"
    @input="e => emit('update:modelValue', e.target.value)"
  >
</div>
</template>

有了 defineModel 之后,读取和修改父组件的属性会非常简单,如下所示:

<script setup>
const modelValue = defineModel()
// 修改父组件的属性
modelValue.value++
</setup>

<template>
<!--读取父组件的属性-->
<div>{{ modelValue }}<div>
</template>

需要注意的是,生效需要配置 vite.config.js。

import { fileURLToPath, URL } from 'node:url'

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    vue({
      script: {
        defineModel: true
      }
    }),
  ],
  resolve: {
    alias: {
      '@': fileURLToPath(new URL('./src', import.meta.url))
    }
  }
})

5.Pinia

5.1.什么是Pinia

Pinia 是 Vue3 的状态管理库 ,是 Vuex 状态管理工具的替代品。

5.2.Pinia的使用

实际开发项目的时候,Pinia 可以在项目创建时自动添加。因为现在是初次学习,所以从零开始:

安装 Pinia

yarn add pinia
# 或者使用 npm
npm install pinia

创建 Pinia 实例并将其传递给应用

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

const app = createApp(App)
const pinia = createPinia()

app.use(pinia)
app.mount('#app')

定义Store

import { defineStore } from 'pinia'
import { ref } from 'vue'
export const useCounterStore = defineStore('counter', () => {
  //数据
  const count = ref(0)

  //修改数据的方法
  const increment = () => {
    count.value++
  }

  //以对象形式返回
  return { count, increment }
})

组件使用store

<script setup>
// 1.导入 useCounterStore 方法
import { useCounterStore } from '@/store/counter'
// 2.执行方法得到counterStore对象
const counterStore = useCounterStore()
</script>

<template>
    <button @click="counterStore.increment">
      {{ counterStore.count }}
    </button>
</template>

5.3.computed

Pinia 中的 computed 函数用于定义计算属性,相当于 Vuex 中的 getters。

import { defineStore } from 'pinia'
import { ref } from 'vue'
export const useCounterStore = defineStore('counter', () => {
  //数据
  const count = ref(0)

  //定义getter
  const doubleCount = computed(() => count.value * 2)

  //以对象形式返回
  return { count, doubleCount }
})

5.4.action

pinia 中的 action 相当于组件中方法,直接定义即可。

export const useCounterStore = defineStore('main', {
  //数据
  const count = ref(0)

  // 同步action
  const addCount = increment() {
    this.count++
  }
  // 异步action
  const getList = async () => {
    const res = await axios.get('URL')
    console.log(res)
  }
  
  return {
    count,
    addCount,
    getList
  }
}
})

5.5.storeToRefs

在结构出 Pinia 中的数据时,像下面这样直接结构会丢失数据的响应式。

const { count, msg } = counterStore

storeToRefs 函数可以保证解析出的数据依然保持响应式

const { count, msg } = storeToRefs(counterStore)

5.6.Pinia持久化插件

Pinia中的数据进行持久化有专门的插件,具体使用步骤如下:

安装插件 pinia-plugin-persistedstate

npm i pinia-plugin-persistedstate

在 main.js 中配置

import { create } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'
// 导入持久化的插件
import persist from 'pinia-plugin-persistedstate'

// 创建Pinia实例
const pinia = createPinia()
// 创建根实例
const app = createApp(App)
// pinia插件的配置
app.use(createPinia().use(persist))
// 视图的挂载

配置 store/counter.js

import { defineStore } from 'pinia'
import { computed, ref } from 'vue'

export const useCounterStore = defineStore('counter', () => {
  ...
  return {
    count,
    doubleCount,
    increment
  }
}, {
  persist: true  // 开启持久化配置
})

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

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

相关文章

使用wav2vec 2.0进行音位分类任务的研究总结

使用wav2vec 2.0进行音位分类任务的研究总结 原文名称&#xff1a; Using wav2vec 2.0 for phonetic classification tasks: methodological aspects 研究背景 自监督学习在语音中的应用 自监督学习在自动语音识别任务中表现出色&#xff0c;例如说话人识别和验证。变换器模型…

STM32学习(十)

I2C模块内部结构 I2C&#xff08;Inter-Integrated Circuit&#xff09;模块是一种由Philips公司开发的二线式串行总线协议&#xff0c;用于短距离通信&#xff0c;允许多个设备共享相同的总线‌。 ‌硬件连接简单‌&#xff1a;I2C通信仅需要两条总线&#xff0c;即SCL&…

深入Android架构(从线程到AIDL)_22 IPC的Proxy-Stub设计模式04

目录 5、 谁来写Proxy及Stub类呢? 如何考虑人的分工 IA接口知识取得的难题 在编程上&#xff0c;有什么技术可以实现这个方法&#xff1f; 范例 5、 谁来写Proxy及Stub类呢? -- 强龙提供AIDL工具&#xff0c;给地头蛇产出Proxy和Stub类 如何考虑人的分工 由框架开发者…

Mysql--运维篇--日志管理(连接层,SQL层,存储引擎层,文件存储层)

MySQL提供了多种日志类型&#xff0c;用于记录不同的活动和事件。这些日志对于数据库的管理、故障排除、性能优化和安全审计非常重要。 一、错误日志 (Error Log) 作用&#xff1a; 记录MySQL服务器启动、运行和停止期间遇到的问题和错误信息。 查看&#xff1a; 默认情况下…

现代谱估计的原理及MATLAB仿真(二)(AR模型法、MVDR法、MUSIC法)

现代谱估计的原理及MATLAB仿真AR参数模型法&#xff08;参数模型功率谱估计&#xff09;、MVDR法&#xff08;最小方差无失真响应法&#xff09;、MUSIC法&#xff08;多重信号分类法&#xff09; 文章目录 前言一、AR参数模型1 原理2 MATLAB仿真 二、MVDR法1 原理2 MATLAB仿真…

搭建docker私有化仓库Harbor

Docker私有仓库概述 Docker私有仓库介绍 Docker私有仓库是个人、组织或企业内部用于存储和管理Docker镜像的存储库。Docker默认会有一个公共的仓库Docker Hub,而与Docker Hub不同,私有仓库是受限访问的,只有授权用户才能够上传、下载和管理其中的镜像。这种私有仓库可以部…

HTML5实现好看的中秋节网页源码

HTML5实现好看的中秋节网页源码 前言一、设计来源1.1 网站首页界面1.2 登录注册界面1.3 节日由来界面1.4 节日习俗界面1.5 节日文化界面1.6 节日美食界面1.7 节日故事界面1.8 节日民谣界面1.9 联系我们界面 二、效果和源码2.1 动态效果2.2 源代码 源码下载结束语 HTML5实现好看…

Linux (CentOS) 安装 Docker 和 Docker Compose

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template &#x1f33a; 仓库主页&#xff1a; GitCode︱ Gitee ︱ Github &#x1f496; 欢迎点赞 &#x1f44d; 收藏 ⭐评论 …

简单说一下 类

类的定义 类是用来对一个实体&#xff08;对象&#xff09;进行描述&#xff0c;类就是用来描述这个对象具有一些什么属性。 类的定义格式 //创建类 class ClassName{ field; //简单概述为字段(属性)或者成员变量 method; //简单概述为行为或者是成员方法 } cl…

Windows11环境下设置MySQL8字符集utf8mb4_unicode_ci

1.关闭MySQL8的服务CTRLshiftESC&#xff0c;找到MySQL关闭服务即可 2.找到配置文件路径&#xff08;msi版本默认&#xff09; C:\ProgramData\MySQL\MySQL Server 8.0 3.使用管理员权限编辑my.ini文件并保存 # Other default tuning values # MySQL Server Instance Config…

机器学习实战——K-近邻法(K-Nearest Neighbors,KNN)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​ ​​​ ​​ 在机器学习的广阔领域中&#xff0c;K-近邻法&#xff08;KNN&#xff09; 是一种既简单又强大的非参数分类方法。尽管其…

《Opencv》图像的旋转

一、使用numpy库实现 np.rot90(img,-1) 后面的参数为-1时事顺时针旋转&#xff0c;为1时是逆时针旋转。 import cv2 import numpy as np img cv2.imread(./images/kele.png) """方法一""" # 顺时针90度 rot_1 np.rot90(img,-1) # 逆时针90度…

模型 九屏幕分析法

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。九屏幕法&#xff1a;全方位分析问题的系统工具。 1 九屏幕分析法的应用 1.1 新产品研发的市场分析 一家科技公司计划开发一款新型智能手机&#xff0c;为了全面评估市场潜力和风险&#xff0c;他们…

_STM32关于CPU超频的参考_HAL

MCU: STM32F407VET6 官方最高稳定频率&#xff1a;168MHz 工具&#xff1a;STM32CubeMX 本篇仅仅只是提供超频&#xff08;默认指的是主频&#xff09;的简单方法&#xff0c;并未涉及STM32超频极限等问题。原理很简单&#xff0c;通过设置锁相环的倍频系数达到不同的频率&am…

若依框架--数据字典设计使用和前后端代码分析

RY的数据字典管理: 字典管理是用来维护数据类型的数据&#xff0c;如下拉框、单选按钮、复选框、树选择的数据&#xff0c;方便系统管理员维护。减少对后端的访问&#xff0c;原来的下拉菜单点击一下就需要对后端进行访问&#xff0c;现在通过数据字典减少了对后端的访问。 如…

openEuler 22.04使用yum源最快速度部署k8s 1.20集群

本文目的 openEuler的官方源里有kubernetes 1.20&#xff0c;使用yum源安装是最快部署一个k8s集群的办法 硬件环境 主机名系统架构ipmasteropenEuler release 22.03 (LTS-SP2)arm192.168.3.11edgeopenEuler release 22.03 (LTS-SP2)arm192.168.3.12deviceopenEuler release 22.…

使用宝塔面板,安装 Nginx、MySQL 和 Node.js

使用ssh远程链接服务器 在完成使用ssh远程链接服务器后 可使用宝塔面板&#xff0c;安装 Nginx、MySQL 和 Node.js 宝塔网站 一、远程链接服务器 二、根据服务器系统安装宝塔 wget -O install.sh https://download.bt.cn/install/install_lts.sh && sudo bash inst…

Linux第一课:c语言 学习记录day06

四、数组 冒泡排序 两两比较&#xff0c;第 j 个和 j1 个比较 int a[5] {5, 4, 3, 2, 1}; 第一轮&#xff1a;i 0 n&#xff1a;n个数&#xff0c;比较 n-1-i 次 4 5 3 2 1 // 第一次比较 j 0 4 3 5 2 1 // 第二次比较 j 1 4 3 2 5 1 // 第三次比较 j 2 4 3 2 1 5 // …

油猴支持阿里云自动登陆插件

遇到的以下问题&#xff0c;都已在脚本中解决&#xff1a; 获取到的元素赋值在页面显示&#xff0c;但是底层的value并没有改写&#xff0c;导致请求就是获取不到数据元素的加载时机不定&#xff0c;尤其是弱网情况下&#xff0c;只靠延迟还是有可能获取不到&#xff0c;且登陆…

什么是卷积网络中的平移不变性?平移shft在数据增强中的意义

今天来介绍一下数据增强中的平移shft操作和卷积网络中的平移不变性。 1、什么是平移 Shift 平移是指在数据增强&#xff08;data augmentation&#xff09;过程中&#xff0c;通过对输入图像或目标进行位置偏移&#xff08;平移&#xff09;&#xff0c;让目标在图像中呈现出…