Vue3.3新特新和Vue3-Pinia

文章目录

    • 1.Vue3.3新特性 - defineOptions
    • Vue3.3新特性 - defineModel
    • 3.Pinia快速入门
    • 4.手动添加Pinia到Vue项目
    • 5.Vue3 - Pinia的基本语法
    • 6.action的异步实现
    • 7.Vue3-Pinia-storeToRefs方法
    • 8.Pinia持久化插件
      • 安装
      • 用法

1.Vue3.3新特性 - defineOptions

背景说明
<script setup>之前,如果要定义 props, emits 可以轻而易举地添加一个与setup平级的属性,但是用了script setup后,就没法这么干了,setup属性已经没有了,自然无法添加与其平级的属性

为了解决这一问题,引入了defineProps 与 defineEmits这两个宏。但这只解决了props与emits这两个属性。如果我们要定义组件的name或其他自定义的属性,还是得回到最原始的用法 – 再添加一个普通的<script>标签。这样就会存在两个<script>标签。让人无法接受。

在这里插入图片描述

一定要另建一个script给组件起一个名字

所以在Vue3.3中新引入了defineOptions宏.顾名思义,主要是用来定义 Option API 的选项. 可以用defineOptions 定义任意的选项, props,emits,expose,slots除外(应为这些可以使用defineXXX来做到)

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

Vue3.3新特性 - defineModel

Vue3中的V-model 和 defineModel

在Vue3中,自定义组件上使用v-model,相当于传递一个modelValue属性, 同时触发 updata:modelValue 事件

<Child v-model="isVisible">
// 相当于
<Child :modelValue="isVisible" @updata:modelValue="isVisible=$event">

我们需要先定义 props, 再定义 emits. 其中有许多重复的代码. 如果需要修改此值, 还需要手动调用 emit 函数

ps:页面中有一个小的输入框,想要实现的效果是:封装一个输入框组件,并且v-model跟现在的数据做一个绑定

App.vue

<script 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>

my-input.vue

<script setup>
defineProps({
	modelValue: String
})
const emit = defineEmits(['updata:modelValue'])
</script>

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

新写法

<script setup>
const modelValue = defineModel()
modelValue.value++
</script>
<script setup>
import { defineModel } from 'vue'
const modelValue = defineModel()
</script>

<template>
<div>
	<input	
		type="text"
		:value="modelValue"
		@input="e => modelValue = e.target.value
	>
</div>
</template>

然后往vite.config.js中加配置
在这里插入图片描述

3.Pinia快速入门

什么是Pinia

Pinia 是 Vue 的最新状态管理工具, 是Vuex的 替代品

在这里插入图片描述

  1. 提供了更加简单的API(去掉了mutation)
  2. 提供符合组合式风格的API(和Vue3新语法统一)
  3. 弃掉了modules的概念, 每一个store都是一个独立的模块
  4. 配合 TypeScript 更加友好,提供可靠的类型推断

在这里插入图片描述

4.手动添加Pinia到Vue项目

在实际开发项目的时候,关于Pinia的配置,可以在创建项目时自动添加

  1. 使用Vite创建一个空的项目Vue3项目:npm create vue@latest
  2. 按照官方文档 安装 pinia 到项目中(官网:cn.vuejs.org)
  3. vue3官网中有个生态系统,其中有pinia
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
main.js

import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'
const pinia = createPinia() // 创建Pinia实例
const app = createApp(App) // 创建根实例
app.use(pinia).mount('#app') //这个可以拆分成下面的这两个
app.use(pinia)// pinia插件的安装配置
app.mount('#app')// 视图的挂载

5.Vue3 - Pinia的基本语法

定义Store

在深入研究核心概念之前,我们得知道 Store 是用 defineStore() 定义的,它的第一个参数要求是一个独一无二的名字:

import { defineStore } from 'pinia'

// 你可以对 `defineStore()` 的返回值进行任意命名,但最好使用 store 的名字,同时以 `use` 开头且以 `Store` 结尾。(比如 `useUserStore`,`useCartStore`,`useProductStore`)
// 第一个参数是你的应用中 Store 的唯一 ID。
export const useAlertsStore = defineStore('alerts', {
  // 其他配置...
})

这个名字 ,也被用作 id ,是必须传入的, Pinia 将用它来连接 store 和 devtools。为了养成习惯性的用法,将返回的函数命名为 use… 是一个符合组合式函数风格的约定。

defineStore() 的第二个参数可接受两类值:Setup 函数或 Option 对象。

