在開發專案時或多或少會採用 3rd party 套件進行開發,當套件出現問題時我們會有以下選擇:
- 裝作沒看到它,忽視。
- 自行開啟原始碼修復。
- 等待廠商更新來修復這些問題。
1 和 2 選項都很好,但我個人偏好採用第 3 項, 專業分工是我的中心思想,但問題來了,該如何自行更新,又或是如何檢查專案,按步驟說明如下:
在開發專案時或多或少會採用 3rd party 套件進行開發,當套件出現問題時我們會有以下選擇:
1 和 2 選項都很好,但我個人偏好採用第 3 項, 專業分工是我的中心思想,但問題來了,該如何自行更新,又或是如何檢查專案,按步驟說明如下:
Classic ASP 的 ADO 撰寫時遇到常數不存在的問題,例如:
1 | cmd.CreateParameter("v_CdEnt", adChar, adParamInput, 4, Request("ENTIDADE")) |
adChar 和 adParamInput 會因為不存在其常數而頻頻報錯,經查詢才發現是 VBScript 並不會內建這些常數,不只是 Classic ASP,Word、Excel 也一樣。
解決的方法有三種:
針對 TDataSet 進行聚集處理,如:加總 SUM、平均 AVG、計數 COUNT 等,也擴充正序 ForEach 和反序 ForEachReversed 函式讓開發者可以進一步處理每一筆資料。
源自:【學習筆記】React 边做边学(从零开始,包含Hooks)【25, 26. 彈出組件】一節。
課程中使用 Class 元件設計,CodeSandbox Demo1
看著 Panel 開開關關,心想使用 Functional 元件重新設計應該不是件難事,沒想到在做完之後跳出錯誤訊息:
Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: null.
訊息內大致上是說:在應該有值、元件的位置卻得到 null。原因是 ES6 在建立 Class 時會帶有 Instance,典型語法就是【this】應用,this 在 Functional 元件是不受支援的。
題外話,Classes 在 MDN 中對物件導向迷思的解釋:
ECMAScript 6 中引入了類別 (class) 作為 JavaScript 現有原型程式(prototype-based)繼承的語法糖。類別語法並不是要引入新的物件導向繼承模型到 JavaScript 中,而是提供一個更簡潔的語法來建立物件和處理繼承。實在是看不出 React 中用 Classes 來寫有簡潔的趨勢,不知你是否也和我有一樣想法?
重温 REACT Functional Component,本篇沒有完整結構,純筆記用途。
課程的主畫面排版由小到大依序由綠、黃、橙、紅高亮,配置如下:
黃色:同位階有 ToolBar 和 Products 元件,在 ProductList 下,分別處理產品搜尋和產品清單的顯示。
橙色:同位階有 Header 和 ProductList 元件,在 APP 下,分別處理產品搜尋和產品清單的顯示。
紅色:APP,最大容器,主畫面是也!
開發 JavaScript 前端程式時,為了架設方便性,會使用類似 CodeSandbox 的前端線上程式編輯器進行測試,開發速度很快,對學習有加乘效果。
缺點就是在需要和後端 API 進行連結測試時,內部的 Web Server 往往還沒有在網際網路上公開,當然也就無法完整測試前端效果。這時就可以使用【My JSON Server】來模擬後端應用。
作者:吳祐賓
在學習倉頡五代後,一直覺得微軟倉頡和新倉頡的倉頡四代碼表很不友善,一直到最近看到倉頡之友的【替換微軟倉頡碼表,盡享倉頡補完計劃的樂趣】,才知道原來微軟倉頡也可以更新碼表,終於能享受到輸入文字的樂趣了!
首先,本篇文章適用範圍:Windows 10 2004 版以上。
倉頡三代補完計劃替換碼表下載地址:https://github.com/Arthurmcarthur/Cangjie3-Plus/releases
倉頡五代補完計劃替換碼表下載地址:https://github.com/Jackchows/Cangjie5/releases
完成上述步驟後請重新開機,接下來就可以好好體驗倉頡五代所帶來的暢快輸入感!
相信更多愛用倉頡的愛好者不滿足於預設的內容。不過因為我個人沒用到進階設定,想要了解更多細節的倉頡愛好者,歡迎再閱讀補完計畫說明檔。
整體來說優點大於缺點,能暢快享受輸入文字的樂趣,在這邊分享給大家。
最近在李維老師的部落格看到關於 JSON 的新文章【RAD Studio的JSON處理效率】,主要在描述 TJSONReader 和 TJSONWriter 物件經過重新設計後所推出的 10.4.1,其效率提升的幅度。
對於專門寫中間層服務的我來說,JSON 也是門必須的功課(另一門是 XML for ClientDataSet),從李老師的文章可以得知使用的框架是【Readers and Writers JSON Framework】,在這邊引用官方新版文件內容:
在【理解 React useEffect 01】一文了解到 useEffect 的功能是:
useEffect 主要在呈現 (Render) 後觸發此 Hook 事件,並將取得的資料後再呈現到元件上。
也知道我們要怎麼在 useEffect 裡面拉 WebAPI 的資料;且已知 useEffect 再觸發的條件是:第二個參數【依賴 dependency】發生變化時,就會再觸發 useEffect 掛勾。
這一篇將會告訴各位,如何手動觸發 useEffect,達成程式碼重用的目標。
React 中,取得資料並呈現到畫面上一直是個難題,useEffect 就是讓元件呈現【副作用 (Side Effects) 效果】一樣,對我們造成了很大的【副作用】的【效果】。
useEffect 主要在呈現 (Render) 後觸發此 Hook 事件,並將取得的資料後再呈現到元件上。
在【How to fetch data with React Hook?】一文中卻提到:
Note: In the future, React Hooks are not be intended for data fetching in React. Instead, a feature called Suspense will be in charge for it.這句話中文大概的意思是:
未來 React Hooks 不會用在資料取得的場合,會改由 Suspense 取代。
可是 Suspense 也說明它不會取代 fetch、axios 等取得資料的 API,在目前有限的資料只知道未來還會變化,所以現階段學習 useEffect 是必須的,待情勢明朗後再來調整也來得及。
作者:吳祐賓
DevExtreme 是個很適合做後台的函式庫,官方的說明文件寫得很齊但也很零碎,整理文件後再繪製成心智圖方便學習。
本文內容參考來源:Create a DevExtreme Application
如果你使用 DevExtreme 模板從頭建立專案。它是個帶有導覽列和數個支援響應式佈局的展示視圖之簡單應用程式。
React 學習時一定要記得一個概念,它就是 JavaScript,不管看到什麼,或是沒看到什麼,它就是 JavaScript,而且是支援最新標準的 JavaScript。
為什麼會這樣說?是因為要有 ES6 的概念,看 React 程式碼才有機會看懂!例如,今天要說的主題:【解構賦值(Destructuring Assignment)】。
前陣子在陪好友練習 Cookie 操作時,無意間發現瀏覽器跳出一個奇怪的警告訊息:
若現在不理它,未來可能會被瀏覽器無視,所以先來了解要如何解決。
作者:吳祐賓
傳說中的回呼地獄(Callback hell) 圖:取自網路 |
Microsoft Office 2000/XP Sample Automation Server Wrapper Components |
var FExcelApp: Variant; function ExcelApp: Variant; function IsExcelInstalled: Boolean; var ClassID: TCLSID; strOLEObject: string; begin strOLEObject := 'Excel.Application'; Result := (CLSIDFromProgID(PWideChar(WideString(strOLEObject)), ClassID) = S_OK); end; begin if IsExcelInstalled then begin if VarIsEmpty(FExcelApp) then FExcelApp := CreateOleObject('Excel.Application'); Result := FExcelApp; end else WinMsgBox.WinError('Not found Excel, call EdenWu, please.'); end; procedure CloseExcelApp; begin if not VarIsEmpty(FExcelApp) then begin FExcelApp.ActiveWorkBook.Saved:= 1; FExcelApp.DisplayAlerts:= 0; FExcelApp.ActiveWorkBook.Close(SaveChanges:=0); FExcelApp.Quit; VarClear(FExcelApp); FExcelApp:=Unassigned; end; end; initialization //FExcelApp := unassinged; // this should not be necessary finalization CloseExcelApp;
一種新興的JSON Remote Procedure Call (RPC)規範REST API寫多了,不是發展出一套龐大的路由切換器就是龐大的參數解析器
/person/id
/friend/id
/person/id/friend
...
persion_id=id
friend_id=id
...
一個 form post 也可以繞個一大圈 |
<form action="http://localhost:8080/login" method="post">
<h1>Form Action Test</h1>
<input type="text" name="email" value="Eden" />
<input type="password" name="password" value="L@veEden" />
<input type="submit" value="Submit">
</form>
<form id="login-form" onsubmit="handleSubmit(event)">
<input type="text" name="email" value="Eden" />
<input type="password" name="password" value="L@veEden" />
<input type="submit" value="Submit">
</form>
<script>
function handleSubmit(event) {
event.preventDefault()
let formData = new FormData(document.getElementById('login-form'))
fetch("http://localhost:8080/login", {
method: "POST",
body: formData
})
}
</script>
<form id="login-form" onsubmit="handleSubmit(event)">
<input type="text" name="email" value="Eden" />
<input type="password" name="password" value="L@veEden" />
<input type="submit" value="Submit">
</form>
<script>
function handleSubmit(event) {
event.preventDefault()
let formElement = document.getElementById("login-form")
let formData = ""
formData = "email=" + formElement[0].value
formData = formData + "&password=" + formElement[1].value
fetch("http://localhost:8080/login", {
method: "POST",
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
body: formData
})
}
</script>
<html>
<head></head>
<body>
<form id="login-form" onsubmit="handleSubmit(event)">
<input type="text" name="email" value="Eden" />
<input type="password" name="password" value="L@veEden" />
<input type="submit" value="Submit">
</form>
<script>
function handleSubmit(event) {
event.preventDefault()
let formData = new FormData(document.getElementById('login-form'))
var searchParams = new URLSearchParams(formData);
fetch("http://localhost:8080/login", {
method: "POST",
headers: {'Content-Type': 'application/x-www-form-urlencoded'},
body: searchParams
})
}
</script>
</body>
</html>
<html> <head> <script src="https://code.jquery.com/jquery-3.6.0.js" integrity="sha256-H+K7U5CnXl1h5ywQfKtSj8PCmoN9aaq30gDh27Xc0jk=" crossorigin="anonymous"></script> </head> <body> <form id="login-form" onsubmit="handleSubmit(event)"> <input type="text" name="email" value="Eden" /> <input type="password" name="password" value="L@veEden" /> <input type="submit" value="Submit"> </form> <script> function handleSubmit(event) { event.preventDefault() const formData = {user:document.getElementByName("user").value, password:document.getElementByName("password").value} // item 的內容也可以用 $.ajax.beforeSend 替換 const item = { 'url': "http://localhost:8080/login", 'type': 'POST', 'headers': { 'Authorization': `Basic ${ base64Auth }`, }, //'contentType': false, // Default = application/x-www-form-urlencoded //'processData': false, // false = jq 不轉譯 Json to Parameters; Default=True 'data': formData } $.ajax(item) .done(function (response) { console.log(response) }) .fail(function (response) { console.log('Fail : ' + response.responseText) }) } </script> </body> </html>