Web 開發 11

今天完成了workshop2,進度有點慢,但是記錄一下極為愚蠢的一輪輪問答和思考~!(還是有點成就感的)

ps:【】內為我的提問

1?導入語句(ES6 模塊導入語法)

【import CatHappiness from "../modules/CatHappiness.js";//這種語句是怎么寫的,實際上我們需要手敲這個路徑嗎?】

這種導入語句(ES6 模塊導入語法)在 JavaScript/TypeScript 中用于引入其他文件中的模塊,路徑的寫法和是否需要手敲取決于具體開發場景和工具:

  1. 路徑的含義
    ../modules/CatHappiness.js?是相對路徑:

    • ..?表示當前文件所在目錄的上一級目錄
    • /modules/?是存放模塊的文件夾
    • CatHappiness.js?是具體的模塊文件
  2. 是否需要手敲路徑?

    • 簡單項目 / 新手階段:可能需要手動輸入,尤其是文件結構簡單時,直接根據文件夾層級關系編寫路徑即可。
    • 現代開發工具:幾乎不需要手敲!主流編輯器(如 VS Code)會自動提示路徑,輸入文件名時會自動補全相對路徑,甚至能識別文件移動后的路徑變更并自動修正。
    • 框架 / 構建工具:在 Vue、React 等框架中,還可以配置別名(如用?@?代替?src/?目錄)簡化路徑,進一步減少手動編寫的復雜度。

例如在 VS Code 中,輸入?import CatHappiness from './?后,編輯器會自動列出可選文件,選中即可自動生成正確路徑,無需手動拼寫。

2??ES6 模塊系統中的默認導出語法

(1)【export default CatHappiness;//這啥意思,這就導出為組件了嗎】

export default CatHappiness;?是 ES6 模塊系統中的默認導出語法,作用是將?CatHappiness?這個對象(可能是組件、類、函數等)暴露出去,供其他文件通過?import?語句引入使用。

是否導出為 “組件”,取決于?CatHappiness?本身是什么:

  • 如果?CatHappiness?是一個 React 組件(比如函數組件或類組件)、Vue 組件等,那么這行代碼就會將其作為默認組件導出。
  • 如果它是一個普通的類、函數或對象,這行代碼只是導出這個實體,不一定是 “組件”。

默認導出的特點:

  • 一個文件中只能有一個?export default(默認導出)。
  • 引入時可以自定義名稱,比如?import MyCat from '../modules/CatHappiness.js'?也是合法的。
  • 與 “命名導出”(export const CatHappiness = ...)不同,默認導出在導入時不需要加花括號?{}

所以這行代碼的核心是 “導出”,是否為 “組件” 取決于被導出的內容本身的類型。

(2)【就是要放在CatHappiness.js結尾的東東嗎?】

是的,通常這行代碼會放在?CatHappiness.js?文件的末尾,用于明確導出模塊的默認內容。

具體來說,一個完整的?CatHappiness.js?文件結構可能是這樣的:

javascript

// 定義 CatHappiness(可能是組件、類、對象等)
const CatHappiness = {// ... 具體邏輯
};// 或者是一個函數組件
function CatHappiness() {// ... 組件邏輯
}// 在文件末尾導出,供其他文件導入使用
export default CatHappiness;

這樣的寫法符合模塊化開發的規范:先定義內容,最后通過?export default?明確導出,讓其他文件能清晰地知道這個模塊的默認導出是什么。

當然,也可以在定義時直接導出(比如?export default function CatHappiness() {...}),但放在末尾導出的方式更常見,尤其是當模塊邏輯較長時,能讓代碼結構更清晰。

(3)【類似于一個我寫完了這個組件,現在導出來它叫這個名字,你可以調用這個名字import使用】

完全理解非常準確!

可以這么理解:當你在?CatHappiness.js?中完成了組件的編寫后,用?export default CatHappiness;?這句話 “標記” 它 —— 相當于告訴程序:“這個組件我寫完了,對外公開的名字就叫?CatHappiness,其他文件可以通過這個名字來引入使用它”。

其他文件要用到時,就可以通過?import CatHappiness from '../modules/CatHappiness.js'?來 “召喚” 這個組件,之后就能像使用內置功能一樣調用它了。

這就像給組件貼了個標簽,方便其他地方 “按名取用”,是模塊化開發中非常基礎且重要的機制。

(4)【要是沒有這句還可以用嗎】

如果沒有?export default CatHappiness;?這句導出語句,其他文件無法通過?import?引入并使用這個組件,因為模塊系統默認會將文件內容封裝起來,不對外暴露。

具體來說:

  • 如果缺少導出語句,CatHappiness?就只是當前文件內部的一個 “局部變量”,外部文件無法訪問。
  • 此時若在其他文件中寫?import CatHappiness from '../modules/CatHappiness.js',會報錯(提示 “沒有默認導出”)。

如果不想用默認導出,也可以用命名導出的方式,例如:

javascript

// 在 CatHappiness.js 中
export const CatHappiness = { ... }; // 命名導出

然后在其他文件中這樣引入:

javascript

import { CatHappiness } from '../modules/CatHappiness.js'; // 注意加花括號

總之,必須通過?export?相關語法明確導出,其他文件才能使用該模塊中的內容,這是 JavaScript 模塊化規范的要求。

(5)【我明白了,就是一個命名導出封裝的操作,如果沒有寫在結尾或者根本沒寫就是不行的】

你的理解很到位!簡單來說:

  1. JavaScript 的模塊系統默認是 “封閉” 的,文件里的內容就像裝在一個封閉的盒子里。
  2. export(包括默認導出?export default?或命名導出?export const xxx)相當于在盒子上開了個 “出口”,讓外部能拿到里面的東西。
  3. 如果沒寫任何?export?語句,這個盒子就是完全封閉的,外部文件無法訪問里面的內容,自然也就無法使用?CatHappiness?了。

所以無論是放在結尾還是定義時直接導出(比如?export default function CatHappiness() {}),核心是必須有明確的導出語句,外部才能正常引入使用。這是模塊化開發的基本規則,確保了代碼的封裝性和依賴關系的清晰性。

3?什么時候要用到prop傳遞?

在 Web 組件開發(尤其是 React、Vue 等框架中),prop(屬性)是組件之間傳遞數據的核心方式。當你需要將數據從父組件傳遞到子組件時,就需要用到?prop

舉個簡單的例子理解:

假設你有兩個組件:

  • 父組件?App(管理貓咪的整體狀態)
  • 子組件?CatCard(展示單只貓咪的信息和幸福感)

當?App?中存儲了?catHappiness: 80?這個數據,而?CatCard?需要顯示這個 “幸福感數值” 時,就需要通過?prop?把數據傳過去:

jsx

// 父組件 App
function App() {const catHappiness = 80; // 父組件中的數據return (// 通過 prop 把數據傳給子組件,這里的 "happiness" 就是 prop 名稱<CatCard happiness={catHappiness} />);
}// 子組件 CatCard
function CatCard(props) {// 子組件通過 props 接收父組件傳來的數據return <div>貓咪幸福感:{props.happiness}分</div>;
}

