【Vue2手錄05】響應式原理與雙向綁定 v-model

一、Vue2響應式原理(底層基礎)

Vue2的“響應式”核心是數據變化自動觸發視圖更新,其實現依賴Object.defineProperty API,但受JavaScript語言機制限制,存在“數組/對象修改盲區”,這是理解后續內容的關鍵。

1.1 響應式實現機制

核心流程
  1. 初始化轉換:Vue實例創建時,會遍歷data中的所有屬性,通過Object.defineProperty為每個屬性添加getter(數據讀取時觸發,收集依賴)和setter(數據修改時觸發,通知更新);
  2. 依賴收集:當模板渲染(如{{ msg }}v-for)讀取data屬性時,getter會記錄“哪個DOM依賴該屬性”;
  3. 更新通知:當通過this.屬性名修改數據時,setter會觸發,通知所有依賴該屬性的DOM重新渲染。
關鍵限制(JavaScript語言導致)

Object.defineProperty僅能監聽已聲明屬性的“讀取”和“修改”,無法監聽:

  • 數組的“索引修改”和“長度修改”(如this.arr[0] = 1this.arr.length = 0);
  • 對象的“動態新增屬性”和“刪除屬性”(如this.obj.newKey = 2delete this.obj.oldKey)。

1.2 數組的響應式盲區與解決方案

數組是響應式修改的“重災區”,需明確“有效/無效操作”,并選擇正確的修改方式。

1. 無效操作(不觸發視圖更新)
無效操作示例原因分析
直接索引修改數組項this.arr[0] = "新值"Object.defineProperty未監聽數組索引的setter
直接修改數組長度this.arr.length = 0(清空)長度修改未觸發任何setter
直接賦值新數組(引用不變)this.arr = this.arr數組引用未變,Vue無法檢測變化
2. 有效操作(觸發視圖更新)

Vue提供3種有效方式,核心是“讓Vue感知到數據變化”:

有效方式語法/示例適用場景原理
數組變異方法push()(末尾加)、pop()(末尾刪)、shift()(開頭刪)、unshift()(開頭加)、splice(index, count, 新值)(指定位置改/刪)、sort()(排序)、reverse()(反轉)新增、刪除、修改數組項,排序/反轉Vue重寫(“包裹”)了這些原生方法,觸發時會主動通知更新
Vue.set/$set全局方法:Vue.set(this.arr, 0, "新值");實例方法(別名):this.$set(this.arr, 0, "新值")修改指定索引的數組項(單個修改)手動為索引添加setter,觸發依賴更新
整體重新賦值this.arr = ["新值1", "新值2", "新值3"]數組批量更新(如后端返回新數據)數組引用改變,Vue能檢測到“整個數組替換”
3. 實際開發選擇(重點)
  • 優先用“整體重新賦值”:實際項目中,前端數據多來自后端API(如列表查詢),每次請求后直接用this.arr = 后端返回數據,簡潔高效(使用率≈99%);
  • 少用“Vue.set”:僅在“單獨修改某一個數組項”時使用(如修改列表中某條數據的狀態);
  • 避免“索引修改”:即使不報錯,也會導致響應式失效,屬于“反模式”。

1.3 對象的響應式盲區與解決方案

對象的響應式限制主要是“動態新增/刪除屬性”,已聲明屬性的直接修改是支持響應式的。

1. 有效/無效操作對比
操作類型示例是否響應式原因分析
直接修改已聲明屬性this.obj.name = "新名字"? 是初始化時已為name添加getter/setter
動態新增屬性(直接加)this.obj.age = 18? 否新增屬性未被Object.defineProperty處理
動態刪除屬性(delete)delete this.obj.name? 否delete操作未觸發setter
嵌套屬性修改this.obj.info.address = "北京"? 是Vue默認開啟“深度監聽”,嵌套屬性也有getter/setter
2. 解決方案(新增/刪除屬性)
解決方案語法/示例適用場景
Vue.set/$setthis.$set(this.obj, "age", 18)為對象新增單個響應式屬性
整體重新賦值this.obj = { ...this.obj, age: 18 }新增多個屬性或批量修改(用ES6擴展運算符)
刪除屬性后重賦值delete this.obj.name; this.obj = { ...this.obj }刪除屬性后,通過重賦值觸發更新
3. 關鍵補充:深度監聽與性能
  • 深度監聽:Vue對data中的對象默認開啟“深度遍歷”,為所有嵌套屬性添加getter/setter(如obj.info.address),因此嵌套屬性修改支持響應式;
  • 性能影響:若對象層級極深(如10層以上),深度監聽會消耗更多初始化時間,可通過vm.$watch手動設置deep: false關閉(按需監聽)。

