使用Hook构建解耦的Vue.js应用程序

栏目: 数据库 · 发布时间: 6年前

  • 表单提交时,业务要求对数据埋点以便作数据分析用,对于开发人员来说,实现的方式有多种:
  1. 业务代码和埋点相关的代码直接混在一起,这是最直接的实现方式,但也会带来一些问题,埋点代码分散在项目的各地方不利于维护,与业务代码混淆不利于阅读。
  2. 分离业务代码和埋点代码,保持两者的独立性,能解决方案1中的问题,但是会导致代码层面复杂些

代码实现

  • hook.js
const hooks = []

export function addHook (hook) {
  hooks.push(hook)
}

export function runHooks (context) {
  return hooks.filter(hook => hook.condition(context))
               .map(hook => hook.callback(context))
}

export function withHooks (func, context) {
  return (...args) => {
    console.log(args)
    const result = func(...args)

    if (result.then) {
      result
        .then(payload => runHooks({ ...context, payload }))
        .catch(error => runHooks({ ...context, error }))
      return result
    }

    runHooks({ ...context, payload: result })
    return result
  }
}

复制代码
  • 上面的代码可以将Hook对象添加到一个Hooks堆栈中,一旦调用runHooks()就会触发它们。每个Hook都是一个具有条件和回调的对象。仅当condition()函数返
  • tracking.js
import { addHook } from '@/utils/hooks'

const CONTACT_FORM = 'contact-form.post'

addHook({
  condition ({ error, id }) {
    return !error && id === CONTACT_FORM
  },
  callback (context) {
    // 用于数据报送、或数据分析的逻辑
    console.log('用于数据报送、或数据分析的逻辑', context)
  }
})

复制代码
  • 可以看到我们添加了一个新的Hook,只有在没有错误并且id context参数与CONTACT_FORM id匹配时才会触发。在callback()函数中,我们通常会在我们选择的跟踪服务中触发一个事件,但因为这只是一个演示,我们只需触发一个console.log()

  • 模拟后台请求 loanApply.js

export function post (data) {
  return Promise.resolve(data)
}
复制代码
  • 组件中使用
<template>
  <form @submit.prevent="submit">
    <label class="contact-form-label">
      Name
      <input v-model="data.name">
    </label>
    <label class="contact-form-label">
      Message
      <textarea v-model="data.message"/>
    </label>
    <button>Submit</button>
  </form>
</template>

<script>
  import './tracking'
  import { post } from '@/api/loanApply'
  import { withHooks } from '@/utils/hooks'

  export default {
    data () {
      return { data: { name: '', message: '' } }
    },
    methods: {
      submit () {
        withHooks(this.test, { id: 'contact-form.post' })(this.data)
      },
      async test (param) {
        const {message, name} = await post(param)
        console.log(message, name, '处理表单本身的业务逻辑')
        return param
      }
    }
  }
</script>

复制代码

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

未来医疗

未来医疗

【美】埃里克•托普 (Eric Topol) / 郑杰 / 浙江人民出版社 / 2016-5 / 69.90

在传统医学中,医生是上帝,是权威,拥有至高无上的解释权和裁决权,面对疾病,患者总是被动接受,为医命是从。而在大数据时代下,医疗领域将发生颠覆性的变化,以患者为中心的民主医疗时代即将到来。 享誉全美的医疗预言家埃里克•托普在《未来医疗》中,为我们展示了医疗领域创新的憧憬, 分析了在开放的智能时代中,无线医疗技术将从医疗服务、医患关系上颠覆自古以来的家长式医疗,实现“以患者为中心”的个体医疗革命......一起来看看 《未来医疗》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器