一點 Vue.observable 想法
Vue 2.6.0 新增了 Vue.observable api,但最近才去嘗試使用它。
這東西說新也不新,因為他就是 vue 本身的功能,只是暴露出來,成為新 api 了。
在老版本中,直接用 new Vue({ data: {} }) 也一樣。
API 本身
官方文件原文描述是: 讓一個物件可響應。Vue 內部會用它來處理 data 函式返回的物件。
然後百度一下這個,幾乎全是 使用Vue.observable()進行狀態管理 這種文章。
谷歌一下也一樣,然後你會發現,國內的文章都是翻譯過來的。
所以我想試試能不能做點其他東西。
嘗試
我建立了一個可響應物件,const state = Vue.observable({ count: 1 });,然後嘗試掛載到 data 和 computed 下,發現都可以用,然後我在 state 上加了個方法。
[JavaScript] 純文字檢視 複製程式碼const state = Vue.observable({ count: 1 }); state.add = () => state.count++; const app = new Vue({ data: { state, }, });
當掛載到 data 下,我發現 add 沒被代理,所以推測 vue 直接掛載 Vue.observable 建立的物件。
嘗試分頁封裝
我之前做分頁,都需要 data 下掛個物件,然後需要計算屬性計算當前顯示列表。
現在我們可以嘗試使用 Vue.observable 封裝一個分頁方法。
[JavaScript] 純文字檢視 複製程式碼/** * 生成分頁 * @param {any[]} list 資料列表 * @param {number} size 每頁條數 */ const pagination = (list, size = 10) => { const res = Vue.observable({ /** 當前頁碼 */ page: 1, /** 每頁條數 */ size, /** 總頁數 */ total: Math.ceil(list.length / size), /** 當前頁顯示資料 */ list: [], }); /** 原陣列 */ res.orgList = list; /** 分頁方法 */ res.setPage = (num) => { res.page += num const { page, size } = res; const pos = (page - 1) * size; res.list = res.orgList.slice(pos, pos + size); } // 初始化 res.setPage(0); return res; };
程式碼比較簡化,沒寫 ajax 分頁支援,就用最簡單的例子來演示,以便於理解。
[HTML] 純文字檢視 複製程式碼<template> <div id="app"> <ul> <li v-for="(it, idx) of usersList.list" :key="idx">{{ it.name }}</li> </ul> <div class="pagination"> <span class="btn" :class="{ 'is-disabled': usersList.page === 1 }" @click="usersList.setPage(-1)" >上一頁</span> <span>{{usersList.page}}/{{usersList.total}}</span> <span class="btn" :class="{ 'is-disabled': usersList.page === usersList.total }" @click="usersList.setPage(1)" >下一頁</span> </div> </div> </template> <script> import pagination from "./pagination"; const list = Array(33) .fill(0) .map((_, i) => ({ name: "name" + i })); export default { name: "App", data() { return { usersList: pagination(list) }; } }; </script> <style> .btn { display: inline-block; background-color: #369; border-radius: 4px; padding: 0.2em 0.5em; color: #fff; user-select: none; margin: 0 0.5em; } .btn.is-disabled { background-color: #aaa; pointer-events: none; } </style>
小總
這個例子中 Vue.observable 將分頁功能封裝到一個函式中確實簡化了不少。
也許還有更多場景可以使用它來優化,那就等待大家去挖掘吧,別再一味翻譯國外的文章。
相關文章
- 關於WebWind一點想法Web
- 關於Java的一點想法Java
- 關於遊戲付費的一點想法遊戲
- 對於技術焦慮的一點想法
- 看JIVE原始碼的一點想法和疑問原始碼
- 關於web開發前期工作的一點想法Web
- 關於 blog文集和翻譯的一點想法
- 關於判斷兩個矩陣相交的一點想法矩陣
- 有關C++異常安全的一點個人想法 (轉)C++
- 關於Decorator模式的幾點想法模式
- 關於大資料和網際網路的一點想法薦大資料
- 網路遊戲效能測試的幾點想法遊戲
- winrar2.71的破解和對暴破的一點想法 (4千字)
- “系統”只是一個概念、一個想法 - Checkland
- 一個想法,不知能否實現。
- 增加想法
- 從Objective-C到Swift:幾點想法和意見ObjectSwift
- 記錄一個前端架構的想法前端架構
- 處理 JavaScript 異常的一個想法JavaScript
- 對於 CF1107E 中 dp 狀態設計的一點想法
- q友問題之刪除外加雙引號表一點小想法--dump--ascii--to_numberASCII
- 隨機性設計的一些想法隨機
- 程式設計師買房的一些想法程式設計師
- 關於Python 3的一些想法Python
- 關於新書出版的一些想法新書
- 吐槽一些技術想法和事情
- 創業真經《他山之石》讀點:【實踐是想法的立命之本】創業
- 初學者的想法
- 關於 Spring-WebFlux 的一些想法SpringWebUX
- 關於讀書分享會的一些想法
- 關於演算法的一些想法 (轉)演算法
- 關於三層架構的一些想法架構
- 系統架構:Web應用架構的新趨勢---前端和後端分離的一點想法Web應用架構前端後端
- 【筆記】關於大資料的一些想法筆記大資料
- 關於資料庫批次查詢的一個想法資料庫
- 工業網際網路的兩種極端想法和兩點反思
- vue開發小想法Vue
- 半自動化搭建Data Guard的想法和實踐(一)