什么時候需要用 prop 傳遞?

  1. 數據從父到子流動:當子組件需要依賴父組件的數據才能渲染時(比如上面的幸福感數值)。
  2. 組件復用場景:同一個子組件需要根據不同數據展示不同內容時(比如多個?CatCard?展示不同貓咪的幸福感)。
  3. 配置子組件行為:父組件可以通過 prop 控制子組件的樣式或功能(比如?<CatCard isHappy={true} />?控制顯示開心 / 不開心的表情)。

簡單說,prop?就像組件之間的 “快遞”,負責把父組件的信息安全送到子組件手中,是組件通信最基礎的方式。

(1)【當子組件需要依賴父組件的數據才能渲染時?什么意思,我設計了一個按鈕統計點擊次數作為貓咪幸福指數,也就是這個鼠標點擊輸入次數就是父組件的嗎?我怎么知道要用prop?】

我們結合你的 “按鈕統計點擊次數作為貓咪幸福指數” 的場景來理解,就很容易明白什么時候需要用 prop 了:

假設你的組件結構是這樣的:

  • 父組件CatDashboard(負責管理 “幸福指數” 數據,比如記錄按鈕點擊次數)
  • 子組件HappinessDisplay(負責展示幸福指數的數值和樣式)

為什么需要用 prop?

  1. 數據的 “歸屬權” 在父組件
    點擊次數(幸福指數)是通過父組件的按鈕產生的,這個數據應該 “存” 在父組件里(比如用?useState?管理)。
    子組件?HappinessDisplay?只負責 “展示”,不負責 “管理數據”,所以它需要父組件把數據 “傳” 給它。

  2. 具體代碼示例

    jsx

    // 父組件:管理數據(點擊次數)
    function CatDashboard() {// 幸福指數數據存在父組件const [catHappiness, setCatHappiness] = useState(0);// 點擊按鈕增加幸福指數const handleClick = () => {setCatHappiness(prev => prev + 1);};return (<div><button onClick={handleClick}>摸貓咪</button>{/* 通過 prop 把數據傳給子組件 */}<HappinessDisplay value={catHappiness} /></div>);
    }// 子組件:只負責展示,依賴父組件傳來的數據
    function HappinessDisplay(props) {// 通過 props 接收父組件的數據return <div>貓咪幸福指數:{props.value}</div>;
    }
    

怎么判斷什么時候用 prop?

核心看兩個問題:

  1. 數據是誰 “產生” 或 “擁有” 的?
    如果數據是 A 組件創建 / 修改的,A 就是 “數據所有者”(通常是父組件)。
  2. 另一個組件 B 是否需要用到這個數據?
    如果 B 組件需要用 A 的數據來渲染(比如展示、根據數據判斷樣式等),就必須通過 prop 從 A 傳到 B。

在你的場景中:

  • 點擊次數(幸福指數)由父組件的按鈕產生(父組件擁有數據)
  • 展示組件需要用這個數據來顯示具體數值(子組件依賴數據)
    所以必然需要用 prop 傳遞。

簡單說:數據在哪,誰需要用,就從哪傳到哪,這就是 prop 的核心用途。

4??state(狀態)的核心作用

state(狀態)的核心作用是管理 “會變化的數據”,而不是 “不會變的數據”。那些固定不變的常量(比如默認名稱、基礎樣式值)通常直接定義成普通變量就行,不需要用?state

我們結合你的 “貓咪幸福指數” 場景,具體說說?state?的作用和用法:

1.?state?管理 “會變化的數據”

state?是組件內部用來存儲動態數據的容器,當數據發生變化時,組件會自動重新渲染,更新頁面展示。

比如你的 “點擊次數統計”:

  • 初始點擊次數是?0(初始狀態)
  • 每次點擊按鈕,次數會?+1(狀態變化)
  • 頁面需要實時顯示最新的次數(狀態變化 → 重新渲染)

這時候就必須用?state?來管理,代碼示例:

jsx

function CatDashboard() {// 用 useState 定義一個“會變化”的狀態(初始值 0)const [catHappiness, setCatHappiness] = useState(0); // 點擊按鈕時,通過 setCatHappiness 修改狀態const handleClick = () => {setCatHappiness(prev => prev + 1); // 狀態更新,組件會重新渲染};return (<div><button onClick={handleClick}>摸貓咪</button><p>幸福指數:{catHappiness}</p> {/* 實時顯示最新狀態 */}</div>);
}

2. 不會變的數據,不用?state

如果數據從始至終都不會變(比如默認的標題、固定的提示文字),直接定義成普通變量即可,不需要?state

jsx

function CatDashboard() {// 不會變的常量,直接定義const catName = "咪咪"; // 固定名稱,不會變const maxHappiness = 100; // 最大指數,固定值// 會變化的點擊次數,用 state 管理const [catHappiness, setCatHappiness] = useState(0); return (<div><h2>{catName}的幸福指數</h2><button onClick={() => setCatHappiness(prev => Math.min(prev + 1, maxHappiness))}>摸一下</button><p>當前:{catHappiness}/{maxHappiness}</p></div>);
}

總結:state?的核心特點

  • 管理變化的數據:當數據需要隨著用戶操作(點擊、輸入等)或其他事件更新時,必須用?state
  • 觸發重新渲染state?一旦通過?setXxx?方法修改,組件會自動重新渲染,頁面展示最新數據。
  • 局部性state?是組件 “私有的”,默認只能在當前組件內使用;如果子組件需要,就通過?prop?傳遞(這就是?state?和?prop?經常配合使用的原因)。

簡單說:會變的、需要實時展示的數據用?state,不變的常量直接定義

5?no props 的組件

(1)【有的時候說no props 的組件其實就是沒有涉及到數據的吧?】

“no props 的組件”(即不接收任何 props 的組件)并不完全等同于 “沒有涉及到數據”,而是指它不依賴外部(父組件)傳來的數據,數據可能來自組件內部。

可以從兩個角度理解:

1. 完全無數據的組件(真正 “沒涉及數據”)

這類組件純粹是靜態 UI,不需要任何數據,只負責展示固定內容,比如:

  • 一個固定文本的提示框(“點擊按鈕增加貓咪幸福感”)
  • 一個靜態的裝飾性圖標(比如貓咪的默認頭像)

示例:

jsx

// 無 props,也無內部數據的組件
function CatIcon() {return <img src="cat-default.png" alt="貓咪圖標" />;
}

這類組件確實 “沒有涉及數據”,也不需要 props。

2. 有內部數據,但不依賴外部的組件(有數據,但 “no props”)

更常見的情況是:組件有自己的內部數據(用 state 管理),但這些數據不依賴父組件,所以不需要接收 props。

比如你的 “按鈕統計點擊次數”,如果這個功能完全在組件內部實現(數據自己存、自己用),就可以是一個 no props 組件:

jsx

// 有內部數據(點擊次數),但不需要 props 的組件
function CatHappinessCounter() {// 數據存在組件內部,不依賴外部const [count, setCount] = useState(0); return (<div><button onClick={() => setCount(c => c + 1)}>摸貓咪</button><p>幸福指數:{count}</p></div>);
}

