派发器抽离vue2单组件中的大量逻辑技巧

 更新时间:2022年07月27日 15:01:13   作者:陌年微凉_  
这篇文章主要为大家介绍了派发器抽离vue2单组件中的大量逻辑技巧,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

概述

在vue2当中,我们写的逻辑都是options配置对象,比较固定的写法,方法,数据,都对应到各自的配置项当中,但是当一个组件的逻辑变得更加复杂,逻辑也越来越多的时候,这时候,我们一个组件避免不了要写大量的逻辑代码,在2版本中,使用官方推荐的mixin可以解决一个组件逻辑过多的问题,现在记录我在工作用用到的另外方法。

本质

在react中,我们使用redux,会接触到对应的action,reducer,dispatch等等,通过派发对应事件类型,然后触发对应逻辑修改,有点像发布订阅,哈哈,在这里,借鉴react当中使用redux的思路,记录vue2当中抽离逻辑代码的技巧。

具体实现

举例就拿最经典的toodList来举例

  • .components/ToodList/ToodList.vue
<template>
  <div>
    <input type="text" placeholder="请输入关键字" v-model="value" /><button
      @click="handleAddTood"
    >
      操作按钮
    </button>
    <tood-list-item
      v-for="item in list"
      :key="item.id"
      :item="item"
      @handleDel="handleDel"
    ></tood-list-item>
  </div>
</template>
<script>
import ToodListItem from "./ToodListItem";
export default {
  components: {
    ToodListItem,
  },
  props: {
    list: {
      type: Array,
      default() {
        return [];
      },
    },
  },
  data() {
    return {
      value: "",
    };
  },
  methods: {
    handleDel(item) {
      this.$emit("handelDel", item);
    },
    handleAddTood() {
      this.$emit("addTood", this.value);
    },
  },
};
</script>
  • .components/ToodList/ToodListItem.vue
<template>
  <div>
    <input type="checkbox" v-model="item.complated" />
    <span
      :style="{ textDecoration: item.complated ? 'line-through' : 'none' }"
      >{{ item.title }}</span
    >
    <button @click="handleDel(item)">删除</button>
  </div>
</template>
<script>
export default {
  props: {
    item: {
      type: Object,
      default() {
        return {};
      },
    },
  },
  methods: {
    handleDel(item) {
      this.$emit("handleDel", item);
    },
  },
};
</script>

.components/ToodList/hook文件下:

  • actionTypes.js
//主要定义时间触发的类型常量
export const ACTION_TYPES = {
  del: "DEL",
  add: "ADD",
};

.components/ToodList/hook文件下:

  • actionTypes.js
//派发器,通过action找到对应的事件处理逻辑,然后触发
import { addTood, removeTood } from "./toodReducer";
import { ACTION_TYPES } from "./actionTypes";
//接收参数,vue组件上下文对应
export default function (ctx) {
  function dispatch(args) {
    const { type, payLoad } = args;
    //根据行为,触发reducer中的对应逻辑
    switch (type) {
      case ACTION_TYPES.del:
        removeTood.bind(ctx)(payLoad);
        break;
      case ACTION_TYPES.add:
        addTood.bind(ctx)(payLoad);
        break;
      default:
        break;
    }
  }
  //返回绑定组件实例的函数
  return dispatch.bind(ctx);
}

.components/ToodList/hook文件下:

  • toodReducer.js
//主要事件处理逻辑文件(对应vue组件中的一个个method方法)
//添加一个tood
export function addTood(value) {
  const toodListItme = {
    title: value,
    complated: false,
    id: Date.now(),
  };
  this.list.push(toodListItme);
}
//删除一个tood
export function removeTood(item) {
  const { id } = item;
  this.list = this.list.filter((item) => item.id != id);
}
  • App.vue文件
<template>
  <div id="app">
    <tood-list
      :list="list"
      @handelDel="handelDel"
      @addTood="addTood"
    ></tood-list>
  </div>
