当前位置: 首页 > news >正文

从vue2过渡到vue3

1. 响应式基础

1.1 基础语法

  1. ref()
import { ref } from 'vue'

// 基本类型
const count = ref(0)
// 对象类型
const obj = ref({ name: 'Vue' })

// 访问/修改
console.log(count.value) // 0
count.value++
  1. reactive()
import { reactive } from 'vue'

// 只能处理对象类型
const state = reactive({
  count: 0,
  user: { name: 'John' }
})

// 访问/修改
console.log(state.count) // 0
state.count++

1.2 特性

特性ref()reactive()
适用类型所有类型仅对象/数组
访问方式需要 .value直接访问属性
模板自动解包自动解包(无需 .value直接使用属性名
TypeScript 支持更好的类型推断复杂对象类型需要明确类型定义
响应式保持始终保持引用替换整个对象会丢失响应式

1.3 典型使用场景

1. ref() 更适合:
  • 基本类型数据(string/number/boolean)
  • 需要保持引用的响应式对象
  • 需要传递到组件外部的响应式值
  • 需要直接替换整个对象时
2. reactive() 更适合:
  • 复杂对象结构(嵌套对象/数组)
  • 局部状态管理(不需要暴露到组件外)
  • 需要直接操作属性的对象
  • 需要自动深度响应式的场景

2. 注册

2.1 全局注册

全局注册可以在当前Vue应用全局可用

// src/plugins/myPlugin.js
import MyComponentA from '../components/MyComponentA.vue';
import MyComponentB from '../components/MyComponentB.vue';

export const MyPlugin = {
  install(app, options = {}) {
    // 全局注册组件
    app.component('MyComponentA', MyComponentA);
    app.component('MyComponentB', MyComponentB);

    // 根据选项自定义行为
    if (options.customDirective !== false) {
      app.directive('focus', {
        mounted(el) {
          el.focus();
        }
      });
    }

    // 可以添加更多基于选项的功能
  }
}
// src/main.js
import { createApp } from 'vue';
import App from './App.vue';
import MyPlugin from './plugins/myPlugin';

const app = createApp(App);

// 使用插件并传入配置项
app.use(MyPlugin);

app.mount('#app');

2.2 局部注册

局部注册的组件需要在使用它的父组件中显式导入,并且只能在该父组件中使用。它的优点是使组件之间的依赖关系更加明确,并且对 tree-shaking 更加友好。

<script setup>
import ComponentA from './ComponentA.vue'
</script>

<template>
  <component-a />
</template>

3. props

3.1 语法

使用defineProps宏函数声明

<script setup>
const props = defineProps({
 title: String,
 likes: Number
})

console.log(props.foo)
</script>

3.2 命名格式

在setup中推荐 camelCase。

<script setup>
const props = defineProps({
  greetingMessage: String
})
</script>

在模板中推荐使用kebab-case。

<template>
	<MyComponent :greeting-message />
</template>

3.3 props校验

defineProps({
	title: {
		type: String,
		default: '',
	},
  likes: {
		type: Number,
		required: true
	},
	interest: {
		type: Object,
		default: () => {}
	}
})

4. emit

4.1 语法

<script setup>
const emit = defineEmit(['submit', 'login'])
const submit = () => {
  emit('submit', 'hello')
}
</script>

5. pinia

5.1 安装pinia

pnpm install pinia

创建pinia实例,并且使用

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

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

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

5.2 定义store

在setup下的store

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

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

  return { count, doubleCount, increment }
})

useCounterStore是在其他组件引用的的名字

import { useCountStore } from '@/store/count.js'

useCounterStore这个返回函数的名称是通常是use开头Store结尾。

counter是这个仓库的唯一Id,Pinia 将用它来连接 store 和 devtools。

  • ref() 就是 state 属性
    const count = ref(0),count就是这个仓库存的数据
  • computed() 就是 getters
    就是计算属性,只完成计算逻辑
  • function() 就是 actions
    在这里完成同步或者异步的逻辑书写

5.3 使用store

5.3.1 直接使用

在setup中,可以直接使用

<script setup>
import { useCounterStore } from '@/stores/counter'
// 可以在组件中的任意位置访问 `countStore` 变量 ✨
const countStore = useCounterStore()
const addCount = computed(()=> countStore.doubleCount)
</script>

5.3.2 从Store解构

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

<script setup>
import { storeToRefs } from 'pinia'
const store = useCounterStore()
// `name` 和 `doubleCount` 是响应式的 ref
// 同时通过插件添加的属性也会被提取为 ref
// 并且会跳过所有的 action 或非响应式 (不是 ref 或 reactive) 的属性
const { name, doubleCount } = storeToRefs(store)
// 作为 action 的 increment 可以直接解构
const { increment } = store
</script>

相关文章:

  • 2025年成都市双流区农业科技试验示范基地建设方案申报条件材料和补贴程序、时间安排
  • CTF类题目复现总结-[MRCTF2020]不眠之夜 1
  • CMake 构建的Qt 项目中的构建套件的配置
  • OpenCV图像拼接(4)构建图像的拉普拉斯金字塔 (Laplacian Pyramid)
  • 【蓝桥杯】单片机设计与开发,中断系统,外部中断(下)
  • 【Linux加餐-验证UDP:TCP】-windows作为client访问Linux
  • UDP视频传输中的丢包和播放花屏处理方法
  • 11:00开始面试,11:08就出来了,问的问题有点变态。。。
  • SpringBoot集成腾讯云OCR实现身份证识别
  • 企业网站源码HTML成品网站与网页代码模板指南
  • SpringBoot报错解决方案
  • win11+ubuntu双系统安装
  • selenium实现自动登录项目(5)
  • 自定义协议的网络计算器项目
  • 北斗导航 | 改进奇偶矢量法的接收机自主完好性监测算法原理,公式,应用,RAIM算法研究综述,matlab代码
  • element-plus中,Tour 漫游式引导组件的使用
  • 小程序中过滤苹果设备中的表情(即 emoji)
  • UniApp和微信小程序中v-switch夜间模式动画开关
  • Flutter环境配置
  • seatunnel配置mysql2hive
  • 昆明哪些做网站建设的公司/长尾关键词查询
  • 网站建设和网络推广是干嘛/企业网站优化服务
  • 无网站做cpa推广/公司推广渠道有哪些
  • 政府网站建设的论文/简述seo的概念
  • 广州市城市建设网站/武汉今日头条最新消息
  • 团购网站单页模板/卢松松外链工具