Vue3:组合式API、Vue3.3新特性、Pinia

1、Vue3

优势
Vue3组合式API vs Vue2选项式API
使用create-vue创建项目

create-vue是Vue官方新的脚手架工具,底层切换到了vite,为开发提供快速响应

html 复制代码
<!-- 加上setup允许在script中直接编写组合式API -->
<script setup>
import HelloWorld from './components/HelloWorld.vue'
import TheWelcome from './components/TheWelcome.vue'
</script>

2、组合式API

setup选项

写法:

特点:

1、执行时机:在beforeCreate之前

2、setup函数中,获取不到this(this是undefined)

3、数据和函数需要在setup最后return中写,才能在模板中应用

语法糖
reactive函数

使用:先导包,调方法把对象转为响应式并赋值给state

ref函数

既支持简单类型又支持对象类型的数据,语法与reactive类似(声明数据统一使用ref,统一编码规范

本质:在原有传入数据的基础上,外层包了一层对象,包成复杂类型。底层包成复杂类型之后,再借助reactive实现的响应式。

注意点:

1、脚本中访问数据,需通过 .value 访问

2、在template中,不需要加 .value(帮我们扒了一层)

computed计算属性

注意:计算属性中不应该有"副作用"(eg:异步请求/修改dom);计算属性应该是只读的,特殊情况可以配置 get、set

watch
javascript 复制代码
// 监视单个数据的变化
watch(ref对象,(newValue,oldValue) => { ... })

// 监视多个数据的变化
watch([ref对象1,ref对象2],(newValue,oldValue) => { ... })

侦听多个数据:

immediate

一进页面立即执行

deep

默认watch进行的是 浅层监视

eg:

const ref1=ref(简单类型) 可以直接监视

const ref2=ref(复杂类型) 监视不到复杂类型内部数据的变化

生命周期函数
父子通信
父传子

注意:由于写了setup,所以无法直接配置props选项;因此,这里需要借助于"编译器宏"defineProps函数接收子组件传递的数据。

props传递的数据,模板中可以直接使用,脚本中props.属性名访问

子传父
模板引用和defineExpose宏函数
模板引用

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

模板引用时机:组件挂载完毕

通过ref对象.value即可访问到绑定的元素(必须渲染完成后,才能拿到)

defineExpose宏函数

显式暴露组件内部的属性和方法

provide和inject实现跨层传递数据

作用和场景:顶层组件向任意的底层组件传递数据和方法,实现跨层组件通信。

修改数据:谁的数据,由谁维护。(使用跨层级函数)

3、Vue3.3新特性

defineOptions
defineModel快速实现双向绑定

配置defineModel:

4、Pinia

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

添加pinia到vue项目:

基本语法

Store 是用 defineStore() 定义的,它的第一个参数要求是一个独一无二的名字:

javascript 复制代码
import { defineStore } from 'pinia'

//  `defineStore()` 的返回值的命名是自由的
// 但最好含有 store 的名字,且以 `use` 开头,以 `Store` 结尾。
// (比如 `useUserStore`,`useCartStore`,`useProductStore`)
// 第一个参数是你的应用中 Store 的唯一 ID。
export const useAlertsStore = defineStore('alerts', {
  // 其他配置...
})
javascript 复制代码
export const useCounterStore = defineStore('counter', () => {
  const count = ref(0)
  const name = ref('Eduardo')
  const doubleCount = computed(() => count.value * 2)
  function increment() {
    count.value++
  }

  return { count, name, doubleCount, increment }
})

action异步写法:与组件中获取异步数据的写法完全一致。

storeToRefs方法

请注意,store 是一个用 reactive 包装的对象,这意味着不需要在 getters 后面写 .value。就像 setup 中的 props 一样,我们不能对它进行解构

使用前需要从pinia中导入,可以解构且不会使数据丢失响应式。

javascript 复制代码
<script setup>
import { storeToRefs } from 'pinia'
const store = useCounterStore()
// `name` 和 `doubleCount` 都是响应式引用
// 下面的代码同样会提取那些来自插件的属性的响应式引用
// 但是会跳过所有的 action 或者非响应式(非 ref 或者 非 reactive)的属性
const { name, doubleCount } = storeToRefs(store)
// 名为 increment 的 action 可以被解构
const { increment } = store
</script>

为了从 store 中提取属性时保持其响应性,你需要使用 storeToRefs()。它将为每一个响应式属性创建引用。当你只使用 store 的状态而不调用任何 action 时,它会非常有用。请注意,你可以直接从 store 中解构 action,因为它们也被绑定到 store 上:

javascript 复制代码
<script setup>
import { storeToRefs } from 'pinia'
const store = useCounterStore()
// `name` 和 `doubleCount` 都是响应式引用
// 下面的代码同样会提取那些来自插件的属性的响应式引用
// 但是会跳过所有的 action 或者非响应式(非 ref 或者 非 reactive)的属性
const { name, doubleCount } = storeToRefs(store)
// 名为 increment 的 action 可以被解构
const { increment } = store
</script>
数据持久化

官网:https://prazdevs.github.io/pinia-plugin-persistedstate/zh/

1、安装依赖

npm i pinia-plugin-persistedstate

2、将插件添加到 pinia 实例中

javascript 复制代码
import { createPinia } from 'pinia'
import piniaPluginPersistedstate from 'pinia-plugin-persistedstate'

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

用法:

在声明store时,将新persist选项设置为 true

javascript 复制代码
// 组合式
import { defineStore } from 'pinia'
import { ref } from 'vue'

export const useStore = defineStore(
  'main',
  () => {
    const someState = ref('hello pinia')
    return { someState }
  },
  {
    persist: true,
  },
)
相关推荐
前端不太难2 小时前
RN + TypeScript 项目越写越乱?如何规范架构?
前端·javascript·typescript
神算大模型APi--天枢6462 小时前
全栈自主可控:国产算力平台重塑大模型后端开发与部署生态
大数据·前端·人工智能·架构·硬件架构
苏打水com2 小时前
第十五篇:Day43-45 前端性能优化进阶——从“可用”到“极致”(对标职场“高并发场景优化”需求)
前端·css·vue·html·js
JS_GGbond2 小时前
用美食来理解JavaScript面向对象编程
开发语言·javascript·美食
@大迁世界2 小时前
08.CSS if() 函数
前端·css
Moment2 小时前
小米不仅造车,还造模型?309B参数全开源,深度思考完胜DeepSeek 🐒🐒🐒
前端·人工智能·后端
苏打水com2 小时前
第十六篇:Day46-48 前端安全进阶——从“漏洞防范”到“安全体系”(对标职场“攻防实战”需求)
前端·javascript·css·vue.js·html
5C242 小时前
从思想到实践:前端工程化体系与 Webpack 构建架构深度解析
前端·前端工程化
咕噜企业分发小米2 小时前
如何平衡服务器内存使用率和系统稳定性?
java·服务器·前端