Option Store
与 Vue 的选项式 API 类似,我们也可以传入一个带有 state、actions 与 getters 属性的 Option 对象

export const useCounterStore = defineStore('counter', {
  state: () => ({ count: 0 }),
  getters: {
    double: (state) => state.count * 2,
  },
  actions: {
    increment() {
      this.count++
    },
  },
})

你可以认为 state 是 store 的数据 (data),getters 是 store 的计算属性 (computed),而 actions 则是方法 (methods)。
为方便上手使用,Option Store 应尽可能直观简单。

Setup Store

也存在另一种定义 store 的可用语法。与 Vue 组合式 API 的 setup 函数 相似,我们可以传入一个函数,该函数定义了一些响应式属性和方法,并且返回一个带有我们想暴露出去的属性和方法的对象。

export const useCounterStore = defineStore('counter', () => {
  const count = ref(0)
  const doubleCount = computed(() => count.value * 2)
  function increment() {
    count.value++
  }

  return { count, doubleCount, increment }
})

在 Setup Store 中:

  • ref() 就是 state 属性
  • computed() 就是 getters
  • function() 就是 actions

Setup store 比 Option Store 带来了更多的灵活性,因为你可以在一个 store 内创建侦听器,并自由地使用任何组合式函数。不过,请记住,使用组合式函数会让 SSR 变得更加复杂。

新建store/counter.js

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

// 定义store
// defineStore(仓库唯一的标识, () => { ... })
export const useCounterStore = defineStore('counter', () => {
    // 声明数据 state - count
    const count = ref(0)
    // 声明操作数据的方法 action
	const addCount = () => count.value++
	const subCount = () => count.value--

    // 声明基于数据派生的计算属性 getters
	const double = computed(() => count.value * 2)    

    // 声明数据 state - msg
    const msg = ref('hello pinia')

    return {
        count,
		addCount,
		subCount,

        msg
    }
})

Son1Count.vue

<script setup>
import { useCounterStore } from '@/store/counte
const counterStore = useCounterStore()
</script>

<template>
	<div>
		我是Son1.vue - {{ counterStore.count }} - {{ counterStore.double }}
		<button @click="counterStore.addCount">+</button>
	</div>
</template>

<style scoped>

</style>

Son2Count.vue

<script setup>
import { useCounterStore } from '@/store/counte
const counterStore = useCounterStore()
</script>

<template>
	<div>
		我是Son1.vue - {{ counterStore.count }}
		<button @click="counterStore.subCount">-</button>
	</div>
</template>

<style scoped>

</style>

在这里插入图片描述

6.action的异步实现

在action里面不需要考虑同步还是异步,它都可以写,函数里面既可以直接修改数据,也可以先发个请求,拿到数据回来之后再去修改上面的数据

编写方式: 异步action函数的写法和组件中获取异步数据的写法完全一致
接口地址: http://geek.itheima.net/v1_0/channels
需求: 在Pinia中获取频道列表数据并把数据渲染App组件的模板中

在这里插入图片描述
channel.js

import { defineStore } from 'pinia'
import { ref } from 'vue'
import axios from 'axios'

export const useChannelStore = defineStore('channel', () => {
    // 声明数据
    const channelList = ref([])
    //声明操作数据的方法
    const getList = async () => {
    //支持异步
    const { data: { data }} = await axios.get('http://geek.itheima.net/v1_0/channels')
    channelList.value = data.channels
    console.log(data.channels)

    }

    // 声明getters相关
    return {
    channelList,
    getList
    }
})
<script setup>
import Son1Com from '@/components/Son1Com.vue'
import Son2Com from '@/components/Son2Com.vue'
import { useCounterStore } from '@/store/counter'
import { useChannelStore } from './store/channel'👈
const counterStore = useCounterStore ()
const channelStore = useChannelStore ()👈
console.log(counterStore)
</script>

<template>
    <div>
      <h3>
        App.vue根组件
        - {{ counterStore.count }}
        - {{ counterStore.msg }}
      </h3>
      <Son1Com></Son1Com>
      <Son2Com></Son2Com>
      <hr>
      <button @click="channelStore.getList">获取频道数据</button>👈
      <ul>
        <li v-for="item in channelStore.channelList" :key="item.id">{{ item.name }}</li>👈
      </ul>
    </div>
</template>

<style scoped>

</style>

7.Vue3-Pinia-storeToRefs方法

第六点中,如果直接进行解构,不进行处理,数据会丢失响应式,所以可以用到storeToRefs
在这里插入图片描述
在这里插入图片描述

