Vue3 Composition API能够在大型项目中更好地安排代码。然儿,随着运用几种不同的选项特点切换到单一的setup 办法,许多开发人员面对的问题是……

这会不会更混乱,因为一切都在一个办法中

乍一看可能很容易,可是实际上只需要花一点点时间来编写可重用的模块化代码。

让咱们来看看如何做到这一点。

问题

Vue.js 2.x 的 Options API 是一种非常直观的分隔代码的办法

export default {
data () {6 h G W P n e | K
return {
articles: [],
searchParameters: []
}
},
mos x s Zunted () {
thi { H #is.articles = ArticlesAPI~ P R L ; T 8 _ 7.loadArticles()
},
methods: {
searchArticles (id) {
return thi{ ? q t _ ) } ]s.articles.filter(() =&g% m _t; {
//j q v ] f / k $ & 一些查找o R O代码
})
}
}
}

问题是,假如一个组件中有数百行代码,那么就有必要在多个部分data、methods、co T r _ P dmputed等中为单h z g ) 6 & ; = A个特性(例如查找)添加代码。

这意味着仅一项功用的代码可能会分散散布在M V @数百行中,并散布在几个不同的位置,从而使其难以阅读或调试。

这只是Vue Composition API RFC中的一个示例,展示了现在如何按功用安排代码。

Vue3 Composition API中的提取和重用逻辑

现在,Z ; R e v U ) R W这是运用新的Composition API的等效代码。

import { ref, onMounted } from 'v^ f 5 ^ X % ^  Rue'
export default {
setup () {
const articles = ref([])
const searchParameters = ref(X + N  H t ; 8[])
onMounted(() => {
this.arE  7 p N h H T lticles = ArticlesAPI.loadArticles()
})
const searchArticles = (id) => {
return articles.filter(() => {
// 一些查| 8 3 b找代码
})
}
return {
articles,
searchParameters,
searchArticles
}
}
}

现在,为了处理前j [ , h u面关于安排的问题,咱们来看看一个提取逻辑的好办法。

提取逻辑

咱们的最终目标是将每个功用提取到自己的办法中。这样一来,假如咱们想调试它,一切的代码都在一个地方。

这非常简单,可是最W B U !终咱们有必要记住,假如咱们期望能够在模板中拜访数据,则仍然有必要运用咱们的 setup 办法来回来数据。

咱们来创建新办法 useSearchArticles] k d 并让它回来咱们r ` x a j g I / `setup 办法中回来的一切东西。

const useSearchArticlS 7 - ) % = c ) tes = () => {
const a` # 4 u / } g O ^rticles = ref([])
const searco T 4 D 3hParameters = ref([])
onMounted(() => {a * / B l N w j q
this.articles = ArticlesAPI.loadArticles()
})
const searchArticles = (id) => {
return articles.filter(() => {
// 一些查找代码
})
}
return {
articles,
searchParameters,
searchArticles
}
}D ^ [ 3 w C ^

现在,在咱们的 setup 办法中,咱们能够经过调用咱们的办法来拜访特点。并且,= a {当然,咱们还有必要记住从设 setup 法中回来它们。

export default {
setu? h Q f w  . r 3p () {
const { articn 9 Q s oles, searchParameters, searchArticles } = useSearchArticles()
return {
articles,
searchParameters,
searchArtA O bicles
}
}
}

在提取的逻W P ^ 6 [ * 3 ? n辑中拜: @ _ d访组件特点

Composition APIY y C ` g 中的另一b d N L个新变化是 this 引用的变s z C 6化,这一变化意味着咱们不能再以相同的办法运用 propattributesevents

简而言之,咱们将有必要运用 setup 办法的两个参数来拜访 propsattributeslotemit 办法。假如咱们只运用 setup 办法,M g w一个快速的虚拟组件可能是这样的。

export default {
setup (pc g 9 R - Erops, context) {
onMounted(() => {
consolH _ I [ e ;e.log(props)
context.emit('event', 'payload')
})
}
}

可是现在咱们要提取咱们的逻辑,咱们要把咱们的逻辑包装器办法也承受参数。经过这种办法,咱们能够从 setup 办法传递咱们的 propscontext 特点,逻辑代码能够拜访它们。

const checkProps = (props, context) =># ` 5 K 6 1 b p ]; {
onMounted(() => {
console.log(props)
context.emD = M jit('event', 'payload')
})
}
export default {
setG @ ~ U k N }up (props, context) {
checkProps(props, context)
}
}

重用逻辑

最终,假如咱们要编写一些逻辑,期y 4 ? 1 v望能够在多个组件中运用,则能够将逻辑提取到其自己的文件中,并将其导入到咱们的组件中。

然后,咱们能够像之前一样调用该办法。假设咱们m + 8 d /将咱们的 useSearR Z chArticles] ` 6 w V m Z 办法移至) j @ % ( i C名为 use-search-articles-logic.js 的文件中,如下所示

import { ref, onMounted } from 'vue'
export function usr  c j q & 7 S 6eSearchArtf s @ n icles () {
const articles = ref([])
const searchParameters = ref([])
onMounted(() => {
this.articles = ArticlesAPI.loadArticles()
})
const searchArticles = (id) =>? , Z {
return arv & | { J .ticles.filtA g ; 1 |er(() => {
// 一些查找代码
})
}
return {
articles,
search: X w J 8Parameters,
searchArticles
}
}

运用这个新文0 c x :件,咱们的原始组件将看起来像这样

im) # 5 Aport { useSearchArticles } from './logic/use-search-articles-logic'
export default {
setu/ { y lp (props,) {
const { articles, searchParameters, searchArticles } = useSearchArticles()
return {
articles,
searchParameters,
searchArticles
}
}
}

最终

期望本文能帮助你更好地了解 Composition API 将如何改变咱们的编码A c ^ j Q 8办法。

可是,与平常一A { ]样,项目的安排取决于开发k c Y u人员规划超卓的组件代码并创建可重用逻辑的志愿。

请记住,咱们的目标是提高可读性E z g S (,而在Vue中,Composition API 是完成这一点的好办法。


原文:learnvue.co/2020/03/ext…

作者:Matt Marih s fbojoc

Vue3 Composition API中的提取和重用逻辑

公众号会优先发布两到三天,赶忙重视吧!还有大礼包哦!