最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue代碼整潔之去重方法整理

 更新時(shí)間:2019年08月06日 16:25:19   作者:若羽。  
在本篇文章里小編給大家整理的是關(guān)于Vue代碼整潔之去重的相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的朋友們學(xué)習(xí)下。

在開(kāi)始本篇的主題之前,讓我們把上次遺留下來(lái)的問(wèn)題都清理一下:

將其他組件中 axios 請(qǐng)求的地方封裝起來(lái)。

這里就不把代碼放在開(kāi)頭了,相關(guān)代碼都放在文末,有興趣了解的童鞋可以先往下翻。

好了, 我們現(xiàn)在把上篇剩下的任務(wù)給完成了,接下來(lái)我們來(lái)正式開(kāi)始本篇內(nèi)容吧。

去重是什么

字面上意思:去除重復(fù),在項(xiàng)目中,不可避免的會(huì)出現(xiàn)重復(fù)代碼。但是如果不好好去處理這些重復(fù)代碼,那很有可能就會(huì)給你很多“驚喜”。

如何為“重復(fù)” 下一個(gè)定義呢?

從最淺顯的層次來(lái)看, 相同即是重復(fù)。在我們上面的代碼中,每一個(gè)組件中都有這么一行代碼:

import RequestSender from '@/requestSender';

 

這就是重復(fù)代碼,在每一個(gè)需要發(fā)起請(qǐng)求的組件中你都會(huì)需要寫(xiě)上這么一行代碼。那么讓我們就這個(gè)列舉一些可能出現(xiàn)的問(wèn)題:

某一天修改了文件名

某一天移動(dòng)了該文件

那么項(xiàng)目中需要修改的地方將會(huì)是多少呢?而在修改中會(huì)產(chǎn)生手誤的概率又會(huì)是多少呢?以上還是在單人開(kāi)發(fā)的時(shí)候,如果團(tuán)隊(duì)協(xié)作開(kāi)發(fā),這些情況的概率又會(huì)是什么樣的呢。

如何去重

當(dāng)然,對(duì)于上面這種引入型的代碼,類(lèi)似移動(dòng)文件,修改文件名這種操作。IDE 就能很好的幫你處理,比如 WebStorm 如果你使用重構(gòu)相關(guān)的功能去重命名,那么它會(huì)找出所有 “疑似”引用的代碼片段,你可以選擇所有相關(guān)的引用同時(shí)修改。

這是一種手段,很好的解決了上面這些問(wèn)題。

那么讓我們來(lái)看看另一個(gè)重復(fù)代碼的問(wèn)題:

class RequestSender {
  static GetBlogList() {
    return axios.get('https://451ece6c-f618-436b-b4a2-517c6b2da400.mock.pstmn.io/list');
  }

  static Publish(data) {
    return axios.post('https://451ece6c-f618-436b-b4a2-517c6b2da400.mock.pstmn.io/publish', data);
  }

  static Login(data) {
    return axios.post('https://451ece6c-f618-436b-b4a2-517c6b2da400.mock.pstmn.io/login', data);
  }

  static Signup(data) {
  
    return axios.post('https://451ece6c-f618-436b-b4a2-517c6b2da400.mock.pstmn.io/signup', data);
  }
}

上面的代碼, 重點(diǎn)不在函數(shù)噢。 仔細(xì)看看它們有哪些地方重復(fù)了。

光從代碼上來(lái)看,其實(shí)有很多“重復(fù)”的地方,比如說(shuō) return、staticaxios.get、axios.post。

這些重復(fù)有一部分是語(yǔ)法,有一部分是調(diào)用。這些都是不可避免的,因此這些重復(fù)代碼并不在我們需要重構(gòu)的范圍內(nèi)。那么,究竟是哪段代碼呢?

https://451ece6c-f618-436b-b4a2-517c6b2da400.mock.pstmn.io

準(zhǔn)確來(lái)說(shuō),它并不算是代碼。而是“硬編碼”,從整體代碼上來(lái)看,這是目前所有后臺(tái)接口的域名

在開(kāi)發(fā)過(guò)程中,一般來(lái)說(shuō)至少是會(huì)有兩個(gè)環(huán)境存在:開(kāi)發(fā)環(huán)境、線(xiàn)上環(huán)境。而它們兩的后臺(tái)接口域名一般而言又不會(huì)重復(fù),難道每次發(fā)布前都手動(dòng)改一下域名么?

我們先來(lái)列舉一下可能會(huì)出現(xiàn)的問(wèn)題:

