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


Posted in Javascript onApril 29, 2020

Vue3 Composition API可以在大型项目中更好地组织代码。然儿,随着使用几种不同的选项属性切换到单一的setup 方法,许多开发人员面临的问题是……

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

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

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

问题

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

export default {
 data () {
  return {
   articles: [],
   searchParameters: []
  }
 },
 mounted () {
  this.articles = ArticlesAPI.loadArticles()
 },
 methods: {
  searchArticles (id) {
   return this.articles.filter(() => {
    // 一些搜索代码
   })
  }
 }
}

问题是,如果一个组件中有数百行代码,那么就必须在多个部分data、methods、computed等中为单个特性(例如搜索)添加代码。

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

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

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

现在,这是使用新的Composition API的等效代码。

import { ref, onMounted } from 'vue'

export default {
 setup () {
  const articles = ref([])
  const searchParameters = ref([])

  onMounted(() => {
   this.articles = ArticlesAPI.loadArticles()
  })

  const searchArticles = (id) => {
   return articles.filter(() => {
    // 一些搜索代码
   })
  }

  return {
   articles,
   searchParameters,
   searchArticles
  }
 }
}

现在,为了解决前面关于组织的问题,我们来看看一个提取逻辑的好方法。

提取逻辑

我们的最终目标是将每个功能提取到自己的方法中。这样一来,如果我们想调试它,所有的代码都在一个地方。

这非常简单,但是最后我们必须记住,如果我们希望能够在模板中访问数据,则仍然必须使用我们的 setup 方法来返回数据。

我们来创建新方法 useSearchArticles 并让它返回我们在 setup 方法中返回的所有东西。

const useSearchArticles = () => {
 const articles = ref([])
 const searchParameters = ref([])

 onMounted(() => {
  this.articles = ArticlesAPI.loadArticles()
 })

 const searchArticles = (id) => {
  return articles.filter(() => {
   // 一些搜索代码
  })
 }

 return {
  articles,
  searchParameters,
  searchArticles
 }
}

现在,在我们的 setup 方法中,我们可以通过调用我们的方法来访问属性。而且,当然,我们还必须记住从设 setup 法中返回它们。

export default {
 setup () {
  const { articles, searchParameters, searchArticles } = useSearchArticles()

  return {
   articles,
   searchParameters,
   searchArticles
  }
 }
}

在提取的逻辑中访问组件属性

Composition API 中的另一个新变化是 this 引用的变化,这一变化意味着我们不能再以相同的方式使用 prop、attributes 或 events。

简而言之,我们将必须使用 setup 方法的两个参数来访问 props,attribute,slot 或 emit 方法。如果我们只使用 setup 方法,一个快速的虚拟组件可能是这样的。

export default {
 setup (props, context) {

  onMounted(() => {
   console.log(props)
   context.emit('event', 'payload')
  })
 }
}

但是现在我们要提取我们的逻辑,我们要把我们的逻辑包装器方法也接受参数。通过这种方式,我们可以从 setup 方法传递我们的 props 和 context 属性,逻辑代码可以访问它们。

const checkProps = (props, context) => {
 onMounted(() => {
  console.log(props)
  context.emit('event', 'payload')
 })
}
export default {
 setup (props, context) {
  checkProps(props, context)
 }
}

重用逻辑

最后,如果我们要编写一些逻辑,希望能够在多个组件中使用,则可以将逻辑提取到其自己的文件中,并将其导入到我们的组件中。

然后,我们可以像之前一样调用该方法。假设我们将我们的 useSearchArticles 方法移至名为 use-search-articles-logic.js 的文件中,如下所示

import { ref, onMounted } from 'vue'
export function useSearchArticles () {
 const articles = ref([])
 const searchParameters = ref([])

 onMounted(() => {
  this.articles = ArticlesAPI.loadArticles()
 })

 const searchArticles = (id) => {
  return articles.filter(() => {
   // 一些搜索代码
  })
 }

 return {
  articles,
  searchParameters,
  searchArticles
 }
}

使用这个新文件,我们的原始组件将看起来像这样

import { useSearchArticles } from './logic/use-search-articles-logic'
export default {
 setup (props,) {
  const { articles, searchParameters, searchArticles } = useSearchArticles()

  return {
   articles,
   searchParameters,
   searchArticles
  }
 }
}

最后

希望本文能帮助你更好地了解 Composition API 将如何改变我们的编码方式。

但是,与往常一样,项目的组织取决于开发人员设计出色的组件代码并创建可重用逻辑的意愿。

