详解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 相关文章推荐
懒就要懒到底——鼠标自动点击(含时间判断)
Feb 20 Javascript
Js(JavaScript)中,弹出是或否的选择框示例(confirm用法的实例分析)
Jul 09 Javascript
jQuery拖动布局其结果保存到数据库
Oct 09 Javascript
基于jQuery实现带动画效果超炫酷的弹出对话框(附源码下载)
Feb 22 Javascript
AngularJS服务service用法总结
Dec 13 Javascript
jQuery实现最简单实用的分秒倒计时
Feb 05 Javascript
Angularjs过滤器实现动态搜索与排序功能示例
Dec 13 Javascript
vuex state及mapState的基础用法详解
Apr 19 Javascript
了解ESlint和其相关操作小结
May 21 Javascript
详解基于原生JS验证表单组件xy-form
Aug 20 Javascript
vue element-ui读取pdf文件的方法
Nov 26 Javascript
基于JavaScript的数据结构队列动画实现示例解析
Aug 06 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
一个用php3编写的简单计数器
2006/10/09 PHP
PHP实现伪静态方法汇总
2016/01/13 PHP
PHP让数组中有相同值的组成新的数组实例
2017/12/31 PHP
javascript 全角转换实现代码
2009/07/17 Javascript
js借助ActiveXObject实现创建文件
2013/09/29 Javascript
JS滚轮事件onmousewheel使用介绍
2013/11/01 Javascript
JQuery 给元素绑定click事件多次执行的解决方法
2014/09/09 Javascript
完美兼容各大浏览器的jQuery仿新浪图文淡入淡出间歇滚动特效
2014/11/12 Javascript
javascript实现根据iphone屏幕方向调用不同样式表的方法
2015/07/13 Javascript
js如何打印object对象
2015/10/16 Javascript
浅谈js图片前端预览之filereader和window.URL.createObjectURL
2016/06/30 Javascript
微信小程序 定义全局数据、函数复用、模版等详细介绍
2016/10/27 Javascript
JS简单封装的图片无缝滚动效果示例【测试可用】
2017/03/22 Javascript
浅谈JS函数节流防抖
2017/10/18 Javascript
基于vue实现圆形菜单栏组件
2019/07/05 Javascript
python实现人人网登录示例分享
2014/01/19 Python
Python基于smtplib实现异步发送邮件服务
2015/05/28 Python
python自带的http模块详解
2016/11/06 Python
python Matplotlib画图之调整字体大小的示例
2017/11/20 Python
浅谈Python中的私有变量
2018/02/28 Python
Python爬取爱奇艺电影信息代码实例
2019/11/26 Python
python读取dicom图像示例(SimpleITK和dicom包实现)
2020/01/16 Python
Pycharm连接远程服务器过程图解
2020/04/30 Python
教你如何一步一步用Canvas写一个贪吃蛇
2018/10/22 HTML / CSS
突袭HTML5之Javascript API扩展2—地理信息服务及地理位置API学习
2013/01/31 HTML / CSS
HTML5 video循环播放多个视频的方法步骤
2020/08/06 HTML / CSS
C++是不是类型安全的
2014/02/18 面试题
2014年小学生教师节演讲稿范文
2014/09/10 职场文书
校园主题婚礼活动策划方案
2014/09/15 职场文书
大学生自荐材料范文
2014/12/30 职场文书
毕业生就业推荐表自我评价
2015/03/02 职场文书
护士医德考评自我评价
2015/03/03 职场文书
律师催款函范文
2015/06/24 职场文书
2015年卫生局工作总结
2015/07/24 职场文书
浅谈@Value和@Bean的执行顺序问题
2021/06/16 Java/Android
国产动画《万圣街》日语配音版制作决定!
2022/03/20 国漫