這個組件有數據(count),但因為數據是自己產生和使用的,不需要父組件傳值,所以也是 “no props”。

總結

“no props” 的核心是組件不依賴外部數據,而不是 “沒有數據”。

  • 要么是純靜態 UI(真?無數據);
  • 要么是數據自給自足(有內部數據,不需要外部傳入)。

判斷是否需要 props,關鍵看:組件的數據是否需要從外部(父組件)獲取。如果不需要,就是 no props 組件~

(2)【ok,我遇見的第一個no props是一個靜態ui導航欄,數據自給自足的例子我還沒遇到過,也許就是,子組件自己有一個按鈕監聽鼠標的輸入,同時子組件自己處理好了數據,這個時候數據沒有在傳遞就不用prop,那么這時候的子組件是state嗎,還是不用定義?】

你的理解非常準確!這種 “自己有按鈕、自己處理數據” 的子組件,需要用?state?來管理自己的數據,因為數據是動態變化的(比如點擊次數會變),但不需要?props,因為數據不需要和外部組件交互。

舉個具體例子:一個子組件?CatPetButton,自己有個按鈕,點擊后記錄次數(作為內部的幸福值),并自己顯示結果。這種組件就是 “有?state?但無?props” 的典型:

jsx

// 子組件:有自己的 state(數據),但不需要 props
function CatPetButton() {// 用 state 管理自己的動態數據(點擊次數)const [petCount, setPetCount] = useState(0);// 自己處理點擊事件,更新內部 stateconst handlePet = () => {setPetCount(prev => prev + 1);};// 自己展示自己的數據return (<div className="cat-button"><button onClick={handlePet}>摸貓咪</button><p>被摸了 {petCount} 次,貓咪很開心!</p></div>);
}// 父組件使用時,直接調用,不用傳任何 props
function ParentComponent() {return (<div><h1>貓咪互動區</h1><CatPetButton /> {/* 不需要傳 props,組件自己搞定一切 */}</div>);
}

關鍵點:

  1. 需要?state:因為按鈕點擊會導致數據變化(petCount?從 0→1→2...),而且需要實時顯示最新結果,所以必須用?state?來跟蹤這個變化。
  2. 不需要?props:因為數據的產生(點擊)、存儲(petCount)、使用(顯示次數)全在組件內部完成,不需要和外部(父組件)交換數據,所以不用?props

這種組件的特點是 “自給自足”:自己處理用戶交互,自己管理狀態,自己展示結果,完全獨立于其他組件。這在一些功能單一、無需和外部交互的組件中很常見~

6?具體要怎么使用prop?

在使用?prop?時,確實有幾種常見的寫法,核心都是 “父組件傳值,子組件接收”,但形式上略有不同。結合你的代碼場景,我們一步步說清楚具體怎么用:

一、最基礎的用法:完整寫法

1. 父組件傳遞 prop

就是你代碼中寫的:

jsx

// 父組件中
<div className="Profile-subContainer"><CatHappiness catHappiness={catHappiness} /> {/* 左邊 `catHappiness` 是 prop 名稱(子組件接收時用),右邊是父組件的變量(要傳遞的數據) */}
</div>

這里的邏輯是:把父組件中名為?catHappiness?的數據,通過一個叫?catHappiness?的 “通道”(prop 名稱)傳給子組件。

2. 子組件接收 prop

子組件通過?props?參數獲取父組件傳來的值:

jsx

// 子組件 CatHappiness.js 中
function CatHappiness(props) {// 用 props.xxx 獲取,xxx 就是父組件定義的 prop 名稱return <div>幸福指數:{props.catHappiness}</div>; 
}export default CatHappiness;

二、更簡潔的寫法:解構賦值

如果子組件需要接收多個 prop,或者想簡化代碼,可以用對象解構直接提取 prop:

jsx

// 子組件中直接解構 props
function CatHappiness({ catHappiness }) { // 直接用 catHappiness,不用寫 props. 前綴return <div>幸福指數:{catHappiness}</div>; 
}

這種寫法更常用,尤其是在 React 中,代碼會更簡潔。

三、特殊情況:傳遞靜態值

如果傳遞的不是變量,而是固定值(比如字符串、數字),可以直接寫值,不用加?{}

jsx

// 傳遞靜態字符串(不用加引號,除非有空格)
<CatHappiness title="貓咪幸福指數" />// 傳遞靜態數字
<CatHappiness maxScore={100} />

子組件接收時同樣用?props.title?或?{ title }?獲取。

四、總結:使用 prop 的完整流程(以你的場景為例)

  1. 父組件準備數據
    父組件中必須有一個變量(比如?catHappiness),它可能是?state(會變化的數據)或普通變量(靜態數據)。

    jsx

    // 父組件中定義數據(比如用 state 管理)
    const [catHappiness, setCatHappiness] = useState(0); 
    
  2. 父組件傳遞 prop
    通過?<子組件 自定義名稱={數據} />?的形式傳遞,比如:

    jsx

    <CatHappiness catHappiness={catHappiness} />
    
  3. 子組件接收并使用
    子組件通過?props?或解構獲取,然后在渲染中使用:

    jsx

    // 子組件
    function CatHappiness({ catHappiness }) {return (<div><p>當前幸福值:{catHappiness}</p>{/* 可以根據值做邏輯處理,比如判斷是否開心 */}{catHappiness > 5 && <p>貓咪超開心!</p>}</div>);
    }
    

關鍵原則:

  • 名稱一致:父組件定義的 prop 名稱(如?catHappiness),和子組件接收時用的名稱必須完全一樣。
  • 單向流動:數據只能從父組件傳到子組件,子組件不能直接修改 prop(如果要改,需要通知父組件改,這是另一個知識點了)。

按照這個流程,你代碼中的?catHappiness?就能從父組件傳到子組件并顯示了,試試吧~

7 具體分析一段代碼的prop

代碼

<div className="Profile-subContainer u-textCenter"><h4 className="Profile-subTitle">Cat Happiness</h4><CatHappiness catHappiness={catHappiness} />
</div>

我們就以你這段代碼為例,把?prop?的用法拆成 “父組件做什么” 和 “子組件做什么” 兩部分,一步步說清楚:

一、先看父組件里的代碼

jsx

<div className="Profile-subContainer u-textCenter"><h4 className="Profile-subTitle">Cat Happiness</h4>{/* 重點看這一行 */}<CatHappiness catHappiness={catHappiness} />
</div>

這里的?<CatHappiness catHappiness={catHappiness} />?就是父組件給子組件傳 prop 的操作,可以拆成兩個部分理解:

  1. 左邊的?catHappiness(等號左邊):
    這是你給這個 “數據通道” 起的名字,相當于給包裹數據的快遞盒貼了個標簽,告訴子組件:“這個盒子里的東西叫 catHappiness”。

  2. 右邊的?{catHappiness}(等號右邊,帶大括號):
    這是父組件里真正要傳遞的數據。這個?catHappiness?通常是父組件里的一個變量(可能是?state?管理的動態數據,比如點擊次數的計數器)。
    大括號?{}?是 JSX 的語法,表示這里要插入 JavaScript 變量,而不是普通字符串。