请记住,我们的目标是提高可读性,而在Vue中,Composition API 是实现这一点的好方法。

到此这篇关于详解Vue3 Composition API中的提取和重用逻辑的文章就介绍到这了,更多相关Vue3 Composition提取和重用内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木! 

Javascript 相关文章推荐
ext form 表单提交数据的方法小结
Aug 08 Javascript
dojo学习第二天 ajax异步请求之绑定列表
Aug 29 Javascript
JavaScript插入动态样式实现代码
Feb 22 Javascript
Jquery使用val方法读写value值
May 18 Javascript
Bootstrap基本组件学习笔记之按钮组(8)
Dec 07 Javascript
原生js二级联动效果
Jun 20 Javascript
backbone简介_动力节点Java学院整理
Jul 14 Javascript
vue+mock.js实现前后端分离
Jul 24 Javascript
浅谈Three.js截图并下载的大坑
Nov 01 Javascript
Vue设置长时间未操作登录自动到期返回登录页
Jan 22 Javascript
VSCode搭建React Native环境
May 07 Javascript
基于aotu.js实现微信自动添加通讯录中的联系人功能
May 28 Javascript
浅谈Vue3 Composition API如何替换Vue Mixins
Apr 29 #Javascript
JS数组Reduce方法功能与用法实例详解
Apr 29 #Javascript
JavaScript实现放大镜效果代码示例
Apr 29 #Javascript
React组件设计模式之组合组件应用实例分析
Apr 29 #Javascript
Vue + Node.js + MongoDB图片上传组件实现图片预览和删除功能详解
Apr 29 #Javascript
JS数组push、unshift、pop、shift方法的实现与使用方法示例
Apr 29 #Javascript
JS实现手写 forEach算法示例
Apr 29 #Javascript
You might like
php使用curl存储cookie的示例
2014/03/31 PHP
php字符比较函数similar_text、strnatcmp与strcasecmp用法分析
2014/11/18 PHP
PHP处理大量表单字段的便捷方法
2015/02/07 PHP
微信利用PHP创建自定义菜单的方法
2016/08/01 PHP
windows下的WAMP环境搭建图文教程(推荐)
2017/07/27 PHP
laravel 修改记住我功能的cookie保存时间的方法
2019/10/14 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
2020/02/18 PHP
获取页面高度,窗口高度,滚动条高度等参数值getPageSize,getPageScroll
2006/09/22 Javascript
jQuery学习笔记之DOM对象和jQuery对象
2010/12/22 Javascript
JQuery+DIV自定义滚动条样式的具体实现
2013/06/25 Javascript
js实现右下角提示框的方法
2015/02/03 Javascript
简介AngularJS中使用factory和service的方法
2015/06/17 Javascript
JS实现模拟百度搜索“2012世界末日”网页地震撕裂效果代码
2015/10/31 Javascript
JS中的==运算: [''] == false —>true
2016/07/24 Javascript
JS实现鼠标滑过显示边框的菜单效果
2016/09/21 Javascript
使用jQuery操作DOM的方法小结
2017/02/27 Javascript
详解Vue路由History mode模式中页面无法渲染的原因及解决
2017/09/28 Javascript
Angularjs渲染的 using 指令的星级评分系统示例
2017/11/09 Javascript
深入理解js 中async 函数的含义和用法
2018/05/13 Javascript
JavaScript中七种流行的开源机器学习框架
2018/10/11 Javascript
webpack4手动搭建Vue开发环境实现todoList项目的方法
2019/05/16 Javascript
python图书管理系统
2020/04/05 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
2018/04/25 Python
python基于socket进行端口转发实现后门隐藏的示例
2019/07/25 Python
Python Pandas 如何shuffle(打乱)数据
2019/07/30 Python
python 消费 kafka 数据教程
2019/12/21 Python
英国HYPE双肩包官网:英国本土时尚潮牌
2018/09/26 全球购物
KELLER SPORTS荷兰:在线订购最好的运动产品
2020/10/13 全球购物
销售找工作求职信
2013/12/20 职场文书
数控技术应用个人求职信范文
2014/02/03 职场文书
环保建议书作文
2014/03/12 职场文书
施工单位安全责任书
2014/07/24 职场文书
党支部2014年度工作总结
2014/12/04 职场文书
大学毕业晚会开场白
2015/05/29 职场文书
追悼会答谢词范文
2015/09/29 职场文书
Python基础之元类详解
2021/04/29 Python