用 Vue Function-based API 重寫你的組件的業(yè)務(wù)邏輯

用 Vue Function-based API 重寫你的組件的業(yè)務(wù)邏輯

_令人激動的 Vue Function-based API _

_Vue 的作者尤雨溪最近公布了 3.0 版本最重要的 RFC Vue Function-based API佃蚜。建議仔細(xì)閱讀這篇文章再來看這篇文章历筝。本文主要講述如何使用該 API 重新組織我們的組件與業(yè)務(wù)邏輯代碼楞卡,去除那令人討厭的 mixin 。
<a name="ZQpUo"></a>

1. 使用 Vue Function-based API 寫計(jì)數(shù)組件

<a name="SdXLZ"></a>

計(jì)數(shù)組件視圖與數(shù)據(jù)部分

<template>
  <div style="margin-top: 20px;">
    <span>count is <span class="emphasis">{{ count }}</span></span>
    <span>plusOne is <span class="emphasis">{{ plusOne }}</span></span>
    <el-button @click="increment">count++</el-button>
  </div>
</template>
<script>
import Vue from "vue";
import { value, computed, watch, onMounted } from "vue-function-api";
import useCout from "./cout.js";
export default {
  setup() {

    

    const { count, plusOne, increment } = useCout();
    // expose bindings on render context
    return {
      count,
      plusOne,
      increment
    };
  }
};
</script>

<a name="fhfox"></a>

計(jì)數(shù)組件業(yè)務(wù)邏輯部分

cout.js

/* eslint-disable */
import {
  value,
  computed,
  watch,
  onMounted
} from "vue-function-api";

// 后端分頁邏輯
function useCout() {
  // reactive state
  const count = value(0);
  // computed state
  const plusOne = computed(() => count.value + 1);
  // method
  const increment = () => {
    count.value++;
  };
  // watch
  watch(
    () => count.value * 2,
    val => {
      console.log(`count * 2 is ${val}`);
    }
  );
  // lifecycle
  onMounted(() => {
    console.log(`mounted`);
  });
  return {
    count,
    plusOne,
    increment
  };
}

export default useCout

我們看到計(jì)數(shù)邏輯相關(guān)業(yè)務(wù)邏輯封裝在一個(gè)獨(dú)立的模塊中,與視圖層分離。避免了 vue 2.0 的 mixin 導(dǎo)致的屬性名或方法名命名沖突,模版中的數(shù)據(jù)來源不清晰等問題挪钓,獨(dú)立而又顯示的展示業(yè)務(wù)邏輯。
<a name="fvGXJ"></a>

2. 分頁組件

<a name="QYTJr"></a>

分頁組件視圖與數(shù)據(jù)部分

<template>
  <div>
    <div style="margin-top: 20px;">
      <el-pagination
        @size-change="handleSizeChange"
        @current-change="handleCurrentChange"
        :current-page="currentPage"
        :page-sizes="[10, 20, 30, 40]"
        :page-size="pageSize"
        layout="total, sizes, prev, pager, next, jumper"
        :total="total"
      ></el-pagination>
      <div style="margin-top: 20px;">
        <el-button @click="getDataList">取得數(shù)據(jù)</el-button>
      </div>
    </div>
  </div>
</template>

<script>
/* eslint-disable */
import Vue from "vue";
import { value, computed, watch, onMounted } from "vue-function-api";
import usePagination from "./pagination.js";
export default {
  setup() {
    // 請求數(shù)據(jù)
    const getDataList = () => {
      // setTotal(parseInt(Math.random() * 100));
      setTotal(68);
    };

    // pagination
    const {
      currentPage,
      pageSize,
      total,
      handleCurrentChange,
      handleSizeChange,
      setTotal
    } = usePagination(getDataList);
    
    // expose bindings on render context
    return {
      currentPage,
      pageSize,
      total,
      handleCurrentChange,
      handleSizeChange,
      setTotal,
      getDataList
    };
  }
};
</script>

<a name="t1yLW"></a>

