Vue3--->组合式API与Pinia

目录

使用create-vue搭建

1、使用create-vue创建项目

2、项目目录和关键文件 

组合式API

1、组合式API - setup选项

2、组合式API - reactive和ref函数

3、组合式API - computed

4、组合式API - watch

1、基础使用 - 侦听单个数据

2、基础使用 - 侦听多个数据

3、immediate(立即执行)

4、deep(深度侦听)

5、精确侦听对象的某个属性

5、组合式API - 生命周期函数

6、组合式API - 父子通信

7、组合式API - 模版引用

8、组合式API - provide和inject

Pinia快速入门

1、什么是Pinia

2、添加Pinia到Vue项目

3、getters实现

4、action如何实现异步


使用create-vue搭建

create-vue是Vue官方新的脚手架工具,底层切换到了 vite(下一代前端工具链,为开发提供极速响应

1、使用create-vue创建项目

1. 前提环境条件
已安装 16.0 或更高版本的 Node.js
2. 创建一个Vue应用
npm init vue@latest
这一指令将会安装并执行 create-vue
Vue3--->组合式API与Pinia_第1张图片

2、项目目录和关键文件 

关键文件:
  1. vite.config.js - 项目的配置文件 基于vite的配置
  2. package.json - 项目包文件 核心依赖项变成了 Vue3.x 和 vite
  3. main.js - 入口文件 createApp函数创建应用实例
  4. index.html - 单页入口 提供id为app的挂载点
  5. app.vue - 根组件 SFC单文件组件 script - template - style
  • 变化一:脚本script和模板template顺序调整
  • 变化二:模板template不再要求唯一根元素
  • 变化三:脚本script添加setup标识支持组合式API

组合式API

1、组合式API - setup选项

ref()
作用: 接收 简单类型或者对象类型的数据 传入 并返回一个 响应式的对象
核心步骤:
总结:
1. reactive和ref函数的共同作用是什么 ?
用函数调用的方式生成响应式数据
2. reactive vs ref ?
1. reactive不能处理简单类型的数据
2. ref参数类型支持更好但是必须通过.value访问修改
3. ref函数的内部实现依赖于reactive函数
3. 在实际工作中推荐使用哪个?
推荐使用ref函数,更加灵活,小兔鲜项目主用ref

3、组合式API - computed

计算属性基本思想和Vue2的完全一致,组合式API下的计算属性只是修改了写法

核心步骤:
1. 导入 computed函数
2. 执行函数 在回调参数中 return基于响应式数据做计算的值 ,用 变量接收

4、组合式API - watch

作用: 侦听 一个或者多个数据 的变化,数据变化时执行回调函数
俩个额外参数:1. immediate(立即执行) 2. deep(深度侦听)

1、基础使用 - 侦听单个数据

1. 导入watch 函数
2. 执行watch函数 传入要侦听的响应式数据 (ref对象) 和回调函数

2、基础使用 - 侦听多个数据

说明:同时侦听多个响应式数据的变化, 不管哪个数据变化都需要执行回调

3、immediate(立即执行)

说明:在侦听器创建时 立即触发回调, 响应式数据变化之后继续执行回调

4、deep(深度侦听)

默认机制:通过watch监听的ref对象默认是 浅层侦听的,直接修改嵌套的对象属性不会触发回调执行 ,需要开启deep 选项

5、精确侦听对象的某个属性

把第一个参数写成函数的写法,返回要监听的具体属性

const info = ref({
name: 'zs',
age: 18
})
const changeAge = () =>{
 info.value.age = 20
}
watch(
() => info.value.age,
() => {
consle.log('age发生了变化')
)

总结:

1. 作为watch函数的第一个参数,ref对象需要添加.value吗?
不需要,watch会自动读取
2. watch只能侦听单个数据吗?
单个或者多个
3. 不开启deep,直接修改嵌套属性能触发回调吗?
不能,默认是浅层侦听
4. 不开启deep,想在某个层次比较深的属性变化时执行回调怎么做?
可以把第一个参数写成函数的写法,返回要监听的具体属性

5、组合式API - 生命周期函数

Vue3--->组合式API与Pinia_第2张图片

 生命周期函数基本使用

1. 导入生命周期函数
2. 执行生命周期函数 传入回调
执行多次
生命周期函数是可以执行多次的,多次执行时传入的回调会在 时机成熟时依次执行

总结:

1. 组合式API中生命周期函数的格式是什么?
on + 生命周期名字
2. 组合式API中可以使用onCreated吗?
没有这个钩子函数,直接写到setup中
3. 组合式API中组件卸载完毕时执行哪个函数?
onUnmounted

6、组合式API - 父子通信

组合式API下的父传子

基本思想
1. 父组件中给 子组件绑定属性
2. 子组件内部通过 props选项接收
Vue3--->组合式API与Pinia_第3张图片

 

组合式API下的子传父
基本思想
1. 父组件中给 子组件标签通过@绑定事件
2. 子组件内部通过 $emit 方法触发事件
Vue3--->组合式API与Pinia_第4张图片

 

总结:

父传子
1. 父传子的过程中通过什么方式接收props?
defineProps( { 属性名:类型 } )
2. setup语法糖中如何使用父组件传过来的数据?
const props = defineProps( { 属性名:类型 } )
子传父
1. 子传父的过程中通过什么方式得到emit方法?
defineEmits( [‘事件名称’] )

7、组合式API - 模版引用

模板引用的概念
通过 ref标识 获取真实的 dom对象或者组件实例对象
如何使用(以获取dom为例 组件同理)
1. 调用ref函数生成一个ref对象
2. 通过ref标识绑定ref对象到标签

 

3、getters实现

Pinia中的 getters 直接使用 computed函数 进行模拟
export const useCounterStore = defineStore('counter', () => {
  const count = ref(0)
  function increment() {
    count.value++
  }
//定义getters 
 const getCount = computed(()=> count.value * 2)

  return { count, increment ,getCount}
})

 

4、action如何实现异步

action中实现异步和组件中定义数据和方法的风格完全一致

1- store中定义action

const API_URL = 'http://geek.itheima.net/v1_0/channels'

export const useCounterStore = defineStore('counter', ()=>{
  // 数据
  const list = ref([])
  // 异步action
  const loadList = async ()=>{
    const res = await axios.get(API_URL)
    list.value = res.data.data.channels
  }
  
  return {
    list,
    loadList
  }
})

2- 组件中调用action



 

storeToRefs
使用storeToRefs函数可以辅助保持数据(state + getter)的响应式解构
直接基于store进行解构赋值,响应式数据(state和getter)会丢失响应式特性,使用storeToRefs辅助保持响应式
import { storeToRefs } from 'pinia'
const counterStore = useCounterStore()
  // 使用它storeToRefs包裹之后解构保持响应式
  const { count } = storeToRefs(counterStore)

 Vue官方的 dev-tools 调试工具 对 Pinia直接支持,可以直接进行调试

总结:

1. Pinia是用来做什么的?
集中状态管理工具,新一代的vuex
2. Pinia中还需要mutation吗?
不需要,action既支持同步也支持异步
3. Pinia如何实现getter?
computed计算属性函数
4. Pinia产生的Store如何解构赋值数据保持响应式?
storeToRefs

你可能感兴趣的:(vue3,前端,vue.js,javascript)