二、v-model雙向綁定(表單專用)

v-model是Vue為“表單元素”設計的語法糖,實現“數據→視圖”和“視圖→數據”的雙向同步,避免手動綁定valueinput事件(原生JS痛點)。

2.1 核心原理:語法糖拆解

v-model本質是“v-bind:value(數據→視圖)”和“v-on:input(視圖→數據)”的組合,以文本框為例:

<!-- v-model語法糖 -->
<input v-model="username"><!-- 等價于手動綁定(底層實現) -->
<input :value="username" @input="username = $event.target.value">
  • 數據→視圖username變化時,value屬性自動更新,輸入框顯示新值;
  • 視圖→數據:用戶輸入時觸發input事件,通過$event.target.value獲取輸入值,同步更新username

2.2 不同表單元素的v-model用法

v-model支持所有表單元素,但不同元素的“綁定邏輯”略有差異,核心是“匹配表單元素的value或選中狀態”。

1. 文本類輸入框(text/textarea)
  • 語法:直接綁定字符串變量;
  • 示例
<div id="app"><input type="text" v-model="username" placeholder="輸入用戶名"><textarea v-model="desc" placeholder="輸入描述"></textarea><p>用戶名:{{ username }}</p><p>描述:{{ desc }}</p>
</div>
<script>new Vue({el: "#app",data: { username: "", desc: "" }});
</script>
2. 單選框(radio)
  • 關鍵要求:必須為每個單選框設置value屬性,v-model綁定的變量值與value匹配時,該單選框選中;
  • 示例