計(jì)數(shù)組件業(yè)務(wù)邏輯部分

pagination.js

/* eslint-disable */
import { value, watch, onMounted } from 'vue-function-api'
// 后端分頁邏輯
function usePagination(changeCallback) {
  const currentPage = value(1);
  const total = value(0);
  const pageSize = value(10);
  const handleCurrentChange = (val) => {
    console.log(`當(dāng)前頁: ${val}`);
    currentPage.value = val;
    changeCallback()
  }

  const handleSizeChange = (val) => {
    console.log(`每頁 ${val} 條`);
    pageSize.value = val;
    changeCallback()
  }

  const setTotal = (val) => {
    total.value = val;
  }

  return {
    currentPage,
    pageSize,
    total,
    handleCurrentChange,
    handleSizeChange,
    setTotal
  }

}

export default usePagination

代碼 demo 地址:GitHub鏈接

讓我們可以使用 vue function API 的插件:Vue Function-based API
本文同步發(fā)表于語雀文檔:用 Vue Function-based API 重寫你的組件的業(yè)務(wù)邏輯

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末耳舅,一起剝皮案震驚了整個(gè)濱河市碌上,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌浦徊,老刑警劉巖馏予,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異辑畦,居然都是意外死亡吗蚌,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門纯出,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚯妇,“玉大人,你說我怎么就攤上這事暂筝÷嵫裕” “怎么了?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵焕襟,是天一觀的道長陨收。 經(jīng)常有香客問我,道長鸵赖,這世上最難降的妖魔是什么务漩? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮它褪,結(jié)果婚禮上饵骨,老公的妹妹穿的比我還像新娘。我一直安慰自己茫打,他們只是感情好居触,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布妖混。 她就那樣靜靜地躺著,像睡著了一般轮洋。 火紅的嫁衣襯著肌膚如雪制市。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天弊予,我揣著相機(jī)與錄音祥楣,去河邊找鬼。 笑死汉柒,一個(gè)胖子當(dāng)著我的面吹牛荣堰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播竭翠,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼薇搁!你這毒婦竟也來了斋扰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤啃洋,失蹤者是張志新(化名)和其女友劉穎传货,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宏娄,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡问裕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了孵坚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粮宛。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖卖宠,靈堂內(nèi)的尸體忽然破棺而出巍杈,到底是詐尸還是另有隱情,我是刑警寧澤扛伍,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布筷畦,位于F島的核電站,受9級特大地震影響刺洒,放射性物質(zhì)發(fā)生泄漏鳖宾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一逆航、第九天 我趴在偏房一處隱蔽的房頂上張望鼎文。 院中可真熱鬧,春花似錦纸泡、人聲如沸漂问。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚤假。三九已至栏饮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間磷仰,已是汗流浹背袍嬉。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留灶平,地道東北人伺通。 一個(gè)月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像逢享,于是被迫代替她去往敵國和親罐监。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 基于Vue的一些資料 內(nèi)容 UI組件 開發(fā)框架 實(shí)用庫 服務(wù)端 輔助工具 應(yīng)用實(shí)例 Demo示例 element★...
    嘗了又嘗閱讀 1,151評論 0 1
  • UI組件 element- 餓了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的組件庫 m...
    小姜先森o0O閱讀 9,483評論 0 72
  • 本文為2016年11月9日瞒爬,『前端之巔』微信群在線分享活動總結(jié)整理而成弓柱,轉(zhuǎn)載請?jiān)谖恼麻_頭處注明來自『前端之巔』公眾...
    尾尾閱讀 10,600評論 3 32
  • UI組件 element- 餓了么出品的Vue2的web UI工具套件 Vux- 基于Vue和WeUI的組件庫 m...
    王喂馬_閱讀 6,454評論 1 77
  • Vue 實(shí)例 屬性和方法 每個(gè) Vue 實(shí)例都會代理其 data 對象里所有的屬性:var data = { a:...
    云之外閱讀 2,209評論 0 6