開(kāi)發(fā)環(huán)境、線(xiàn)上環(huán)境域名不一致

團(tuán)隊(duì)協(xié)作中,開(kāi)發(fā)者之間的開(kāi)發(fā)域名不一致

當(dāng)線(xiàn)上/開(kāi)發(fā) 環(huán)境中的域名需要修改時(shí)

可以看到,當(dāng)遇到上述問(wèn)題時(shí),項(xiàng)目中所有硬編碼了域名的地方都是需要修改的,那么為什么要修改呢?

除了解決上面列舉的具體問(wèn)題之外,最根本的目的是:

保持唯一性

如果有兩段/多段代碼它們表示的含義完全一致,并且從目的上來(lái)說(shuō)也是一致的。那么就應(yīng)該盡可能將其只保留一處定義。

那么對(duì)于這個(gè)域名我們?cè)趺刺幚砟兀渴紫葘⑵涮釤挸鰜?lái):

static Host = 'https://451ece6c-f618-436b-b4a2-517c6b2da400.mock.pstmn.io';

這樣,引用的地方就可以這么寫(xiě):

static GetBlogList() {
  return axios.get(`${Host}/list`);
}

 

這樣,當(dāng)發(fā)現(xiàn)修改的時(shí)候,是不是只需要修改 Host 這么一個(gè)地方就好了呢?、

但是這樣還存在問(wèn)題,如果要發(fā)布,或者是在 git 、 svn上協(xié)作的時(shí)候呢? 每個(gè)人、每個(gè)環(huán)境都需要修改這個(gè)變量,并且還要在提交代碼時(shí)移除掉自己的修改以避免沖突。

可配置化

Host 的例子是非常常見(jiàn)的,當(dāng)我們需要發(fā)布、團(tuán)隊(duì)協(xié)作的時(shí)候,環(huán)境不同是非常常見(jiàn)的,有可能在自己電腦上 Hostlocalhost:8080,換在另一個(gè)人電腦上就是 localhost:9099了。那么線(xiàn)上環(huán)境有可能又是 xxx.xxx.comxx.xxx.com/api諸如此類(lèi)。

這里若羽實(shí)踐的解決方案是:

將與環(huán)境相關(guān)的硬編碼提煉成可配置項(xiàng)放入配置文件

配置文件模板化

配置模板文件多樣化

真正的配置文件是不會(huì)被提交上去,只有一個(gè)模板文件。由于配置文件并不會(huì)被提交,所以開(kāi)發(fā)者之間的環(huán)境差異就可以忽略了,大家根據(jù)自己的環(huán)境修改配置文件即可。

那么對(duì)于線(xiàn)上環(huán)境、測(cè)試環(huán)境等等,建立對(duì)應(yīng)的配置文件模板即可。當(dāng)發(fā)布時(shí),使用對(duì)應(yīng)環(huán)境的發(fā)布配置文件模板作為配置文件即可。

那么我們來(lái)實(shí)踐一下:

新建配置模板文件 config.js.template:

const config = {
  HOST: '',
};

export default config;

 

接下來(lái)復(fù)制粘貼模板文件,并重命名為 config.js:

const config = {
  HOST: 'https://451ece6c-f618-436b-b4a2-517c6b2da400.mock.pstmn.io',
};

export default config;

 

接下來(lái)修改一下 requestSender.js:

import axios from 'axios';
import config from '@/config.js';

class RequestSender {
  static GetBlogList() {
    return axios.get(`${config.HOST}/list`);
  }

  static Publish(data) {
    return axios.post(`${config.HOST}/publish`, data);
  }

  static Login(data) {
    return axios.post(`${config.HOST}/login`, data);
  }

  static Signup(data) {
  
    return axios.post(`${config.HOST}/signup`, data);
  }
}

export default RequestSender;

 

好了,現(xiàn)在不管是在任何一個(gè)環(huán)境下,都可以游刃有余的切換域名了。而且這里面還有一個(gè)很有意思的事情:

所有的改動(dòng)對(duì)于表現(xiàn)層而言是透明的。

簡(jiǎn)單來(lái)說(shuō),我們?cè)谶@里重構(gòu)了這么多的代碼,然而我們并不需要修改任何一個(gè)視圖組件中的代碼?。?!

表面上還是原來(lái)的樣子,可實(shí)際上已經(jīng)“打掃”過(guò)了。這也是重構(gòu)中需要注意的一點(diǎn):

步子邁小一點(diǎn),邁準(zhǔn)一點(diǎn) 寫(xiě)在后面