8.Pinia持久化插件

官方文档:https://prazdevs.github.io/pinia-plugin-persistedstate/zh/

1.安装插件 pinia-plugin-persistedstate

npm i pinia-plugin-persistedstate

2.main.js 使用

import persist from 'pinia-plugin-persistedstate'

app.use(createPinia().use(persist))

3.store仓库中,persist:true开启

安装

npm

npm i pinia-plugin-persistedstate

将插件添加到 pinia 实例上

import { createPinia } from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'

const pinia = createPinia()
pinia.use(piniaPluginPersistedstate)

用法

创建 Store 时,将 persist 选项设置为 true。

  • 选项式语法
import { defineStore } from 'pinia'

export const useStore = defineStore('main', {
  state: () => {
    return {
      someState: '你好 pinia',
    }
  },
  persist: true,
})               
  • 组合式语法
import { defineStore } from 'pinia'

export const useStore = defineStore(
  'main',
  () => {
    const someState = ref('你好 pinia')
    return { someState }
  },
  {
    persist: true,
  },
)

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

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

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

相关文章

ELAdmin后台启动

版本选择 ELAdmin官网地址&#xff1a;https://eladmin.vip/ 有 JPA 和 MyBatis两个版本&#xff0c;之前只有 JPA&#xff0c;考虑到国内复杂的业务情况增加了 MyBatis 版本。我最终也选择了使用 MyBatis版本。 代码 仓库地址&#xff1a;https://gitee.com/elunez/eladmin…

Python环境下基于辛几何模态分解的信号分解方法

基于辛几何的分析方法是一种保护相空间几何结构的新型分析方法&#xff0c;主要用于求解动力学和控制系统中矩阵或Hamilton矩阵的特征值问题&#xff0c;用来解决在动力学和控制系统理论的2n2n矩阵或哈密顿矩阵的特征值问题&#xff0c;已应用到结构损伤信号、奇异微分方程等系…

【C#】.net core 6.0 创建默认Web应用,以及默认结构讲解,适合初学者

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握。…

Zoho Mail 2023:回顾过去,展望未来

当我们告别又一个非凡的一年时&#xff0c;我们想回顾一下Zoho Mail如何融合传统与创新。我们迎来了成立15周年&#xff0c;这是一个由客户、合作伙伴和我们的敬业团队共同庆祝的里程碑。与我们一起回顾这段旅程&#xff0c;探索定义Zoho Mail历史篇章的敏捷性、精确性和创新性…

HiveSQL——条件判断语句嵌套windows子句的应用

注&#xff1a;参考文章&#xff1a; SQL条件判断语句嵌套window子句的应用【易错点】--HiveSql面试题25_sql剁成嵌套判断-CSDN博客文章浏览阅读920次&#xff0c;点赞4次&#xff0c;收藏4次。0 需求分析需求&#xff1a;表如下user_idgood_namegoods_typerk1hadoop1011hive1…

MQTT 服务器(emqx)搭建及使用

推荐阅读&#xff1a; MQTT 服务器(emqx)搭建及使用 - 哔哩哔哩 (bilibili.com) 一、EMQX 服务器搭建 1、下载EMQX https://www.emqx.com/zh/try?productbroker 官方中文手册&#xff1a; EMQX Docs 2、安装使用 1、该软件为绿色免安装版本&#xff0c;解压缩后即安装完…

spring boot打完jar包后使用命令行启动,提示xxx.jar 中没有主清单属性

在对springBoot接口中间件开发完毕后&#xff0c;本地启动没有任何问题&#xff0c;在使用package命令打包也没异常&#xff0c;打完包后使用命令行&#xff1a;java -jar xxx.jar启动发现报异常&#xff1a;xxx.jar 中没有主清单属性&#xff0c;具体解决方法如下&#xff1a;…

【Java八股面试系列】JVM-内存区域

目录 Java内存区域 运行时数据区域 线程独享区域 程序计数器 Java 虚拟机栈 StackFlowError&OOM 本地方法栈 线程共享区域 堆 GCR-分代回收算法 字符串常量池 方法区 运行时常量池 HotSpot 虚拟机对象探秘 对象的创建 对象的内存布局 句柄 Java内存区域 运…

[word] word表格表头怎么取消重复出现? #媒体#笔记#职场发展

word表格表头怎么取消重复出现&#xff1f; word表格表头怎么取消重复出现&#xff1f;在Word中的表格如果过长的话&#xff0c;会跨行显示在另一页&#xff0c;如果想要在其它页面上也显示表头&#xff0c;更直观的查看数据。难道要一个个复制表头吗&#xff1f;当然不是&…

