一篇文章弄懂vue3常用API

本文全面解析Vue3的常用API,包括使用vite创建项目、建立路由、引入vuex和elementPlus,深入讲解ref、reactive、生命周期钩子、计算属性、侦听器、props、Provide/inject传值、slots和attrs,以及Vue3响应式核心、pinia状态管理和更多进阶技巧。适合Vue3初学者和开发者深入学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、使用vite创建项目

npm init @vitejs/app vue3-vite-demo
//或
npm init vue@latest

2、建立路由router

打开文件,建立router路由文件,建立index.js文件
在这里插入图片描述

import {
    createRouter, createWebHashHistory } from "vue-router";
import globalRoutes from "./globalRoutes";
import mainRoutes from "./mainRoutes";

const router = createRouter({
   
  history: createWebHashHistory(),
  scrollBehavior: () => ({
    y: 0 }),
  isAddDynamicMenuRoutes: false, // 是否已经添加动态(菜单)路由
  routes: globalRoutes.concat(mainRoutes),
});
export default router;

安装路由命令

npm install vue-router@4
/或
npm install vuex@next --save

运行项目可能出现报错,是因为安装的vue-router版本是3及以下。要安装v4版本还有createRouter等Api。如果安装了还是有报错,关闭项目,重启服务器即可。
在这里插入图片描述
路由建立好了之后在main.js里引用
在这里插入图片描述
这时候路由引用完毕。

路由跳转

在这里插入图片描述
接受路由参数query或params
在这里插入图片描述

import {
    useRouter } from "vue-router";
const router = useRouter();
router.push({
    name: "" });

另开一个页面的路由跳转方式

  const {
    href } = router.resolve({
   
      name: "softwares",
      query: {
    basicInfoId: row.basicInfoId },
    });
    window.open(href, "_blank");

修改Vite的配置文件,支持alias别名@(路径名指定@为src)
在这里插入图片描述

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

// https://vitejs.dev/config/
export default defineConfig({
   
  resolve: {
   
    alias: {
   
      '@': path.resolve(__dirname, 'src'),
    }
  },
  plugins: [vue()]
})

3、引入vuex

安装vuex

npm install vuex@next --save

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

在这里插入图片描述

import {
    createStore } from 'vuex'

export default createStore({
   
  state: {
   
    name: ''
  },
  mutations: {
   
    name: (state, newValue) => {
   
      state.name = newValue
    }
  },
  actions: {
   
    setName: (ctx, value) => {
   
      console.log(ctx);
      console.log(value);
      ctx.commit('name', value)
    }
  }
})

页面中使用
在这里插入图片描述
使用模块化vuex
src\store\index.js建立模块化
在这里插入图片描述
建立common模块
在这里插入图片描述
全局通用模块,可要可不要
在这里插入图片描述
页面中使用
在这里插入图片描述

4、引入elementPlus

npm install element-plus --save

完整引入和按需引入参照官网https://element-plus.gitee.io/zh-CN/guide/quickstart.html

在这里插入图片描述

6、ref,reactive

reactive 和 ref 都是用来定义响应式数据的, reactive更推荐去定义复杂的数据类型, ref 更推荐定义基本类型

ref 和 reactive 本质我们可以简单的理解为ref是对reactive的二次包装, ref定义的数据访问的时候要多一个.value
在这里插入图片描述

7、生命周期钩子

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

8、计算属性computed

在这里插入图片描述
还可以在reactive中直接使用

const data=reactive({
   
		name:"zhangyi",
		username:computed(()=>{
   
			return data.name.slice(1,2)
		})
	})

9、侦听器watch

监听reactive响应式数据中的某个属性,要将箭头函数写成函数return的方式才有效。
在这里插入图片描述

如果监视的是reactive定义的响应式数据,则无法正确获得oldValue!!!
在这里插入图片描述
watch 和 watchEffect 都是侦听器,但是写法和使用上有一些区别。
watch:

1.具有一定的惰性lazy 第一次页面展示的时候不会执行,只有数据变化的时候才会执行
2.参数可以拿到当前值和原始值
3.可以侦听多个数据的变化,用一个侦听起承载

watchEffect :

没有过多的参数 只有一个回调函数
1.立即执行,没有惰性,页面的首次加载就会执行。
2.自动检测内部代码,代码中有依赖 便会执行
3.不需要传递要侦听的内容 会自动感知代码依赖,不需要传递很多参数,只要传递一个回调函数
4.不能获取之前数据的值 只能获取当前值
5.一些=异步的操作放在这里会更加合适

监听对象p中的name属性
在这里插入图片描述
监听器对象形式写法

watch:{
   
	obj:{
   
		handle(newVal,oldVal){
   
			console.log(newVal,oldVal)
		},
		immediate:true,
		deep:true
	}
}

10、父子传值props

a、父传子

父组件
在这里插入图片描述
子组件
在这里插入图片描述

b、子传父

子组件
在这里插入图片描述
父组件
在这里插入图片描述
vue2中sync写法在vue3中的使用。(父子组件传值响应式,即子组件发生改变,父组件同步改变)

父组件
必须使用v-model形式传值给子组件
在这里插入图片描述
子组件
先通过defineProps接受传递过来的name,然后通过defineEmits和update:name使用父子数据双向绑定
在这里插入图片描述
注:上方写错了。const emit = defineEmits([“name”])修改为上方const emit = defineEmits([“update:name”])

11、Provide/inject传值(不限层级)

Provide/inject用于不限层级的传值,父组件中Provide参数,子或孙组件都可通过inject拿到参数值。
父组件
在这里插入图片描述
子组件
在这里插入图片描述

12、slots 和 attrs

可以通过useContext从上下文中获取 slots 和 attrs。不过提案在正式通过后,废除了这个语法,被拆分成了useAttrs和useSlots。示例:

// 旧
<script setup>
  import {
    useContext } from 'vue'
 
  const {
    slots, attrs } = useContext()
</script>
 
// 新
<script setup>
  import {
    useAttrs, useSlots } from 'vue'
  
  const slots = useSlots();
  const attrs = useAttrs();
  console.log(attrs); // 查看父组件传来的自定义属性
</script>

attrs

父组件的标签可以加各种"属性",能和props对应上的就变成了子组件的props,对应不上的就都是attrs,不限于函数,各种类型都行。
在这里插入图片描述
在这里插入图片描述
如果没有声明defineProps接收父传递过来的属性,则由useAttrs接收。如果声明了defineProps接收,则useAttrs为空。
console.log(attrs)打印如下
在这里插入图片描述

13、defineExpose(对外暴露属性)

子组件使用defineExpose对外暴露属性
在这里插入图片描述
父组件可接受到子组件暴露出来的属性
在这里插入图片描述

14、toRef和toRefs

toRef 是将某个对象中的某个值转化为响应式数据,其接收两个参数,第一个参数为 obj 对象;第二个参数为对象中的属性名。
在这里插入图片描述
区别:
ref 是对传入数据的拷贝;toRef 是对传入数据的引用
ref 的值改变会更新视图;toRef 的值改变不会更新视图

toRefs作用就是将传入的对象里所有的属性的值都转化为响应式数据对象,该函数支持一个参数,即 obj 对象。
在这里插入图片描述

// 这样解构出来的所有属性都是有响应式的
const {
    name, age } = toRefs(data)

15、shallowReactive、shallowRef和triggerRef

shallowReactive这是一个浅层的 reactive,原本的 reactive 是深层的,shallowReactive这是一个用于性能优化的API。优化reactive

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蛋蛋的老公

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值