上篇中有人問(wèn)到若羽說(shuō)封裝請(qǐng)求的意義何在,axios 本身就是帶著 Promise的支持了。

這里對(duì)這個(gè)問(wèn)題做一個(gè)回應(yīng),立場(chǎng)僅代表若羽本人,并不為任何人“做代表”:

封裝并非為了 Promise,而是為了將“發(fā)送請(qǐng)求”的這個(gè)動(dòng)作封裝起來(lái)。因?yàn)檫@屬于數(shù)據(jù)獲取的行為,而后面 then 里的邏輯實(shí)際上是和業(yè)務(wù)掛鉤:為視圖設(shè)置數(shù)據(jù)。這是兩個(gè)不同的行為,就像后端一樣:ORM它僅僅是負(fù)責(zé)從數(shù)據(jù)庫(kù)中取數(shù)據(jù)而已,真正對(duì)這個(gè)數(shù)據(jù)進(jìn)行邏輯操作的,并不是它。這也是接下來(lái)博文的主題:專(zhuān)一,一個(gè)函數(shù)應(yīng)當(dāng)只負(fù)責(zé)一件事情。

這一篇文章便表示了另一層意思:去重,在第一層封裝的過(guò)程中我們發(fā)現(xiàn)了域名的硬編碼問(wèn)題(不封裝也是一樣),因此在這里如果不做封裝的話(huà),即使將域名提煉出來(lái),涉及到修改的文件同樣也會(huì)較多。不過(guò)這種修改是一次性的。

以上便是若羽對(duì)上一篇中示例的解釋。

歡迎大家發(fā)表評(píng)論,共同探討。

上篇重構(gòu)代碼

edit.vue

<script>
  import RequestSender from '@/requestSender'
  export default {
    name: "Edit",
    data() {
      return {
        model: {
          title: '',
          content: '',
        }
      }
    },
    methods: {
      submit() {
        RequestSender.Publish(this.model)
          .then(res => {
             if(res.data.Code === 200) {
               this.$message.success('發(fā)布成功');
             }
           })
      }
    }
  }
</script>

 

Login.vue:

<script>
  import RequestSender from '@/requestSender';
  export default {
    name: "Login",
    data() {
      return {
        model: {
          username: '',
          password: '',
        }
      }
    },

    methods: {
      submit() {
        RequestSender.Login(this.model)
          .then(res => {
            if(res.data.Code === 200) {
              this.$message.success('登錄成功');
            }
          })
      }
    }
  }
</script>

Signup.vue:

<script>
  import RequestSender from '@/requestSender';

  export default {
    name: "Signup",
    data() {
      return {
        model: {
          username: '',
          password: '',
          rePassword: ''
        }
      };
    },
    methods: {
      submit() {
        if(this.model.password !== this.model.rePassword){
          this.$message.error('兩次出入密碼不一致.');
          return ;
        }

        RequestSender.Signup(this.model)
          .then(res => {
            if(res.data.Code === 200){
              this.$message.success("注冊(cè)成功");
              this.$router.push('./login');
            }
          });
      }
    }
  }
</script>

requestSender.js:

import axios from 'axios';

class RequestSender {
  static GetBlogList() {
    return axios.get('https://451ece6c-f618-436b-b4a2-517c6b2da400.mock.pstmn.io/list');
  }

  static Publish(data) {
    return axios.post('https://451ece6c-f618-436b-b4a2-517c6b2da400.mock.pstmn.io/publish', data);
  }

  static Login(data) {
    return axios.post('https://451ece6c-f618-436b-b4a2-517c6b2da400.mock.pstmn.io/login', data);
  }

  static Signup(data) {
  
    return axios.post('https://451ece6c-f618-436b-b4a2-517c6b2da400.mock.pstmn.io/signup', data);
  }
}

export default RequestSender;

以上就是關(guān)于Vue代碼整潔之去重的相關(guān)知識(shí)點(diǎn),感謝大家的閱讀和對(duì)腳本之家的支持。