二、再看子組件(CatHappiness.js)要做什么

子組件的任務是 “接收并使用” 父組件傳過來的?catHappiness?數據,有兩種常見寫法:

寫法 1:直接?props?對象獲取

jsx

// CatHappiness.js
function CatHappiness(props) {// 通過 props.標簽名 拿到數據,這里的標簽名就是父組件定義的 catHappinessreturn <div>當前幸福指數:{props.catHappiness}</div>;
}export default CatHappiness;
寫法 2:用解構賦值簡化(更常用)

jsx

// CatHappiness.js
// 直接從 props 里“拆包”出 catHappiness,省掉 props. 前綴
function CatHappiness({ catHappiness }) {return <div>當前幸福指數:{catHappiness}</div>;
}export default CatHappiness;

三、舉個完整的例子,把流程串起來

假設父組件是?Profile,里面有個按鈕計數器?catHappiness,要傳給子組件?CatHappiness?顯示:

jsx

// 父組件:Profile.js
import { useState } from 'react';
import CatHappiness from './CatHappiness.js'; // 導入子組件function Profile() {// 父組件里的動態數據(用 state 管理,會變化)const [catHappiness, setCatHappiness] = useState(0);// 點擊按鈕讓指數+1const handleClick = () => {setCatHappiness(prev => prev + 1);};return (<div><button onClick={handleClick}>摸貓咪</button>{/* 把 catHappiness 傳給子組件 */}<div className="Profile-subContainer u-textCenter"><h4 className="Profile-subTitle">Cat Happiness</h4><CatHappiness catHappiness={catHappiness} /></div></div>);
}

jsx

// 子組件:CatHappiness.js
function CatHappiness({ catHappiness }) {// 直接到父組件傳來的指數,直接用return (<div><p>貓咪次數:{catHappiness}</p>{catHappiness > 3 && <p>貓咪咪次數貓咪很開心!</p>}</div>);
}export default CatHappiness;

四、核心邏輯一句話總結

父組件通過?<子組件 標簽名={數據} />?把數據打包,子組件通過?{標簽名}?拆包使用,這個 “標簽名” 就是?prop?的名字(這里的?catHappiness)。

你可以把它想象成:父組件給子組件寄快遞,快遞單上寫的收件人是?catHappiness(prop 名),里面的東西是父組件的?catHappiness?變量(數據),子組件收到后,按快遞單上的名字?catHappiness?取件就行。

這樣是不是就具體多啦?

7 愚蠢的提問:其實react庫里面比較重要的是不是就是props和state了,還有什么別的要掌握嗎?

props?和?state?確實是 React 的核心基礎,但要完整掌握 React 開發,還有幾個非常重要的概念和特性需要了解,它們會在實際開發中頻繁用到:

1.?組件生命周期(或 Hooks 生命周期替代)

  • 組件從創建到銷毀的過程中,會觸發一系列 “生命周期事件”(如組件首次渲染后、數據更新后、即將銷毀時)。

  • 現代 React 中,更推薦用?Hooks(如?useEffect)來處理生命周期邏輯,比如:

    • 組件首次加載后請求數據(useEffect?空依賴)
    • 數據變化時執行副作用(useEffect?依賴數組)
    • 組件卸載前清理資源(useEffect?返回清理函數)

    示例:

    jsx

    useEffect(() => {// 組件加載后執行(類似生命周期的 componentDidMount)const timer = setInterval(() => {}, 1000);// 組件卸載前執行(清理副作用)return () => clearInterval(timer);
    }, []); // 空依賴表示只執行一次
    

