文章加密

;

2024年11月28日 星期四

(未讀)多閱讀鐵人賽的文章 / es歷年新增 和 generator 和 TypeScript 和 Testing

 https://ithelp.ithome.com.tw/users/20128534/ironman/4377


https://ithelp.ithome.com.tw/articles/10264271

https://ithelp.ithome.com.tw/m/users/20103315/ironman/4764

待看
https://jkchao.github.io/typescript-book-chinese/typings/literals.html#%E6%8E%A8%E6%96%AD
https://ithelp.ithome.com.tw/m/articles/10267302
https://www.explainthis.io/zh-hant/swe/why-use-monorepo

1. es歷年新增
https://medium.com/%E6%8B%89%E6%8B%89%E7%9A%84%E7%A8%8B%E5%BC%8F%E7%AD%86%E8%A8%98/%E8%A2%AB%E8%80%83%E5%80%92%E7%B3%BB%E5%88%97qq-es5-es6-es7-es8-es9-es10-c3dab7653373


2. generator
function *g1(){
    let products = ["Apple", "Banana", "Orange"]
    for(var i in products){
        yield products[i]
    }
}

for(product of g1()){
    console.log(product);
}
/* Output:
Apple
Banana
Orange
*/

注意到函式名稱前加了個星號(*)了嗎?然後yield配合上當下產生的產品。That's right! 就是這麼簡單。

var obj = g1();
console.log(obj); // => Object [Generator] {}
console.dir(obj.next()); // => { value: 'Apple', done: false }
console.dir(obj.next()); // => { value: 'Banana', done: false }
console.dir(obj.next()); // => { value: 'Orange', done: false }
console.dir(obj.next()); // => { value: undefined, done: true }
console.dir(obj.next()); // => { value: undefined, done: true }

生成器物件有next()方法可以取的下一件物品。得到的值會是一個有valuedone欄位。value就是預取得的物件,done在檢查是不是到盡頭沒材料了。




3.
為什麼是 TypeScript 和 React Testing 呢?主要是因為我認為有了這兩把刷子,將能夠大幅提升程式的可維護性,前者可以讓接手程式碼的人、甚至是三個月後的自己更容易知道當初寫的程式碼要怎麼用,後者可以避免未來重構或需求修改的時候發生自己意想不到的問題。

減少 Bug 並使得維護更加容易,比如:

  1. 打錯字(Typo)或寫錯變數、物件性質或方法的名稱。例如:String.prototype.toUppercase 以及 String.prototype.toUpperCase ,筆者到現在還是記不了到底字串要用哪種方法才能全部轉大寫,每次都要重新上網查挺麻煩的。但有了 TypeScript,它會自動幫我們提示要用後者 —— 也就是 toUpperCase 這個方法來避免錯誤。(如圖二)
  2. 可以避免類別或物件(Class & Object)的性質與方法(Property & Method)格式錯誤。例如:我們想要定義某類別必須包含 A 以及 B 方法,但是方法的型別也有很多種類,有時候需不需要回傳新的值也是一個問題。我們可以藉由 TypeScript 自動確認我們寫的方法有沒有回傳相對應的型別與格式
  3. 藉由 TypeScript 在 IDE 上的 Autocomplete Feature 來協助開發並且防止錯誤。(如圖一)

ts, 特別注重css

css:

1.
父元素底下的子元素間距離左邊的元素間格8px並且不加在最後一個元素上,省了寫not last child的部分
.alert {
  padding:10px;
  >*+* {
     margin-left: 8px;
   }
}




2. v-bind在css 是vue3的var() 語法糖

限制與注意事項

  1. 數值需自行加單位
    如果綁定的值是數字,記得附加單位,例如:

    margin-top: v-bind(gap + 'px');
  2. 僅支持樣式作用域內
    v-bind() 只能用在 <style scoped> 中,不能直接用於全局樣式。

  3. 瀏覽器兼容性
    這依賴於 CSS 變數,因此需要現代瀏覽器的支持。


<template>
  <div class="box"></div>
</template>

<script>
export default {
  props: {
    gap: {
      type: String,
      default: '10',
    },
  },
};
</script>

<style scoped lang="scss">
.box {
  padding-top: v-bind(gap +'px'); // 將 props.gap 動態綁定到 CSS
}
</style>



