- A+
在上一篇实战演练中,已经将项目搭建好,并介绍了 Router、Vuex 的基本用法
接下来会以一个 Todo List 项目来介绍实战中如何使用 Composition API
一、输入框与列表(按键别名 + computed 类型声明 )
首先是输入框,由于需要支持回车键提交,所以需要监听 keydown 事件
如果是传统的按键处理,需要在事件对象中根据 keyCode 来判断按键
Vue 提供了一些常用的按键修饰符,不用在事件处理函数中再做判断
比如这里就使用了 enter 修饰符,直接监听 enter 键的 keydown 事件
列表部分,需要判断当前列表是否为空,如果为空则展示空状态
这里使用了 v-if 和 v-else 来做条件判断,而其判断条件 showList 是一个计算属性 computed
在 TypeScript 的项目中,如果像 JS 项目一样添加计算属性,无法进行类型推断
需要加上类型声明:
// 在 setup() 中通过 computed() 注册的计算属性不需要声明类型
二、添加、删除条目(在 setup 中使用 vuex)
创建的条目需要保存到 store 中,首先需要定义条目类型
然后在 state 中新增 todoList 字段,用于保存列表
这里还添加了一个 todoListMap 字段,是 todoList 的字典项,后面查找条目的时候会用到
同时在 mutations 中新增添加和删除方法
Store 已经调整好了,接下来只要在组件中调用即可
可以像之前介绍的那样,使用 mapState 和 mapMutations 来导出对应的字段和方法
不过如果想在 setup 中使用 vuex,就需要用到 vuex 4 提供的 useStore 方法
import { useStore } from 'vuex'; export default { //... setup() { const store = useStore(); console.log('store--->', store); return { ...store.state } } }
从截图可以看到,useStore() 的返回值其实就是 $store
接下来的事情就简单了,手动导出需要用到的 state 和 mutations、actions 即可
这种方式导出 state 还行,但对于 mutation 和 action,需要一个一个手动创建函数并导出,就比较笨重
没关系,我们还有 mapMutations 和 mapActions 可以使用
但需要注意,不要在 setup 使用 mapState!
因为 mapState 导出 state 是一个函数(computed),这个函数内部使用了 this.$store
而 setup 中 this 是一个空值,所以在 setup 中使用 mapState 会报错
如果确实希望以 mapState 的形式在 setup 中导出 state,可以看一下 vuex-composition-helpers
import { useState, useActions } from 'vuex-composition-helpers'; export default { props: { articleId: String }, setup(props) { const { fetch } = useActions(['fetch']); const { article, comments } = useState(['article', 'comments']); fetch(props.articleId); // dispatch the "fetch" action return { // both are computed compositions for to the store article, comments } } }
三、查看条目详情(在 setup 中使用 router)
在条目详情页,可以在 url 上携带条目 id,然后通过 id 在 store 中找到对应的数据
这就需要调整路由配置文件 src/router/index.ts,配置 vue-router 中的动态路由
路由配置好了,接下来需要在列表上添加“查看详情”按钮的处理函数
如果这个函数写在 methods 里面,可以直接通过 this.$router.push() 来跳转页面
但是在 setup 中,就需要用到 vue-router 提供的 useRouter
import { useRouter } from 'vue-router'; export default { // ... setup() { const router = useRouter(); const viewItem = (id: string) => { router.push(`/about/${id}`); }; return { viewItem }; } }
然后在详情页,通过 useRoute(注意不是 userRouter )获取 params
四、小结
Vuex 和 vue-router 都提供了可以在 setup 中获取实例的方法
这也侧面体现了 Vue 3 的 setup 是一个独立的钩子函数
它不会依赖于 Vue 组件实例,如果需要用到函数外部的变量,都需要从外部获取
同时也提醒我们在开发 Vue 3 的插件的时候,一定要提供相应的函数让开发者能在 setup 中使用