2.?事件處理

  • React 中處理用戶交互(點擊、輸入等)的方式和原生 JS 類似,但有語法差異:

    • 事件名用駝峰式(如?onClick?而非?onclick
    • 事件處理函數通過?{}?綁定(如?<button onClick={handleClick}>
    • 阻止默認行為需顯式調用?e.preventDefault()(不能 return false)

    示例:

    jsx

    function handleInputChange(e) {console.log('輸入內容:', e.target.value);
    }return <input type="text" onChange={handleInputChange} />;
    

3.?條件渲染與列表渲染

  • 條件渲染:根據數據判斷顯示不同內容(如登錄 / 未登錄狀態)

    jsx

    {isLoggedIn ? <UserInfo /> : <LoginButton />}
    
  • 列表渲染:用?map?遍歷數組生成組件,必須加?key?屬性

    jsx

    const cats = [{ id: 1, name: '咪咪' }, { id: 2, name: '花花' }];return (<ul>{cats.map(cat => (<li key={cat.id}>{cat.name}</li> // key 用于 React 優化渲染))}</ul>
    );
    

4.?表單處理

  • React 中表單通常用?受控組件?模式:表單值由?state?管理,通過?onChange?同步更新

    jsx

    function CatForm() {const [name, setName] = useState('');return (<inputtype="text"value={name} // 受控于 stateonChange={(e) => setName(e.target.value)} // 同步更新 state/>);
    }
    

5.?組件通信進階

  • 除了父子組件通過?props?通信,還有:
    • 子傳父:父組件傳一個函數給子組件,子組件調用該函數傳遞數據

      jsx

      // 父組件
      <Child onSendData={(data) => console.log('子組件傳來的數據:', data)} />// 子組件
      function Child({ onSendData }) {return <button onClick={() => onSendData('hello')}>傳數據</button>;
      }
      
    • 跨組件通信:用?Context?API 或狀態管理庫(如 Redux、Zustand),解決多層級組件數據共享問題。

6.?Hooks 擴展

  • 除了?useState?和?useEffect,還有很多實用 Hooks:
    • useContext:獲取 Context 中的數據(跨組件通信)
    • useRef:獲取 DOM 元素或存儲不觸發重渲染的數據
    • useReducer:復雜狀態邏輯的管理(類似簡化版 Redux)
    • 自定義 Hooks:封裝可復用的邏輯(如?useLocalStorageuseFetch

7.?路由(React Router)

  • 單頁應用(SPA)的頁面跳轉依賴路由庫?react-router-dom,核心概念:
    • <BrowserRouter>:路由容器
    • <Route>:定義路徑與組件的對應關系
    • <Link>:跳轉鏈接(類似?<a>?標簽,但不刷新頁面)
    • useNavigate:編程式導航(如登錄后跳轉到首頁)

這些概念都是從 “基礎使用” 到 “實際開發” 的必經之路,不用急于一次性掌握。可以按照 “先會用核心功能(props/state/ 事件)→ 處理常見場景(表單 / 列表)→ 學習進階特性(Hooks / 路由)” 的順序逐步深入,遇到具體需求時再針對性學習,效率會更高~

8?忘記import導入usestate

(1)【忘記import導入usestate了,usestate是一個函數還是什么的,我粗淺的認知里面{}花括號包裹的是jsx的東西,到底是什么?】

你的問題涉及到兩個核心點:useState?的本質,以及 JSX 中?{}?的作用。這倆其實是不同層面的概念,咱們拆開說清楚:

一、useState?是什么?—— 它是一個?React 提供的函數

useState?是 React 的?內置 Hook(鉤子函數),作用是讓函數組件擁有 “狀態管理” 能力。它的本質就是一個函數,需要從?react?庫中導入才能使用:

jsx

// 必須先導入才能用
import { useState } from 'react'; function MyComponent() {// 調用 useState 函數,初始化狀態(比如這里的 count 初始為 0)const [count, setCount] = useState(0); return <button onClick={() => setCount(count + 1)}>{count}</button>;
}

  • 它的返回值是一個數組,里面有兩個元素:當前狀態(比如?count)和更新狀態的函數(比如?setCount)。
  • 之所以用?{}?包裹著導入(import { useState } from 'react'),是因為?useState?是 React 庫導出的?命名導出(named export),必須用花括號指定要導入的具體名稱。

二、JSX 中?{}?的作用 —— 插入 JavaScript 表達式

在 JSX 語法中(就是你寫的?<div>...</div>?這種類似 HTML 的代碼),{}?是一個 “開關”,用來告訴 React:這里面寫的是 JavaScript 代碼,需要執行后再渲染

比如:

jsx

function CatComponent({ catName, catAge }) {// 定義一個 JS 變量const isAdult = catAge >= 1; return (<div>{/* 1. 插入變量 */}<p>貓名:{catName}</p> {/* 2. 插入表達式(運算、三元判斷等) */}<p>年齡:{catAge}歲,{isAdult ? '成年' : '幼貓'}</p> {/* 3. 插入函數調用結果 */}<p>下次生日:{new Date().getFullYear() + (1 - catAge % 1)}</p> </div>);
}

  • 注意{}?里只能放?表達式(有返回值的代碼,比如變量、1+1fn()、三元運算等),不能放語句(比如?iffor?循環這種沒有返回值的代碼塊)。
  • 這和導入時的?{}?完全不是一回事:導入時的?{}?是 ES6 模塊語法的一部分,用來指定命名導出;JSX 里的?{}?是 React 語法的一部分,用來嵌入 JS 邏輯。

總結一下

  • useState?是 React 提供的?函數,必須用?import { useState } from 'react'?導入(這里的?{}?是模塊導入語法)。
  • JSX 中的?{}?是?嵌入 JavaScript 表達式的語法,用來在 UI 中動態展示數據或執行簡單邏輯。

剛開始可能會混淆這兩種?{},但寫多了就會發現:一個是 “導入時用的”,一個是 “寫 UI 時用的”,場景完全不同,慢慢就會習慣啦~

(2)【hook鉤子?哦我感覺有點像py那種,比如先要導入一個numpy模塊,然后才可以用numpy模塊里面的方法,是這樣嗎,然后這里的usestate是react庫里面的一個方法函數,導入react庫里面的函數就是這樣的加一個{}的語法?。】

你的理解得非常對!這個類比很準確,確實抓住了核心邏輯:

  1. 和 Python 導入模塊的類比
    就像 Python 中需要先?import numpy?才能用?numpy.array()?一樣,React 中需要先導入?useState?才能使用它。

    • Python:from numpy import array(從 numpy 中導入 array 函數)
    • React:import { useState } from 'react'(從 react 中導入 useState 函數)

    這里的?{}?作用和 Python 的?from ... import ...?語法類似,都是從模塊中精準導入某個具體的功能(函數、變量等),而不是導入整個模塊。

  2. 為什么要用?{}?導入?useState
    因為?useState?是 React 庫中的命名導出(named export)

    • React 庫中同時存在兩種導出方式:
      • 默認導出(default export):比如?React?本身,導入時不用?{},如?import React from 'react'
      • 命名導出:比如?useStateuseEffect?這些 Hooks,導入時必須用?{}?并指定準確名稱,因為一個庫可能有多個命名導出,需要明確告訴程序 “你要哪個”。
  3. Hook 本質就是 “React 庫提供的函數”
    你可以把?useStateuseEffect?這些 Hook 理解為 React 內置的 “工具函數”,每個函數解決特定問題:

    • useState:專門用來管理組件狀態的函數。
    • useEffect:專門用來處理組件副作用(如請求數據、定時器)的函數。

    它們和 Python 中?numpy?里的?arraypandas?里的?DataFrame?本質一樣 —— 都是 “庫提供的、拿來就能用的工具”,只是語法上因語言不同而有差異。

所以你的理解完全正確:導入?useState?就像導入 Python 模塊里的特定方法,{}?是 JavaScript 中 “精準導入命名導出” 的語法,而 Hook 本身就是 React 庫提供的實用函數。用多了之后,這種導入和使用方式會變得和 Python 一樣自然~

9 有關花括號...

(1)【我前面也遇到了一個花括號{},就是這段代碼里面包裹的cathappiness。

<div className="Profile-subContainer u-textCenter"> <h4 className="Profile-subTitle">Cat Happiness</h4> <CatHappiness catHappiness={catHappiness} />

</div>

//然后,我覺得這個地方是因為我導入的cathappiness是一個js文件吧,啊,到底是怎么詳細的理解,js里面導js?】

這段地方的花括號?{}?和導入導出是兩個不同的概念,咱們分兩步拆解清楚:

一、先明確:CatHappiness?組件的導入邏輯(JS 文件之間的引用)

你提到的 “JS 里面導 JS” 是對的 ——React 項目中,組件通常放在單獨的 JS/JSX 文件里,使用時需要先導入才能用,這和 Python 中?from xx import xx?引用其他模塊的邏輯一致。

假設你的?CatHappiness?組件在?CatHappiness.js?中,并且用?export default?導出:

jsx

// CatHappiness.js
function CatHappiness({ catHappiness }) {return <div>{catHappiness}</div>;
}// 默認導出(default export)
export default CatHappiness;

那么在父組件(比如?Profile.js)中,需要先導入這個組件才能使用:

jsx

// Profile.js
// 從 CatHappiness.js 文件中導入默認導出的組件
import CatHappiness from './CatHappiness'; // 注意路徑要寫對// 然后才能在 JSX 中使用 <CatHappiness /> 標簽
function Profile() {const catHappiness = 5;return (<div><CatHappiness catHappiness={catHappiness} /></div>);
}

這里的關鍵是:

  • 組件文件(CatHappiness.js)通過?export default?對外 “暴露” 組件。
  • 父組件文件(Profile.js)通過?import?把這個組件 “拿過來用”。
  • 這就是 “JS 導 JS” 的核心:模塊化復用代碼。

二、再看?catHappiness={catHappiness}?中的花括號:JSX 中嵌入變量

當你已經成功導入?CatHappiness?組件后,在使用時寫的?<CatHappiness catHappiness={catHappiness} />,這里的?{catHappiness}?是另一個邏輯:

  • 等號左邊的?catHappiness:是傳遞給子組件的?prop 名稱(自定義的標簽名)。
  • 等號右邊的?{catHappiness}:這里的花括號是?JSX 語法,表示 “這里要插入一個 JavaScript 變量”。

這個?catHappiness?變量是父組件自己定義的(可能是普通變量或?state),比如:

jsx

function Profile() {// 父組件自己的變量const catHappiness = 80; // 普通變量// 或者是 state 變量:const [catHappiness, setCatHappiness] = useState(0);return (// 把父組件的 catHappiness 變量,通過 prop 傳給子組件<CatHappiness catHappiness={catHappiness} />);
}

簡單說:這個花括號的作用是 “告訴 React,把我父組件里的?catHappiness?變量的值取出來,傳給子組件”。

總結兩個核心點

  1. 組件的導入導出

    • CatHappiness.js?用?export default CatHappiness?導出組件。
    • 父組件用?import CatHappiness from './路徑'?導入組件,這樣才能在 JSX 中寫?<CatHappiness />?標簽。
      這是 “JS 文件之間共享代碼” 的方式。
  2. JSX 中的花括號?{}

    • 在?<CatHappiness catHappiness={catHappiness} />?中,右邊的?{catHappiness}?是為了嵌入父組件的變量,讓子組件能拿到這個值。
      這是 “在 JSX 中插入 JavaScript 變量” 的語法。

兩者的關系是:先通過導入導出讓組件可用,再通過帶花括號的 prop 傳遞數據 —— 前者是 “組件能用”,后者是 “組件能拿到數據”,缺一不可~

(2)【咋涉及到 JSX 語法了,不是js嗎?】

你觀察得很仔細!這里確實涉及到一個重要區別:JSX 是 JavaScript 的 “擴展語法”,它長得像 HTML,但本質上是 JavaScript 的一部分,專門用于在 React 中描述 UI。

具體來說:

  1. 純 JavaScript(.js)文件可以包含 JSX
    雖然文件后綴是?.js,但 React 項目會通過工具(如 Babel)把 JSX 語法 “翻譯” 成普通 JavaScript 代碼。比如你寫的?<CatHappiness />,最終會被轉換成 React 函數調用:React.createElement(CatHappiness, ...)

    所以,你的?.js?文件里其實可以同時包含:

    • 普通 JavaScript 代碼(變量、函數、import/export?等)
    • JSX 語法(類似 HTML 的標簽,用于描述 UI)
  2. JSX 中的?{}?是它的專屬語法
    在 JSX 里(也就是就是那些類似 HTML 的標簽中),{}?是專門用來嵌入普通 JavaScript 代碼的 “接口”。比如:

    jsx

    // 這是 JSX 語法(寫在 return 后面的標簽部分)
    return (<div>{/* 這里的 {catHappiness} 就是用 JSX 的 {} 嵌入變量 */}<CatHappiness catHappiness={catHappiness} /></div>
    );
    

    這個?{}?是 JSX 語法的一部分,和普通 JavaScript 里的對象字面量(如?{ name: 'xxx' })完全不同。

  3. 一句話總結

    • 你的文件是?.js?文件,里面主要寫的是 JavaScript 代碼。
    • 但為了方便描述 UI,React 允許在 JavaScript 中使用 JSX 語法(類似 HTML 的標簽)。
    • 在 JSX 標簽里,用?{}?來 “打通” JSX 和普通 JavaScript(比如插入變量、表達式)。

簡單說,JSX 就像是 JavaScript 的 “UI 方言”—— 它基于 JS,專門用來寫界面,而?{}?就是這個方言里 “引用原生 JS 內容” 的語法。這也是 React 設計的巧妙之處:讓你在同一個文件里既能寫邏輯(JS),又能寫界面(JSX)。

(3)【這樣啊,那就是要看我具體編碼是不是為了寫ui吧,如果在js文件里面寫ui就要講“方言”jsx,也就涉及到了花括號的引入js模塊的語法】

你的理解非常到位!可以這么簡單歸納:

  • 當你在?.js?文件里寫邏輯(比如定義變量、函數、處理數據)時,用的是純 JavaScript 語法(比如?const a = 1function fn() {})。
  • 當你在?.js?文件里寫 UI(比如組件的渲染內容,通常在?return?后面)時,用的是JSX 語法(類似 HTML 的標簽,比如?<div>...</div>)。
  • 而 JSX 里的?{}?就是這個 “UI 方言” 的 “翻譯器”—— 當你需要在 UI 中插入 JavaScript 邏輯(比如變量、表達式)時,就用?{}?把 JS 代碼包起來,告訴 React:“這部分是純 JS,幫我執行后再顯示到 UI 里”。

舉個直觀的例子,同一個?.js?文件里的兩種語法:

jsx

// 這里是純 JavaScript 邏輯(定義變量、函數)
function CatProfile() {const catName = "咪咪"; // 純 JS 變量const happiness = 90;   // 純 JS 變量// 這里開始是 JSX(描述 UI),用了 JSX 語法return (<div className="cat-card">{/* 用 JSX 的 {} 插入純 JS 變量 */}<h3>名字:{catName}</h3><p>幸福值:{happiness}</p>{/* 用 JSX 的 {} 插入 JS 表達式 */}<p>狀態:{happiness > 80 ? "超開心" : "一般般"}</p></div>);
}

所以核心就是:寫邏輯用純 JS,寫 UI 用 JSX 方言,{}?是兩者的連接橋。用多了之后,你會自然區分什么時候用哪種語法,就像切換 “說話方式” 一樣自然~

10 報錯:Uncaught ReferenceError: props is not defined

這個錯誤通常是因為在子組件中使用了?props?但沒有正確接收它導致的。具體有兩種常見情況和解決方法:

情況 1:子組件沒有聲明?props?參數

如果你的子組件代碼里直接用了?props.xxx,但函數參數里沒寫?props,就會報這個錯。

錯誤示例

jsx

// 子組件 CatHappiness.js
function CatHappiness() { // 這里沒寫 props 參數return <div>{props.catHappiness}</div>; // 直接用 props 就會報錯
}

解決方法:在函數參數里加上聲明?props

jsx

function CatHappiness(props) { // 加上 props 參數return <div>{props.catHappiness}</div>; // 現在可以正常使用了
}

情況 2:用了解構賦值但寫錯了格式

如果你想用更簡潔的解構語法({ catHappiness }),但不小心寫成了?props?或漏了大括號,也會報錯。

錯誤示例

jsx

// 錯誤寫法1:用了解構卻寫了 props
function CatHappiness(props) {return <div>{catHappiness}</div>; // 沒寫 props. 也沒解構,直接用變量會報錯
}// 錯誤寫法2:解構時漏了大括號
function CatHappiness(catHappiness) { // 應該是 { catHappiness }return <div>{catHappiness}</div>;
}

解決方法:正確使用解構賦值,在參數里用?{ }?包裹需要的屬性:

jsx

function CatHappiness({ catHappiness }) { // 正確解構return <div>{catHappiness}</div>; // 可以直接用變量
}

總結

核心問題是?“子組件沒有正確接收父組件傳來的 props”,解決步驟:

  1. 檢查子組件的函數參數,確保有?props?或?{ 需要的屬性 }
  2. 使用時,要么用?props.屬性名,要么直接用解構后的?屬性名

按這兩種方式修改后,props is not defined?的錯誤就會消失啦~

11?onClick是內置的寫好的嗎,是react庫自己帶的方法嗎?

是的,onClick?是 React 內置的事件處理屬性,屬于 React 庫本身提供的特性,專門用于處理點擊事件。

它的特點和原理:

  1. React 封裝的合成事件onClick?并不是原生 JavaScript 的?onclick?事件,而是 React 對原生事件進行的封裝(稱為 “合成事件”),目的是統一不同瀏覽器的事件行為,讓事件處理在各種瀏覽器中表現一致。

  2. 語法規范:React 中所有事件屬性都采用駝峰命名法(camelCase),所以是?onClick?而不是原生 HTML 的?onclick

  3. 使用方式:必須通過花括號?{}?綁定一個函數(事件處理函數),比如:

    jsx

    // 正確:綁定一個函數
    <button onClick={handleClick}>點擊我</button>// 錯誤:直接寫執行語句(會導致頁面加載時就執行)
    <button onClick={handleClick()}>點擊我</button>
    

簡單說,onClick?是 React 為開發者提供的 “現成工具”,專門用來處理點擊交互,不需要自己定義,直接按照 React 的規范使用即可。類似的還有?onChange(輸入變化)、onSubmit(表單提交)等,都是 React 內置的事件處理屬性。

12?React、Vue 以及 Angular 等

(1)【react應該就是js用于寫website的一個庫,那我有時候會看到的vue還有別的是什么意思,別的框架?框架是這么說的嗎?】

你的理解很準確!React、Vue 以及 Angular 等,都屬于前端 JavaScript 框架 / 庫,它們的核心目標都是幫助開發者更高效地構建網頁(website)或 web 應用,但在設計理念和使用方式上有所不同。

先明確兩個概念:

  • 庫(Library):更專注于解決特定問題(比如 React 核心專注于 “UI 渲染” 和 “組件化”),你可以按需引入,靈活控制使用范圍。
  • 框架(Framework):提供了一整套 “完整解決方案”,規定了代碼的組織方式、項目結構等,你需要按照框架的規則來寫代碼(比如 Vue 有更明確的模板語法和項目規范)。

不過日常交流中,大家常常會把 “庫” 和 “框架” 混用,比如把 React 也稱為 “框架”,不用太糾結字面區別,重點是它們的定位。

常見的前端框架 / 庫及其特點:

  1. React(你正在學的)

    • 由 Facebook 開發,核心思想是 “組件化” 和 “聲明式 UI”(用 JSX 描述 UI 應該是什么樣,而不是怎么實現)。
    • 靈活性極高,沒有嚴格規定項目結構,適合大型復雜應用(比如 Facebook、Instagram)。
    • 生態非常豐富,需要搭配路由(React Router)、狀態管理(Redux 等)等庫一起使用。
  2. Vue

    • 由尤雨溪開發,更注重 “易用性” 和 “漸進式”(可以一點點引入到項目中,不用一次性全用)。
    • 提供了更接近 HTML 的 “模板語法”(比如?<div>{{ message }}</div>),對新手更友好。
    • 內置了很多功能(比如狀態管理、路由的官方解決方案),開箱即用的體驗更好。
  3. Angular

    • 由 Google 開發,是一個 “全功能框架”,包含了從 UI 到數據處理的全套工具。
    • 基于 TypeScript(JS 的超集,帶類型),適合大型團隊協作和企業級應用。
    • 學習曲線較陡,規則比較多,但規范性強。
  4. 其他:比如 Svelte(編譯時框架,性能極好)、Solid(類 React 但更輕量)等,各有側重。

為什么會有這么多框架?

就像做蛋糕可以用不同的模具和方法 —— 有的模具適合做復雜造型(React),有的操作簡單適合新手(Vue),有的自帶全套工具(Angular)。它們都是為了解決原生 JS 開發網頁時的痛點(比如代碼混亂、復用性差、狀態難管理等),只是思路不同。

對你的建議:

現階段先專注學好 React,把它的核心概念(組件、props、state、Hooks 等)吃透。等你有了一定基礎,再看其他框架時,會發現很多思想是相通的(比如組件化、狀態管理),學起來會很快。

前端框架的選擇更多看項目需求和團隊習慣,掌握其中一個深入使用,足以應對大部分開發場景~

(2)【只不過都是js語法下的庫而已,每個庫都有自己的函數,有自己的方法,就是做蛋糕選模具哪個順手用哪個,看各自的優點吧,應該相差不會很大,學會一個上手別的應該不會很難(我猜的】

你這個比喻和判斷都特別準!確實是這樣:

  1. 核心相通:所有這些框架 / 庫都基于 JavaScript,共享 JS 的核心語法(變量、函數、對象、數組等)和 Web 基礎(DOM、事件、HTTP 等)。就像不管用什么模具做蛋糕,面粉、雞蛋這些基礎原料是一樣的。

  2. 差異是 “招式” 而非 “內功”:不同框架的 “獨特語法”(比如 React 的 JSX、Vue 的模板指令、Angular 的裝飾器)更像是不同的 “招式”,但解決的核心問題(組件復用、狀態管理、UI 渲染)高度重合。比如:

    • React 的?props?和 Vue 的 “Props” 作用完全一樣(父傳子數據)
    • React 的?useState?和 Vue 的?ref/reactive?都是為了管理狀態
    • 事件處理(點擊、輸入)的邏輯本質相同,只是寫法略有差異(onClick?vs?@click
  3. 學會一個再學其他,會有 “降維感”:當你吃透 React 后,再看 Vue 會發現 “哦,這個功能 React 里是那么實現的,Vue 只是換了種寫法”。很多開發者都是掌握一個框架后,再快速上手其他框架,因為底層邏輯是相通的。

  4. 選擇看場景和習慣:就像做蛋糕,復雜造型可能需要特定模具(比如 React 適合大型應用),日常快手做可能選更簡單的模具(比如 Vue 上手更快),但最終都能做出蛋糕。

所以完全不用怕 “學了這個還要重新學那個”—— 打好 JavaScript 基礎和前端核心概念(組件、狀態、事件等),任何框架都只是 “換個工具用” 而已。你現在深耕 React 的每一步,其實都在為未來觸類旁通其他框架鋪路~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/91830.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/91830.shtml
英文地址,請注明出處:http://en.pswp.cn/web/91830.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

寫作路上的迷茫與突破

曾經&#xff0c;我也是那個在寫作面前躊躇不前的人。每次提筆&#xff0c;滿心都是“我寫不好”“我沒什么可寫的”“我達不到別人的高度”……這些念頭像藤蔓一樣&#xff0c;緊緊纏繞著我&#xff0c;讓我寸步難行。我看著群里的小伙伴們一個個妙筆生花&#xff0c;自己卻只…

23 Active Directory攻擊與防護策略解析

引言 Active Directory&#xff08;AD&#xff09;是企業IT環境中用戶認證、訪問控制和身份管理的核心。因其掌握整個網絡的"鑰匙"&#xff0c;AD常成為攻擊者的首要目標。 從憑證轉儲到隱蔽偵察&#xff0c;攻擊者通過多種手段控制AD。無論您是網絡安全分析師、紅…

【內容規范】關于標題中【】標記的使用說明

【內容規范】關于標題中【】標記的使用說明 在信息爆炸的時代&#xff0c;如何讓內容更易識別、更具條理性&#xff0c;成為內容創作者和平臺運營者共同關注的問題。標題中【】標記的使用&#xff0c;正是在這種需求下形成的一種實用規范。 這種規范的核心作用在于建立統一的內…

centos 9 安裝docker教程

拉取相關依賴 dnf -y install dnf-plugins-core設置阿里云鏡像庫 dnf config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo安裝docker dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plu…

關閉Jetbrains Mono字體連寫、連字功能

所謂的關閉Jetbrains Mono字體連寫&#xff0c;其實就是更換為Jetbrains Mono NL字體二者的區別就是符號間距的大小不同&#xff0c;也就是有無連字功能。 下圖以Visutal Studio為例&#xff1a;

漫花軟件集合分享

漫花軟件集合分享的各種apk 1、磁盤漫畫【推薦】 2、你搜 3、皮皮喵 4、潑辣漫畫 5、趣漫畫 6、異次元&圖源 7、漫 8、再漫畫X 9、章魚漫畫 10、芝士漫畫&圖源 通過網盤分享的文件&#xff1a;漫畫軟件 鏈接: https://pan.baidu.com/s/1dlGl50MNzzVOdTP38_…

DB-GPT 0.7.3 版本更新:支持Qwen3 Embedding和Reranker模型、支持知識庫自定義檢索策略等

V0.7.3版本主要新增、增強了以下核心特性 &#x1f340; 支持Qwen3 Embedding和Reranker模型 &#x1f340; 支持知識庫自定義檢索策略&#xff1a;語義檢索、全文檢索、樹形檢索、混合檢索等 &#x1f340; 新增GaussDB數據源支持 &#x1f340; 支持GLM-4.1V多模態模型 …

Django常見模型字段

AutoField:數據庫中的自動增長類型&#xff0c;相當于ID自動增長的IntegerField類型字段&#xff0c;對應mysql的Int類型 BooleanField:真/假的布爾類型字段&#xff0c;對應mysql的Tinyint類型 CharField:字符類型字段&#xff0c;對應mysql的varChar類型 DateField:日期字段&…

前端列表封面圖如何自不同圖片比例不變形

設置圖片寬度100%時&#xff0c;若不設置高度&#xff0c;可能導致高度不足導致空白區域。如何實現圖片高度自適應填充&#xff0c;避免空白區域&#xff1f;解決方式&#xff1a;加上height&#xff1a;100%&#xff1b;object-fit:cover&#xff1b;就可以始終剪切鋪滿&#…

記錄一次Spring Cloud Gateway配置的跨域處理:解決 ‘Access-Control-Allow-Origin‘ 頭包含多個值的問題

在微服務架構中&#xff0c;前端與后端分離已經成為一種常見模式。這種模式下&#xff0c;前后端通常會部署在不同的域名或端口上&#xff0c;這就導致了跨域資源共享&#xff08;CORS&#xff09;問題。最近&#xff0c;在我們的項目中&#xff0c;我們遇到了這樣一個問題&…

掃雷游戲完整代碼

掃雷游戲完整代碼test.cgame.cgame.h

vue打包后如何在本地運行?

1.打包前的配置打開vue.config.js配置如圖所示內容//打包配置文件 module.exports {assetsDir: static,parallel: false,publicPath: ./, };這段代碼是Vue.js項目的打包配置文件&#xff0c;主要功能包括&#xff1a; - assetsDir: static - 設置靜態資源文件夾名為static - p…

Python特性工廠函數詳解:優雅管理屬性驗證

在Python中&#xff0c;特性(property)是一種強大的工具&#xff0c;它允許我們在訪問屬性時執行自定義邏輯。本文將深入分析一個名為quantity的特性工廠函數&#xff0c;它用于確保屬性值必須為正數。 特性工廠函數的概念 特性工廠函數是一種創建并返回property對象的函數&…

Ubuntu系統VScode實現opencv(c++)鼠標操作與響應

在之前的創作中心-CSDN滾動條調整圖片亮度-CSDN博客創作中心-CSDN中,我們已經了解了滾動條實現亮度以及對比度調節,為了實現對圖像中感興趣區域&#xff08;ROI, Region of Interest&#xff09;的交互式選取&#xff0c;本文利用 OpenCV 提供的鼠標事件回調機制&#xff0c;設…

True or False? 基于 BERT 學生數學問題誤解檢測

True or False? 基于 BERT 學生數學問題誤解檢測 代碼詳見&#xff1a;https://github.com/xiaozhou-alt/Student_Math_Misconception 文章目錄True or False? 基于 BERT 學生數學問題誤解檢測一、項目介紹二、文件夾結構三、數據集介紹四、BERT 模型介紹五、項目實現1. 數據…

小程序基于vue+nodejs的私人定做訂制訂單發布與對應商品出售平臺

文章目錄項目介紹主要技術與實現手段具體實現截圖關于我本系統開發思路研究思路、方法和步驟java類核心代碼部分展示系統測試本系統技術可行性分析源碼獲取詳細視頻演示或者查看其他版本&#xff1a;文章底部獲取博主聯系方式&#xff01;項目介紹主要技術與實現手段 uni-app框…

為什么要有動態內存分配?

文章目錄1.為什么要有動態內存分配2.malloc和free2.1 malloc2.2 free3.calloc和realloc3.1 calloc3.2 realloc4.常見的動態內存的錯誤4.1 對NULL指針的解引用操作4.2 對動態開辟空間的越界訪問4.3 對?動態開辟內存使?free釋放4.4 使?free釋放?塊動態開辟內存的?部分4.5 對…

docker hub 拉取鏡像失敗報Get “https://registry-1.docker.io/v2/“: net/http: request canceled while waiting

自己記錄一把&#xff0c;給兄弟們避坑 1.上問題報錯代碼 [rootlocalhost ~]# docker pull hello-world Using default tag: latestError response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connectio…

Hive數倉部署/分層/ETL腳本基礎指南

部署Hive數倉及分層基礎指南 部署和構建一個Hive數倉涉及多個步驟&#xff0c;包括設置Hadoop集群、配置Hive、設計數據倉庫架構以及實現ETL&#xff08;Extract, Transform, Load&#xff09;過程。下面是一個詳細的指南&#xff0c;幫助你完成這些步驟。 1. 設置Hadoop集群 首…

深入 Go 底層原理(六):垃圾回收(GC)

1. 引言Go 語言自帶垃圾回收&#xff08;Garbage Collection, GC&#xff09;&#xff0c;讓開發者從手動管理內存的繁重任務中解脫出來。Go 的 GC 以其低延遲和并發性而聞名&#xff0c;其目標是在不長時間暫停&#xff08;Stop The World, STW&#xff09;整個程序的情況下完…