// 以下 var()
<template>
  <div class="dynamic-box" :style="`--dynamic-color: ${color};`">
    Styled by props!
  </div>
</template>

<script>
export default {
  props: {
    color: {
      type: String,
      default: 'blue',
    },
  },
};
</script>

<style lang="scss">
.dynamic-box {
  background-color: var(--dynamic-color);
  padding: 10px;
  border: 1px solid var(--dynamic-color);
}
</style>



3.
  • :deep(.a + .a)
    這表示選擇作用域內類名為 .a 的元素,並選中其後直接緊接另一個 .a 元素的組合。這是正確且有效的寫法。

  • :deep(.a) { & + .a { } }
    這是一種嵌套的寫法,表示與上一個寫法等價,選擇 .a 元素,並設置它後面直接相鄰的 .a 元素樣式。

因此,兩種寫法的選擇器目的是相同的。


4. constant()env() 是 CSS 函數,用於訪問環境變數。這些變數通常由設備或瀏覽器設置,用於適配特定設備(例如具有瀏海的手機)。它們最常用於處理安全區域(safe area insets)的布局。


1. constant()

  • 概念constant() 是早期的 CSS 函數,曾被用來引用瀏覽器環境變數,例如 iOS Safari 中的安全區域(safe area)。
  • 狀態已被廢棄,現已由 env() 取代。
  • 支持情況:僅支持一些舊版的 iOS Safari(12 及更早版本)。

範例:

padding-top: constant(safe-area-inset-top);

在支持的瀏覽器中,這會將 padding-top 設置為設備頂部的安全區域高度。


2. env()

  • 概念env() 是現代 CSS 中推薦的方式,用於訪問環境變數,提供對設備特定屬性的支持,例如安全區域。
  • 支持情況:現代瀏覽器,包括 iOS Safari、Chrome 等。

範例:

padding-top: env(safe-area-inset-top);

這是目前標準方式,用來確保內容不會與瀏海等設備元素重疊。


使用場景

這兩個函數通常用於適配帶有安全區域的設備,尤其是 iPhone 帶有瀏海或圓角的情況。

常見環境變數

  • safe-area-inset-top:安全區域的上間距
  • safe-area-inset-bottom:安全區域的下間距
  • safe-area-inset-left:安全區域的左間距
  • safe-area-inset-right:安全區域的右間距

範例:

body { padding: env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left); }





結論

  • 如果需要兼容舊版 iOS Safari:可以同時使用兩者,例如:
    padding-top: constant(safe-area-inset-top); padding-top: env(safe-area-inset-top);
  • 在現代開發中,優先使用 env(),因為它是 CSS 的標準化功能且被廣泛支持。


5.字面量类型 ( Literal type )是 JavaScript 本身提供的一个准确变量

type Status = 'success' | 'error' | 'pending';  // 用|設定多的types,叫做union types 聯合型別

let requestStatus: Status = 'success'; // 僅允許這三種值


測驗練習:

function iTakeFoo(foo: 'foo') {}
const test = {
  someProp: 'foo'
};

iTakeFoo(test.someProp); // Error: Argument of type string is not assignable to parameter of type 'foo'

这是由于 test 被推断为 { someProp: string },我们可以采用一个简单的类型断言来告诉 TypeScript 你想推断的字面量:

function iTakeFoo(foo: 'foo') {}

const test = {
  someProp: 'foo' as 'foo'
};

iTakeFoo(test.someProp); // ok

或者使用类型注解的方式,来帮助 TypeScript 推断正确的类型:

function iTakeFoo(foo: 'foo') {}

type Test = {
  someProp: 'foo';
};

const test: Test = {
  // 推断 `someProp` 永远是 'foo'
  someProp: 'foo'
};

iTakeFoo(test.someProp); // ok

6.keyof 顧名思義就是把「物件型別(object type)」的 key 拿出來,但要留意的是,這裡提到的是「物件型別」,而不是真的「物件」,前者是 TypeScript 的型別,後者是 JavaScript 中的一個物件(object):

// Person 是一個 object type
type Person = {
  firsName: string;
  lastName: string;
};

// person 是 JavaScript 的 object (value)
const person = {
  firstName: 'Aaron',
  lastName: 'Chen',
};

2024年11月1日 星期五

vue3 component reactive 用:key

 https://michaelnthiessen.com/force-re-render/


vue3 component reactive 用:key

 component裡面不用加,加在父層就可以了