</template>
<script>
import ToodList from "@/components/ToodList/ToodList.vue";
import dispatch from "./components/ToodList/hook/dispatch";
import { ACTION_TYPES } from "./components/ToodList/hook/actionTypes";
export default {
  name: "App",
  components: {
    ToodList,
  },
  data() {
    return {
      list: [
        {
          title: "第一项",
          complated: false,
          id: 1,
        },
        {
          title: "第二项",
          complated: false,
          id: 2,
        },
        {
          title: "第三项",
          complated: true,
          id: 3,
        },
      ],
    };
  },
  methods: {
  //逻辑代码全部抽离到外部进行处理,当前组件只需要关注视图即可
    handelDel(item) {
      dispatch(this)({
        type: ACTION_TYPES.del,
        payLoad: item,
      });
    },
    addTood(value) {
      dispatch(this)({
        type: ACTION_TYPES.add,
        payLoad: value,
      });
    },
  },
};
</script>

总结

在vue2中在一个组件中写过多代码还是很常见的,不好分离逻辑的地方就在this,因此避免一个文件逻辑过多,可以试试这种方法,在vue3更新后,移除单文件组件对this的过渡依赖,对应的compositionApi已经非常便于我们抽离单文件逻辑代码了。

以上就是派发器抽离vue2单组件中的大量逻辑技巧的详细内容,更多关于派发器vue2单组件逻辑抽离的资料请关注脚本之家其它相关文章!

相关文章

  • 解决cordova+vue 项目打包成APK应用遇到的问题

    解决cordova+vue 项目打包成APK应用遇到的问题

    这篇文章主要介绍了解决cordova+vue 项目打包成APK应用遇到的问题,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • vue.extend与vue.component的区别和联系

    vue.extend与vue.component的区别和联系

    这篇文章主要介绍了vue.extend与vue.component的区别和联系,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2018-09-09
  • 前端处理axios请求下载后端返回的文件流代码实例

    前端处理axios请求下载后端返回的文件流代码实例

    使用axios可以很方便地获取后端返回的文件流数据,并在前端直接在浏览器下载,这篇文章主要给大家介绍了关于前端处理axios请求下载后端返回的文件流的相关资料,需要的朋友可以参考下
    2024-07-07
  • 在vue.config.js中优化webpack配置的方法

    在vue.config.js中优化webpack配置的方法

    在日常开发中我们离不开打包工具webpack,但是不同的配置会影响我们项目的运行构建时间,也会影响打包之后项目包的大小,这篇文章记录一下我使用过的可以优化webpack的配置,需要的朋友可以参考下
    2024-05-05
  • 详解Vue中Axios封装API接口的思路及方法

    详解Vue中Axios封装API接口的思路及方法

    这篇文章主要介绍了详解Vue中Axios封装API接口的思路及方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • 在vue中使用echarts实现上浮与下钻效果

    在vue中使用echarts实现上浮与下钻效果

    这篇文章主要介绍了在vue中使用echarts实现上浮与下钻效果,本文分步骤给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-11-11
  • Vue3生命周期Hooks原理与调度器Scheduler关系

    Vue3生命周期Hooks原理与调度器Scheduler关系

    这篇文章主要为大家介绍了Vue3生命周期Hooks原理与调度器Scheduler关系详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Vant如何自定义组件适配iphone底部安全区

    Vant如何自定义组件适配iphone底部安全区

    这篇文章主要介绍了Vant如何自定义组件适配iphone底部安全区问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • vue组件中使用iframe元素的示例代码

    vue组件中使用iframe元素的示例代码

    本篇文章主要介绍了vue组件中使用iframe元素的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • vue 使用 sortable 实现 el-table 拖拽排序功能

    vue 使用 sortable 实现 el-table 拖拽排序功能

    这篇文章主要介绍了vue 使用 sortable 实现 el-table 拖拽排序功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12

最新评论