一點 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 將分頁功能封裝到一個函式中確實簡化了不少。
也許還有更多場景可以使用它來優化,那就等待大家去挖掘吧,別再一味翻譯國外的文章。
相關文章
- 一點想法
- 關於本書的一點想法
- 關於遊戲付費的一點想法遊戲
- ai設定虛擬人物的一點想法AI
- 關於LCA的幾點想法
- 關於大語言模型時代下自學的一點想法模型
- 新一年的想法
- 對於 CF1107E 中 dp 狀態設計的一點想法
- 迴歸の一些想法
- “系統”只是一個概念、一個想法 - Checkland
- 增加想法
- 記錄一個前端架構的想法前端架構
- 隨機性設計的一些想法隨機
- 關於 Spring-WebFlux 的一些想法SpringWebUX
- 自動化測試的另外一個想法
- 關於讀書分享會的一些想法
- 關於單元測試的一些想法
- 程式設計師買房的一些想法程式設計師
- vue開發小想法Vue
- 工業網際網路的兩種極端想法和兩點反思
- 對於效能測試的一些想法,歡迎交流
- 讓想法躍然紙上
- 使用DDD重新思考ERP系統的一些初步想法 –feststelltasteAST
- [CEO公開信] 關於管理和組織的一些想法
- go(golang)之slice的小想法1Golang
- Laravel的mysql資料分離想法LaravelMySql
- 瑣碎的想法(五)for 的前世今生
- 關於JavaScript跨域的若干想法JavaScript跨域
- 物聯網專案接收裝置實時資料的一個想法
- 我對變數產生了這些想法變數
- 頭腦風暴問題而不是想法
- 關於js繼承的想法筆記JS繼承筆記
- 超越高智商:新想法更重要 - pg
- 一點點排序排序
- 我對空資料頁面等公共頁面實現的一些想法
- 算是秋招上岸的一些想法吧。(雖然現在都已經春招了。。
- 離職後的一些技術整理和後續學習目標想法
- 他分享加入中帝皇品的真實想法!