派發(fā)器抽離vue2單組件中的大量邏輯技巧
概述
在vue2當(dāng)中,我們寫(xiě)的邏輯都是options配置對(duì)象,比較固定的寫(xiě)法,方法,數(shù)據(jù),都對(duì)應(yīng)到各自的配置項(xiàng)當(dāng)中,但是當(dāng)一個(gè)組件的邏輯變得更加復(fù)雜,邏輯也越來(lái)越多的時(shí)候,這時(shí)候,我們一個(gè)組件避免不了要寫(xiě)大量的邏輯代碼,在2版本中,使用官方推薦的mixin可以解決一個(gè)組件邏輯過(guò)多的問(wèn)題,現(xiàn)在記錄我在工作用用到的另外方法。
本質(zhì)
在react中,我們使用redux,會(huì)接觸到對(duì)應(yīng)的action,reducer,dispatch等等,通過(guò)派發(fā)對(duì)應(yīng)事件類(lèi)型,然后觸發(fā)對(duì)應(yīng)邏輯修改,有點(diǎn)像發(fā)布訂閱,哈哈,在這里,借鑒react當(dāng)中使用redux的思路,記錄vue2當(dāng)中抽離邏輯代碼的技巧。
具體實(shí)現(xiàn)
舉例就拿最經(jīng)典的toodList來(lái)舉例
- .components/ToodList/ToodList.vue
<template>
<div>
<input type="text" placeholder="請(qǐng)輸入關(guān)鍵字" 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
//主要定義時(shí)間觸發(fā)的類(lèi)型常量
export const ACTION_TYPES = {
del: "DEL",
add: "ADD",
};
.components/ToodList/hook文件下:
- actionTypes.js
//派發(fā)器,通過(guò)action找到對(duì)應(yīng)的事件處理邏輯,然后觸發(fā)
import { addTood, removeTood } from "./toodReducer";
import { ACTION_TYPES } from "./actionTypes";
//接收參數(shù),vue組件上下文對(duì)應(yīng)
export default function (ctx) {
function dispatch(args) {
const { type, payLoad } = args;
//根據(jù)行為,觸發(fā)reducer中的對(duì)應(yīng)邏輯
switch (type) {
case ACTION_TYPES.del:
removeTood.bind(ctx)(payLoad);
break;
case ACTION_TYPES.add:
addTood.bind(ctx)(payLoad);
break;
default:
break;
}
}
//返回綁定組件實(shí)例的函數(shù)
return dispatch.bind(ctx);
}
.components/ToodList/hook文件下:
- toodReducer.js
//主要事件處理邏輯文件(對(duì)應(yīng)vue組件中的一個(gè)個(gè)method方法)
//添加一個(gè)tood
export function addTood(value) {
const toodListItme = {
title: value,
complated: false,
id: Date.now(),
};
this.list.push(toodListItme);
}
//刪除一個(gè)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: "第一項(xiàng)",
complated: false,
id: 1,
},
{
title: "第二項(xiàng)",
complated: false,
id: 2,
},
{
title: "第三項(xiàng)",
complated: true,
id: 3,
},
],
};
},
methods: {
//邏輯代碼全部抽離到外部進(jìn)行處理,當(dāng)前組件只需要關(guān)注視圖即可
handelDel(item) {
dispatch(this)({
type: ACTION_TYPES.del,
payLoad: item,
});
},
addTood(value) {
dispatch(this)({
type: ACTION_TYPES.add,
payLoad: value,
});
},
},
};
</script>
總結(jié)
在vue2中在一個(gè)組件中寫(xiě)過(guò)多代碼還是很常見(jiàn)的,不好分離邏輯的地方就在this,因此避免一個(gè)文件邏輯過(guò)多,可以試試這種方法,在vue3更新后,移除單文件組件對(duì)this的過(guò)渡依賴(lài),對(duì)應(yīng)的compositionApi已經(jīng)非常便于我們抽離單文件邏輯代碼了。
以上就是派發(fā)器抽離vue2單組件中的大量邏輯技巧的詳細(xì)內(nèi)容,更多關(guān)于派發(fā)器vue2單組件邏輯抽離的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Vant Uploader實(shí)現(xiàn)上傳一張或多張圖片組件
這篇文章主要為大家詳細(xì)介紹了Vant Uploader實(shí)現(xiàn)上傳一張或多張圖片組件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
vue axios請(qǐng)求頻繁時(shí)取消上一次請(qǐng)求的方法
這篇文章主要介紹了vue axios請(qǐng)求頻繁時(shí)取消上一次請(qǐng)求的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
在vue3項(xiàng)目中給頁(yè)面添加水印的實(shí)現(xiàn)方法
這篇文章主要給大家介紹一下在vue3項(xiàng)目中添加水印的實(shí)現(xiàn)方法,文中有詳細(xì)的代碼示例供大家參考,具有一定的參考價(jià)值,感興趣的小伙伴跟著小編一起來(lái)看看吧2023-08-08
vue動(dòng)態(tài)禁用控件綁定disable的例子
今天小編就為大家分享一篇vue動(dòng)態(tài)禁用控件綁定disable的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-10-10
使用vue-router設(shè)置每個(gè)頁(yè)面的title方法
下面小編就為大家分享一篇使用vue-router設(shè)置每個(gè)頁(yè)面的title方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
Monaco-editor 的 JSON Schema 配置及使用介紹
這篇文章主要為大家介紹了Monaco-editor 的 JSON Schema 配置及使用介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
Vue在原窗口與新窗口打開(kāi)外部鏈接的實(shí)現(xiàn)代碼
這篇文章主要介紹了Vue如何在原窗口與新窗口打開(kāi)外部鏈接,文中給大家提到了vue跳轉(zhuǎn)外部鏈接的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02