<div id="app"><label><input type="radio" name="gender" value="male" v-model="gender"></label><label><input type="radio" name="gender" value="female" v-model="gender"></label><p>選中性別:{{ gender }}</p>
</div>
<script>new Vue({el: "#app",data: { gender: "male" } // 初始選中“男”});
</script>
3. 復選框(checkbox)

分“單個復選框”(布爾值)和“多個復選框”(數組)兩種場景:

  • 單個復選框(如“同意協議”):綁定布爾值,checked狀態同步變量;
  • 多個復選框(如“選擇愛好”):綁定數組,選中項的value會自動加入/移除數組;

示例

<div id="app"><!-- 單個復選框(布爾值) --><label><input type="checkbox" v-model="isAgree"> 同意用戶協議</label><!-- 多個復選框(數組) --><div><p>選擇愛好:</p><label><input type="checkbox" value="game" v-model="hobbies"> 游戲</label><label><input type="checkbox" value="reading" v-model="hobbies"> 閱讀</label><label><input type="checkbox" value="sports" v-model="hobbies"> 運動</label></div><p>同意協議:{{ isAgree }}</p><p>選中愛好:{{ hobbies }}</p>
</div>
<script>new Vue({el: "#app",data: {isAgree: false,       // 單個復選框初始未選中hobbies: ["reading"]  // 多個復選框初始選中“閱讀”}});
</script>
4. 下拉框(select)
  • 單選下拉框:綁定字符串,選中項的value同步變量;
  • 多選下拉框(加multiple):綁定數組,選中項的value加入數組;

示例

<div id="app"><!-- 單選下拉框 --><select v-model="city"><option value="">請選擇城市</option><option value="beijing">北京</option><option value="shanghai">上海</option></select><!-- 多選下拉框(按住Ctrl選擇) --><select v-model="cities" multiple><option value="beijing">北京</option><option value="shanghai">上海</option><option value="guangzhou">廣州</option></select><p>單選城市:{{ city }}</p><p>多選城市:{{ cities }}</p>
</div>
<script>new Vue({el: "#app",data: {city: "",               // 單選初始未選cities: ["beijing"]     // 多選初始選中“北京”}});
</script>

2.3 v-model修飾符(實用補充)

Vue提供3個常用修飾符,簡化表單值處理(無需手動寫邏輯):

修飾符作用示例效果
.trim自動去除輸入值的首尾空格<input v-model.trim="username">輸入“ 小明 ”→ 變量值為“小明”
.number自動將輸入值轉為數字(非數字則保留字符串)<input v-model.number="age" type="number">輸入“18”→ 變量值為18(數字類型)
.lazy從“input事件”觸發改為“change事件”觸發(失去焦點或回車時同步)<input v-model.lazy="username">輸入時不實時同步,失去焦點后同步

示例:注冊表單用修飾符

<div id="app"><input type="text" v-model.trim="username" placeholder="用戶名(去空格)"><input type="number" v-model.number="age" placeholder="年齡(轉數字)"><input type="text" v-model.lazy="desc" placeholder="描述(失焦同步)"><p>用戶名:{{ username }}(類型:{{ typeof username }})</p><p>年齡:{{ age }}(類型:{{ typeof age }})</p><p>描述:{{ desc }}</p>
</div>

三、實戰案例:導航條點擊高亮(數據驅動視圖)

結合“動態class綁定”“v-for循環”“事件綁定”,實現“點擊導航項高亮,其他項取消”的功能,核心是“用數據控制樣式,而非操作DOM”。

3.1 需求與實現思路

1. 核心需求
  • 動態渲染導航數據(如["首頁", "特惠", "資訊", "我的"]);
  • 點擊導航項,當前項添加“高亮樣式”(如藍色背景、白色文字),其他項恢復默認;
  • 支持默認選中(如初始選中“首頁”)。
2. 實現思路(數據驅動)
  1. 定義數據navList(導航數據數組)、currentIndex(當前選中項的索引,初始為0);
  2. 循環渲染:用v-for遍歷navList,生成導航項;
  3. 動態class:判斷“當前項索引 === currentIndex”,為true則添加高亮類(如.active);
  4. 事件綁定:點擊導航項時,更新currentIndex為當前項的索引。

3.2 完整代碼實現

<div id="app"><!-- 導航容器:清除浮動 --><div class="nav-container"><!-- 導航項:v-for循環 + 動態class + 點擊事件 --><div v-for="(item, index) in navList" :key="index"  <!-- 靜態導航用index作key,動態數據建議用id -->class="nav-item":class="{ active: currentIndex === index }"  <!-- 高亮條件 -->@click="currentIndex = index"  <!-- 點擊更新選中索引 -->>{{ item }}</div></div>
</div>
<style>/* 導航容器:清除浮動 */.nav-container {overflow: hidden;width: 600px;margin: 20px auto;}/* 導航項默認樣式 */.nav-item {float: left;width: 120px;height: 50px;line-height: 50px;text-align: center;color: #333;cursor: pointer;background: #f5f5f5;margin-right: 10px;}/* 導航項高亮樣式 */.nav-item.active {background: #5696ff;color: white;}
</style>
<script src="https://cdn.staticfile.org/vue/2.7.0/vue.min.js"></script>
<script>new Vue({el: "#app",data: {navList: ["首頁", "特惠", "資訊", "游記", "我的"],  // 導航數據currentIndex: 0  // 初始選中第1項(索引0)}});
</script>

3.3 關鍵優化與擴展

  1. 動態導航數據(后端來源):若導航數據來自后端API,可在created鉤子中請求數據后整體賦值:
created() {// 模擬后端請求setTimeout(() => {this.navList = ["首頁", "商品", "訂單", "個人中心"]; // 后端返回數據this.currentIndex = 0; // 重新設置默認選中}, 1000);
}
  1. 避免用index作key(動態數據):若導航數據可能增刪(如權限控制顯示/隱藏),需用唯一標識(如id)作key
data: {navList: [{ id: 1, name: "首頁" },{ id: 2, name: "特惠" }]
}
// 循環時:v-for="(item, index) in navList" :key="item.id"

小練習(鞏固核心知識點)

練習1:數組響應式修改(待辦事項列表)

需求
  1. 定義待辦數組todoList(含idtextisDone字段,初始2條數據);
  2. 實現“添加待辦”:輸入框輸入內容,點擊按鈕添加到列表(isDone默認false);
  3. 實現“刪除待辦”:每條待辦后加“刪除”按鈕,點擊刪除對應項;
  4. 實現“標記完成”:點擊待辦文本,切換isDone狀態(完成時文本加刪除線)。

練習2:對象響應式新增屬性(用戶信息編輯)

需求
  1. 定義用戶對象user(初始含namephone字段);
  2. 實現“新增地址”:輸入地址后,點擊按鈕用Vue.set新增address屬性(響應式);
  3. 實現“修改信息”:直接修改namephone,實時顯示修改結果;
  4. 顯示所有用戶信息(包括新增的address)。

練習3:v-model雙向綁定(注冊表單)

需求
  1. 實現注冊表單,含“用戶名”(去空格)、“年齡”(轉數字)、“密碼”、“確認密碼”;
  2. 用戶名用.trim修飾符,年齡用.number修飾符;
  3. 點擊“提交”按鈕,驗證“密碼 === 確認密碼”,若不相等提示“兩次密碼不一致”;
  4. 驗證通過后,打印表單數據(控制臺輸出)。

練習4:導航條高亮擴展(帶路由跳轉)

需求
  1. 導航數據為[{ id: 1, name: "首頁", path: "/" }, { id: 2, name: "商品", path: "/goods" }]
  2. 點擊導航項時,除了高亮,還需模擬“路由跳轉”(打印跳轉路徑);
  3. 初始選中“首頁”,若路徑為/goods(模擬URL參數),則默認選中“商品”。

小練習參考答案

練習1:數組響應式修改(待辦事項列表)

<div id="app"><div style="margin-bottom: 16px;"><input type="text" v-model="newTodoText" placeholder="輸入待辦內容"@keyup.enter="addTodo"  <!-- 回車添加 -->><button @click="addTodo" style="margin-left: 8px;">添加待辦</button></div><ul style="list-style: none; padding: 0; max-width: 400px;"><li v-for="(todo, index) in todoList" :key="todo.id" style="padding: 8px; border-bottom: 1px solid #eee; display: flex; justify-content: space-between; align-items: center; cursor: pointer;":style="{ textDecoration: todo.isDone ? 'line-through' : 'none', color: todo.isDone ? '#999' : '#333' }"@click="toggleDone(index)"  <!-- 點擊標記完成 -->><span>{{ todo.text }}</span><button @click.stop="deleteTodo(index)" style="color: #f44336; border: none; background: transparent; cursor: pointer;">刪除</button></li></ul>
</div>
<script src="https://cdn.staticfile.org/vue/2.7.0/vue.min.js"></script>
<script>
new Vue({el: "#app",data: {newTodoText: "",todoList: [{ id: Date.now() - 1000, text: "學習Vue響應式原理", isDone: false },{ id: Date.now(), text: "完成待辦練習", isDone: false }]},methods: {// 添加待辦(用push,響應式)addTodo() {if (!this.newTodoText.trim()) return; // 空內容不添加this.todoList.push({id: Date.now(), // 時間戳作唯一idtext: this.newTodoText,isDone: false});this.newTodoText = ""; // 清空輸入框},// 刪除待辦(用splice,響應式)deleteTodo(index) {this.todoList.splice(index, 1);},// 標記完成(直接修改嵌套屬性,響應式)toggleDone(index) {this.todoList[index].isDone = !this.todoList[index].isDone;}}
});
</script>

練習2:對象響應式新增屬性(用戶信息編輯)

<div id="app"><h3>用戶信息編輯</h3><div style="margin-bottom: 8px;"><label>姓名:</label><input type="text" v-model="user.name"></div><div style="margin-bottom: 8px;"><label>手機號:</label><input type="text" v-model="user.phone"></div><div style="margin-bottom: 8px;"><label>地址:</label><input type="text" v-model="newAddress"><button @click="addAddress" style="margin-left: 8px;">添加地址</button></div><h4>當前用戶信息:</h4><p>姓名:{{ user.name }}</p><p>手機號:{{ user.phone }}</p><p>地址:{{ user.address || "未添加" }}</p> <!-- 新增屬性默認顯示“未添加” -->
</div>
<script src="https://cdn.staticfile.org/vue/2.7.0/vue.min.js"></script>
<script>
new Vue({el: "#app",data: {user: { name: "小明", phone: "13800138000" }, // 初始屬性newAddress: "" // 臨時存儲地址輸入},methods: {// 用this.$set新增響應式屬性addAddress() {if (!this.newAddress.trim()) return;// 第一個參數:目標對象,第二個參數:新屬性名,第三個參數:屬性值this.$set(this.user, "address", this.newAddress);this.newAddress = ""; // 清空輸入}}
});
</script>

練習3:v-model雙向綁定(注冊表單)

<div id="app"><h3>注冊表單</h3><div style="margin-bottom: 8px;"><label>用戶名:</label><input type="text" v-model.trim="form.username" placeholder="請輸入用戶名(去空格)"></div><div style="margin-bottom: 8px;"><label>年齡:</label><input type="number" v-model.number="form.age" placeholder="請輸入年齡(轉數字)"></div><div style="margin-bottom: 8px;"><label>密碼:</label><input type="password" v-model="form.password" placeholder="請輸入密碼"></div><div style="margin-bottom: 8px;"><label>確認密碼:</label><input type="password" v-model="form.confirmPwd" placeholder="請再次輸入密碼"></div><button @click="submitForm" style="padding: 8px 16px; background: #2196F3; color: white; border: none; border-radius: 4px; cursor: pointer;">提交</button>
</div>
<script src="https://cdn.staticfile.org/vue/2.7.0/vue.min.js"></script>
<script>
new Vue({el: "#app",data: {form: {username: "",age: "",password: "",confirmPwd: ""}},methods: {submitForm() {// 驗證用戶名if (!this.form.username) {alert("請輸入用戶名");return;}// 驗證年齡(數字類型)if (isNaN(this.form.age) || this.form.age < 18) {alert("請輸入18歲以上的有效年齡");return;}// 驗證密碼一致if (this.form.password !== this.form.confirmPwd) {alert("兩次密碼不一致");return;}// 驗證通過,打印表單數據console.log("注冊表單數據:", this.form);alert("注冊成功!");}}
});
</script>

練習4:導航條高亮擴展(帶路由跳轉)

<div id="app"><div class="nav-container"><div v-for="item in navList" :key="item.id"class="nav-item":class="{ active: currentIndex === item.id }"  <!-- 用id匹配選中 -->@click="goToPath(item)">{{ item.name }}</div></div><p style="margin-top: 20px;">當前路徑:{{ currentPath }}</p>
</div>
<style>
.nav-container { overflow: hidden; width: 500px; margin: 20px auto; }
.nav-item {float: left; width: 120px; height: 50px; line-height: 50px; text-align: center;color: #333; cursor: pointer; background: #f5f5f5; margin-right: 10px;
}
.nav-item.active { background: #5696ff; color: white; }
</style>
<script src="https://cdn.staticfile.org/vue/2.7.0/vue.min.js"></script>
<script>
new Vue({el: "#app",data: {navList: [{ id: 1, name: "首頁", path: "/" },{ id: 2, name: "商品", path: "/goods" },{ id: 3, name: "訂單", path: "/order" }],currentPath: "/", // 初始路徑currentIndex: 1   // 初始選中“首頁”(id=1)},methods: {// 模擬路由跳轉goToPath(item) {this.currentPath = item.path; // 更新當前路徑this.currentIndex = item.id;  // 更新選中狀態// 實際項目中用Vue Router:this.$router.push(item.path)console.log("跳轉至路徑:", item.path);}},created() {// 模擬URL參數:若路徑為/goods,默認選中“商品”const mockUrlPath = "/goods"; // 實際項目中用this.$route.path獲取const targetNav = this.navList.find(item => item.path === mockUrlPath);if (targetNav) {this.currentPath = mockUrlPath;this.currentIndex = targetNav.id;}}
});
</script>

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

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

相關文章

探索大語言模型(LLM):Ollama快速安裝部署及使用(含Linux環境下離線安裝)

前言 Ollama 是一個開源的本地化大模型運行平臺&#xff0c;支持用戶直接在個人計算機上部署、管理和交互大型語言模型&#xff08;LLMs&#xff09;&#xff0c;無需依賴云端服務。而且其混合推理的特性也使得CPU和GPU的算力能夠充分被使用&#xff0c;能夠在同等配置下跑更大…

滲透測試信息收集詳解

我們來詳細解析一下滲透測試中信息收集&#xff08;Information Gathering&#xff09;的完整內容、步驟及工具方法。信息收集是整個滲透測試的基石&#xff0c;其深度和廣度直接決定了后續測試的成功率&#xff0c;因此有“滲透測試成功與否&#xff0c;90%取決于信息收集”的…

Kafka面試精講 Day 16:生產者性能優化策略

【Kafka面試精講 Day 16】生產者性能優化策略 在“Kafka面試精講”系列的第16天&#xff0c;我們將聚焦于生產者性能優化策略。這是Kafka中極為關鍵的技術點&#xff0c;也是大廠面試中的高頻考點——尤其是在涉及高并發數據寫入、日志采集、實時數倉等場景時&#xff0c;面試…

深入解析AI溫度參數:控制文本生成的隨機性與創造性

引言 在人工智能飛速發展的今天&#xff0c;文本生成模型如GPT系列已經成為內容創作、代碼編寫、對話系統等領域的核心工具。然而&#xff0c;許多用戶在使用這些模型時&#xff0c;可能會發現輸出結果有時過于保守和重復&#xff0c;有時又過于天馬行空而缺乏連貫性。這背后其…

20250912在榮品RD-RK3588-MID開發板的Android13系統下在接電腦的時候禁止充電

20250912在榮品RD-RK3588-MID開發板的Android13系統下在接電腦的時候禁止充電 2025/9/12 10:21緣起&#xff1a;某人的電腦接榮品RD-RK3588-MID開發板的時候做APK開發板的時候&#xff0c;通過Android Studio連接榮品RD-RK3588-MID開發板。 經常斷聯/時斷時續。投訴了/抱怨了好…

Unity Addressable System 本地服務器功能驗證

1.從Package Manger里安裝Addressable 注意這里有Addressables和Addressables兩個包&#xff0c;前者是核心框架&#xff0c;處理跨平臺通用邏輯&#xff0c;比如用 地址&#xff08;Address&#xff09;來異步加載、卸載資源&#xff1b;自動做引用計數&#xff0c;避免資源泄…

碎片化采購是座金礦:數字化正重構電子元器件分銷的價值鏈

在電子元器件的分銷江湖里&#xff0c;長期存在著一條隱秘的“鄙視鏈”&#xff1a;訂單金額大、需求穩定的頭部客戶是眾星捧月的“香餑餑”&#xff0c;而需求碎片化、品類繁多的小微企業長尾訂單&#xff0c;則常被視作食之無味、棄之可惜的“雞肋”。行業固有認知告訴我們&a…

Typescript - 通俗易懂的 interface 接口,創建接口 / 基礎使用 / 可選屬性 / 只讀屬性 / 任意屬性(詳細教程)

前言 在面向對象語言中&#xff0c;接口是一個很重要的概念&#xff0c;它是對行為的抽象&#xff0c;而具體如何行動需要由類去實現。 TypeScript 中的接口是一個非常靈活的概念&#xff0c;除了可用于 對類的一部分行為進行抽象 以外&#xff0c;也常用于對「對象的形狀&…

【硬件-筆試面試題-92】硬件/電子工程師,筆試面試題(知識點:米勒效應,米勒平臺)

題目匯總版--鏈接&#xff1a; 【硬件-筆試面試題】硬件/電子工程師&#xff0c;筆試面試題匯總版&#xff0c;持續更新學習&#xff0c;加油&#xff01;&#xff01;&#xff01;-CSDN博客 【硬件-筆試面試題-92】硬件/電子工程師&#xff0c;筆試面試題&#xff08;知識點…

C語言深度入門系列:第十一篇 - 動態內存管理與數據結構:程序世界的高效算法大師

C語言深度入門系列&#xff1a;第十一篇 - 動態內存管理與數據結構&#xff1a;程序世界的高效算法大師 本章目標 本章將深入探討C語言中的動態內存管理和經典數據結構實現&#xff0c;這是從基礎編程邁向算法工程師的關鍵一步。您將掌握內存的精確控制、理解各種數據結構的本質…

Go 語言開發環境安裝與 GOPROXY 鏡像配置(含依賴管理與版本切換技巧)

在國內搭建 Go 開發環境的最大障礙不是“怎么裝”&#xff0c;而是“下不動”。本文是我在多臺 Windows / macOS / Linux 機器上踩坑后的整合筆記&#xff1a;用最穩妥的安裝方式 合理的鏡像配置 一套通吃的依賴/版本管理流程&#xff0c;把速度、穩定性和可維護性一次性解決…

崔傳波教授:以科技與人文之光,點亮近視患者的清晰視界?

崔傳波教授&#xff1a;以科技與人文之光&#xff0c;點亮近視患者的清晰視界?在臨沂新益民眼科醫院&#xff0c;有這樣一位眼科醫師——他不僅是近視矯正領域的專家&#xff0c;更是“金視青春之光手術”的研發倡導者。?崔傳波教授?以其深厚的學術功底、創新的技術理念和以…

如何寫過濾條件wrapper的使用

模糊查詢 &#xff1a;功能是&#xff1a;查詢 WORK_NUM 字段包含 ${workOrder.workNum} 的記錄。<if test"workOrder.workNum ! null and workOrder.workNum ! ">and b.WORK_NUM like CONCAT(%,CONCAT(#{workOrder.workNum},%)) </if>一、比較條件方法示…

【Spring Boot 報錯已解決】徹底解決 “Main method not found in class com.xxx.Application” 報錯

文章目錄引言一、問題描述1.1 報錯示例1.2 報錯分析1.3 解決思路二、解決方法2.1 方法一&#xff1a;添加標準的main方法2.2 方法二&#xff1a;檢查main方法的定義是否規范2.3 方法三&#xff1a;檢查主類的位置是否正確2.4 方法四&#xff1a;重新構建項目并清理緩存三、其他…

配置自簽證書多域名的動態網站+部署http的repo倉庫+基于nfs與yum倉庫的http部署

1.配置自簽證書多域名的動態網站1.1配置自簽證書1.1.1配置倉庫[rootapache ~]# vim /etc/yum.repos.d/epel.repo [epel] nameepel baseurlhttps://mirrors.aliyun.com/epel/9/Everything/x86_64/ gpgcheck0 1.1.2安裝easy-rsa工具(用于生成和…

【開題答辯全過程】以 12306候補購票服務系統為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人&#xff0c;語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

計算機畢業設計 基于深度學習的酒店評論文本情感分析研究 Python畢業設計項目 Hadoop畢業設計選題 機器學習選題【附源碼+文檔報告+安裝調試】

博主介紹&#xff1a;?從事軟件開發10年之余&#xff0c;專注于Java技術領域、Python、大數據、人工智能及數據挖掘、小程序項目開發和Android項目開發等。CSDN、掘金、華為云、InfoQ、阿里云等平臺優質作者? &#x1f345;文末獲取源碼聯系&#x1f345; &#x1f447;&…

嵌入式第五十二天(GIC,協處理器,異常向量表)

一.GICGIC&#xff08;Generic Interrupt Controller&#xff0c;通用中斷控制器&#xff09; 是ARM架構中管理系統中斷的核心組件&#xff0c;負責接收、優先級排序、分發中斷信號給處理器核心。其核心功能和關鍵版本如下&#xff1a;核心功能1. 中斷接收與分發&#xff1a;接…

基于hiprint的票據定位打印系統開發實踐

基于hiprint的票據定位打印系統開發實踐 在日常的Web開發中&#xff0c;我們經常需要實現打印功能&#xff0c;特別是對于票據、標簽等需要精確排版的打印需求。今天我將分享一個基于hiprint插件實現的票據定位打印系統&#xff0c;重點介紹如何實現單行打印、批量打印以及金額…

Android ScrollView嵌套RecyclerView 導致RecyclerView數據展示不全問題

Android RecyclerView 數據展示不全問題&#xff08;ScrollView→NestedScrollView 修復&#xff09; 一、問題核心現象 布局初始結構&#xff1a;外層用ScrollView包裹包含兩個CustomBlogCardView&#xff08;內部均含RecyclerView&#xff09;的LinearLayout。 異常表現&…