Pandas.DataFrame.cummin() 累积最小值 详解 含代码 含测试数据集 随Pandas版本持续更新

关于Pandas版本&#xff1a; 本文基于 pandas2.2.0 编写。 关于本文内容更新&#xff1a; 随着pandas的stable版本更迭&#xff0c;本文持续更新&#xff0c;不断完善补充。 传送门&#xff1a; Pandas API参考目录 传送门&#xff1a; Pandas 版本更新及新特性 传送门&…

Netty的常用组件及线程模型设计(二)

Channel、EventLoopGroup和ChannelFuture Netty网络抽象的代表: Channel–Socket EventLoop–控制流、多线程处理、并发 ChannelFuture–异步通知 Channel和EventLoop关系如图: 我们可以看出Channel需要被注册到某个EventLoop上&#xff0c;在Channel整个声明周期内部都由这个…

JSP页面组件

JSP页面组件 JSP页面由各种组件组成,可以在JSP应用程序中使用这些组件来添加其他功能,如添加添加和循环结构或使用JavaBean组件。JSP页面的四个组件为: JSP指令JSP脚本JSP隐式对象JSP动作1. JSP指令 JSP页面中的指令元素提供关于特定JSP页面的全局信息,有三种类型: Page…

《图像处理》 图像细化

前言 图像细化算法又称之为Thinning Algorithms&#xff0c;或者骨架提取&#xff08;skeleton&#xff09;。该算法通常用于手写体数字的细化&#xff0c;输入的图像要求是黑白图像&#xff0c;即二值图像。从白色区域提取出该区域的中心线&#xff0c;中心线对于白色区域相当…

基于轻量级模型YOLOX-Nano的菜品识别系统

工程Gitee地址&#xff1a; https://gitee.com/zhong-liangtang/ncnn-android-yolox-nano 一、YOLOX简介 YOLOX是一个在2021年被旷视科技公司提出的高性能且无锚框&#xff08;Anchor-free&#xff09;的检测器&#xff0c;在YOLO系列的基础上吸收近年来目标检测学术界的最新…

STM32--SPI通信协议(3)SPI通信外设

前言 硬件SPI&#xff1a;通过硬件电路实现&#xff0c;所以硬件SPI速度更快&#xff0c;有专门的寄存器和 库函数 &#xff0c;使用起来更方便。 软件SPI&#xff1a;也称模拟SPI&#xff0c;通过程序控制IO口电平模拟SPI时序实现&#xff0c;需要程序不断控制IO电平翻转&am…

Python 数据分析(PYDA)第三版(二)

原文&#xff1a;wesmckinney.com/book/ 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 四、NumPy 基础知识&#xff1a;数组和向量化计算 原文&#xff1a;wesmckinney.com/book/numpy-basics 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 此开放访问网络版…

Maven私服部署与JAR文件本地安装

Nexus3 是一个仓库管理器&#xff0c;它极大地简化了本地内部仓库的维护和外部仓库的访问。 平常我们在获取 maven 仓库资源的时候&#xff0c;都是从 maven 的官方&#xff08;或者国内的镜像&#xff09;获取。团队的多人员同样的依赖都要从远程获取一遍&#xff0c;从网络方…

Cilium CNI深度指南

Cilium是基于eBPF的功能强大的CNI插件&#xff0c;为云原生环境提供了强大的网络和安全支持。原文: Cilium CNI: A Comprehensive Deep Dive Guide for Networking and Security Enthusiasts! &#x1f313;简介 欢迎阅读为网络和安全爱好者提供的全面深入的指南&#xff01; 本…

PCIe学习笔记(1)Hot-Plug机制

文章目录 Hot-Plug InitHot Add FlowSurprise Remove FlowNPEM Flow Hot-Plug Init PCIe hot-plug是一种支持在不关机情况下从支持的插槽添加或删除设备的功能&#xff0c;PCIe架构定义了一些寄存器以支持原生热插拔。相关寄存器主要分布在Device Capabilities, Slot Capabili…

进程间通信(5):信号灯集

信号灯也叫信号量&#xff0c;是不同进程间或一个给定进程内部不同线程间同步的机制。 信号灯集为信号量的集合&#xff0c;实现同步、互斥机制&#xff0c;配合共享内存使用&#xff0c;解决资源竞争问题。 函数&#xff1a;semget、semctl、semop 实现流程&#xff1a; 1…