--- tags: share disqus: hackmd --- 1100303 === 關於 Promise --- * `new Promise()` 為實例化一個 `Promise Class`,`()`須傳入帶 ==成功`resolve(自定義)`== 和 ==失敗`reject(自定義)`== 參數的 `function`。 * 可只帶一個參數,則代表成功時參數。 * 因為較複雜,所以通常用在第三方套件,如 `ajax return` 的也是一個 `promise`,所以可以寫 `$ajax().then()`。 * 語法糖 `async` (ES7) * `async` 搭配 `await` * 強制將非同步事件轉為同步事件(實際上是讓其看起來像同步)。 * 通常打 API 都是非同步。 * 缺點:不適合寫太長,因此還是建議寫 `then` 比較彈性。 * `try{}`、`catch{}`:先執行`try{}`,`try{}`有錯誤即跳到`catch{}`。 JS 小知識 --- * `function` 型參:定義 `function` 時的所自定義的名稱。 * `function` 實參:呼叫函式時所傳入的參數。 * `console.log()` 時,可將物件用 `{}` 包起來,如 `console.log({data})`(等同於`console.log({data:data})`),此寫法會多印出物件名稱。 * `for` 語法底層都是 `Iterator`。 * `if(){}else{}`有短路寫法`&&`。 關於DTO --- * DTO 就是在作資料轉換(把收到的資料轉成我要用的資料格式) ```javascript= // ========== Vue 畫面 ========== // 點擊按鈕時呼叫 open() // open()主要功能為將資料寫進表格相對應欄位,因此open內會對資料格式作處理。 // 即使兩者資料格式一模一樣,還是會透過DTO處理,避免日後資料修改新增)。 open(data?: IBKE0205LinkItem) { console.log({ data }); this.dialog = true; if (data) { const { imageData, ...etc } = data; // 因為資料從外部來所以在此解構 const { imageId } = imageData; // 因為資料從外部來所以在此解構 const { pageId } = this; // 因為資料從外部來所以在此解構 this.form = new BKE0205EditLinkReqDTO({ ...etc, pageId, imageId }); } } // ========== TypeScript 畫面 ========== export class BKE0205EditLinkReqDTO { // 將資料在建構式中作解構,以利此 class 在 new BKE0205EditLinkReqDTO()時,自動將資料帶入正確位置 constructor(data?: BKE0205EditLinkReqDTO) { // 問號表示 data 可能為空 if (!data) return; const { linkId = 0, pageId = 0, title = "", subTitle = "", desc = "", linkUrl = "", labelId = 0, beginDT = "", endDT = "", status = StatusEnum.ACTIVE, top = StatusEnum.ACTIVE, imageId = 0 } = data; this.linkId = linkId; this.pageId = pageId; this.title = title; this.subTitle = subTitle; this.desc = desc; this.linkUrl = linkUrl; this.labelId = labelId; this.beginDT = beginDT; this.endDT = endDT; this.status = status; this.top = top; this.imageId = imageId; } // 強型別語言本身就需要先定義資料型態 linkId?: number = 0; // Integer 連結ID pageId = 0; // Integer 頁面ID title = ""; // String 連結標題 subTitle = ""; // String 連結副標題 desc = ""; // String 連結簡介 linkUrl = ""; // String URL labelId = 0; // Integer 標籤ID beginDT = ""; // String 發布時間 YYYYMMDDhhmmss endDT = ""; // String 結束時間 YYYYMMDDhhmmss status = StatusEnum.ACTIVE; // String 上下架 Y / N top = StatusEnum.ACTIVE; // String 置頂 Y / N imageId = 0; // Integer 圖片ID } ``` TypeScript --- * `class` 的屬性和方法,都要先定義型別。 * `inerface` 內只定義型別,用於約束物件的型別用,例如 API 的回傳值、要傳入 `function` 的參數。沒有 `constructor` 所以不能 `new`(無法被量產)。 * 用`$refs`方法時,通常會搭配`<>`強轉型,如`(<any>this.$refs.douvuments).open(item)`; * ref 是標記在 html 元素上的`<tag-name ref="">`,`js`裡有防呆寫法`(<any>this.$refs.douvuments)?.open(item)`,`?`表示前方物件可能沒有,`data?:`表示該 `data` 可能為空 寫 Code 習慣 --- * 常量:全大小的變數命名方式,表示值不改變。 * 函式由 on 開頭 Vue --- * Vue component 繼承 Vue 的所有屬性跟方法 * get、set:Vue 把 get 跟 set 覆蓋掉 * get()、set()是prototype都會有的方法,下方寫法等同於A = "a",CCC將取得A = "a"; <!-- class CCC{ get A(){ return "a" } set A(){ return "a" } } --> ==看 evernote vuetify & vue 規則==