相關(guān)文章

  • Vue3實(shí)現(xiàn)簡(jiǎn)約型側(cè)邊欄的示例代碼

    Vue3實(shí)現(xiàn)簡(jiǎn)約型側(cè)邊欄的示例代碼

    本文主要介紹了Vue3實(shí)現(xiàn)簡(jiǎn)約型側(cè)邊欄的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Vite創(chuàng)建項(xiàng)目的實(shí)現(xiàn)步驟

    Vite創(chuàng)建項(xiàng)目的實(shí)現(xiàn)步驟

    隨著 Vite2 的發(fā)布并日趨穩(wěn)定,現(xiàn)在越來(lái)越多的項(xiàng)目開(kāi)始嘗試使用它。本文我們就介紹了Vite創(chuàng)建項(xiàng)目的實(shí)現(xiàn)步驟,感興趣的可以了解一下
    2021-07-07
  • 優(yōu)雅的將ElementUI表格變身成樹(shù)形表格的方法步驟

    優(yōu)雅的將ElementUI表格變身成樹(shù)形表格的方法步驟

    這篇文章主要介紹了優(yōu)雅的將ElementUI表格變身成樹(shù)形表格的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Vue中@click.stop和@click.prevent實(shí)例詳解

    Vue中@click.stop和@click.prevent實(shí)例詳解

    當(dāng)我們使用Vue.js開(kāi)發(fā)前端應(yīng)用時(shí),經(jīng)常會(huì)在模版中使用@click指令來(lái)響應(yīng)用戶(hù)的點(diǎn)擊事件,這篇文章主要給大家介紹了關(guān)于Vue中@click.stop和@click.prevent的相關(guān)資料,需要的朋友可以參考下
    2024-04-04
  • Vue3實(shí)現(xiàn)組件二次封裝的小技巧分享

    Vue3實(shí)現(xiàn)組件二次封裝的小技巧分享

    組件的二次封裝:保留組件已有的功能,需要重寫(xiě)組件方法,當(dāng)組件已有大量功能時(shí)候,則需要重寫(xiě)很多重復(fù)代碼,且組件功能進(jìn)行修改的時(shí)候,封裝的組件也需要對(duì)應(yīng)修改,從而造成許多開(kāi)發(fā)和維護(hù)成本,本文給大家分享了Vue3實(shí)現(xiàn)組件二次封裝的小技巧,需要的朋友可以參考下
    2024-09-09
  • html2canvas使用文檔(vue舉例)

    html2canvas使用文檔(vue舉例)

    html2canvas.js是一款可以在網(wǎng)頁(yè)上實(shí)現(xiàn)頁(yè)面截圖的js,它使用了html5和css3的一些新功能特性,實(shí)現(xiàn)了在客戶(hù)端對(duì)網(wǎng)頁(yè)進(jìn)行截圖的功能,這篇文章主要給大家介紹了關(guān)于html2canvas使用的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • Vue框架下引入ActiveX控件的問(wèn)題解決

    Vue框架下引入ActiveX控件的問(wèn)題解決

    這篇文章主要介紹了Vue框架下引入ActiveX控件的問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • el-popover如何通過(guò)js手動(dòng)控制彈出框顯示、隱藏

    el-popover如何通過(guò)js手動(dòng)控制彈出框顯示、隱藏

    最近項(xiàng)目中多次用到了Popover彈出框,下面這篇文章主要給大家介紹了關(guān)于el-popover如何通過(guò)js手動(dòng)控制彈出框顯示、隱藏的相關(guān)資料,需要的朋友可以參考下
    2023-12-12
  • Element-ui中元素滾動(dòng)時(shí)el-option超出元素區(qū)域的問(wèn)題

    Element-ui中元素滾動(dòng)時(shí)el-option超出元素區(qū)域的問(wèn)題

    這篇文章主要介紹了Element-ui中元素滾動(dòng)時(shí)el-option超出元素區(qū)域的問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-05-05
  • vue3中傳遞路徑參數(shù)的限制

    vue3中傳遞路徑參數(shù)的限制

    在 Vue 3 里使用路由跳轉(zhuǎn)到用戶(hù)頁(yè)并傳遞路徑參數(shù)時(shí),存在一些限制和需要注意的方面,下面給大家分享vue3中傳遞路徑參數(shù)有什么限制,感興趣的朋友一起看看吧
    2025-03-03

最新評(píng)論

昌吉市| 冕宁县| 南郑县| 桦川县| 噶尔县| 巩留县| 吉木萨尔县| 清新县| 皮山县| 南溪县| 郴州市| 白山市| 青田县| 庆安县| 绥芬河市| 昌邑市| 永定县| 建湖县| 博客| 色达县| 龙南县| 苗栗县| 谷城县| 台北市| 信宜市| 丹阳市| 普定县| 本溪市| 岑溪市| 崇礼县| 广丰县| 华阴市| 怀远县| 大英县| 林口县| 中牟县| 江达县| 鄂托克前旗| 巴南区| 庄河市| 凤凰县|