【Vue-vue基礎知識】學習筆記

目錄

  • <<回到導覽
  • vue基礎知識
    • 1.1.創建一個vue實例
    • 1.2.vue基礎指令
      • 1.2.1.v-bind
      • 1.2.2.v-model
      • 1.2.3.常用事件
      • 1.2.4.指令修飾符
    • 1.3.計算屬性
      • 1.3.1.計算屬性的完整寫法
      • 1.3.2.【案例】成績
    • 1.4.watch
      • 1.4.1.watch屬性
      • 1.4.2.翻譯業務實現
      • 1.4.3.watch屬性的完整寫法
      • 1.4.4.【案例】水果購物車
    • 1.5.生命周期
      • 1.5.1.【應用】初始化渲染
      • 1.5.2.【應用】獲取焦點

<<回到導覽

vue基礎知識

mvvm模型

響應式數據,一旦數據變化,視圖效果跟著變化

1.1.創建一個vue實例

  • 代碼:

     <!-- 1.準備容器 --><div id="app">{{msg}}{{age-1}}</div><!-- 2.引入開發版本的包 --><script src="https://cdn.jsdelivr.net/npm/vue@2.7.16/dist/vue.js"></script><script>// 3.創建實例const app = new Vue({// 4.添加配置項el: '#app',// el => 掛載data: {msg: 'hello',age: 18}})
    
  • 插值表達式

    {{}}包裹變量名,將表達式插值,如上面{{msg}}和{{age-1}},瀏覽器會分別渲染值hello和 17

  • 響應式特性

    響應式:數據變化,視圖自動更新,當我們修改數據后,vue會監聽到數據修改,從而改變視圖

    data里的數據會添加到實例身上,以上面實例為例子,我們可以通過app訪問屬性msg和age
    在這里插入圖片描述)

1.2.vue基礎指令

  • 一些基礎指令:

        <!-- 1.v-html  =>  innerHtml   --><div v-html="msg2"></div><!-- 2.v-show  =>  通過display來顯示和隱藏  =>  一般用于交互頻繁  --><div v-show="flag3">333</div><!-- 3.v-if  =>   條件渲染                 =>  用于交互不頻繁    --><div v-if="flag3">444</div><!-- 4.v-if、 v-else-if   v-else          =>   條件渲染  --><!-- 5.v-on 注冊事件  每點擊一下,count -1 -->v-on:click="count--"   =>   @click="count--" 
    
  • methods屬性(用于存放事件方法)

    <!-- 點擊按鈕,調用methods方法,彈出提示框 -->
    <button @click="methods">methods</button><!-- js -->
    methods: {methods() {alert('methods')}
    }
    
  • 7.v-for(基于數組循環,多次渲染整個元素,v-for="(item,index) in arr

    <!-- 編號arr中的項,并且列舉 -->
    <li v-for="(item, index) in list">{{index+1}}.{{item}}</li>
    

    v-for中的key:給元素添加唯一標識,用于列表項的正確排序(key值必須具有唯一性,不推薦以index作為key值)

1.2.1.v-bind

  • 可省略成: ,用于實現熟悉的響應式

      <!-- imgUrl為配置項中data中的數據 --><img v-bind:src="imgUrl"><!-- 等價為 --><img :src="imgUrl" alt="">
    

    v-bind可以操作class

    1. 傳對象

      應用場景:一個類名,來回切換(tab欄)

      <!-- size、pink、green都為類名 -->
      <div class="box" :class="{size:true,pink:false,green:true}">123</div>
      
  1. 傳數組

    應用場景:批量添加或者刪除類

    <div class="box" :class="['pink','size']">223</div>
    
  2. style行內樣式

    應用場景:非常方便地控制某個樣式屬性的變化(進度條),數值拼接單位

    <div class="box" :style="{'background-color':'green'}"></div>
    

1.2.2.v-model

v-modal 可以讓數據和視圖雙向綁定,快速獲取或者設置表單元素內容

<!-- input框值變化,data中對應的數據也會變化 -->
<input type="text" v-model="username"><br>

對于不同的表單元素, v-modal 的綁定也有所不同

表單元素綁定備注
輸入框valuetext
文本域valuetextarea
復選框checkedcheckbox
單選框checkedradio,name將單選框關聯
下拉菜單selected元素中,option選項的value值selected、option

1.2.3.常用事件

事件觸發
@click單擊觸發
v-model常用于綁定input事件
@submit表單提交觸發
@mouseover鼠標懸停觸發
@mouseout鼠標移開觸發
  • 焦點事件

    事件觸發
    @focus元素獲得焦點
    @blur元素失去焦點
  • 表單事件

    事件觸發
    @reset點擊重置按鈕時
    @submit點擊提交按鈕
  • 鍵盤事件

    事件觸發
    @keydown按下任意按鍵。
    @keypress除 Shift、Fn、CapsLock 外的任意鍵被按住。
    @keyup按鍵彈起

1.2.4.指令修飾符

  1. 按鍵修飾符
    • @keyup.enter:鍵盤回車監聽
  2. v-model修飾符
    • v-model.trim:去首尾空格
    • v-model.number:轉數字
  3. 事件修飾符
    • 事件名.stop:阻止冒泡
    • 事件名.prevent:阻止默認行為
  4. 其他
    • once:事件只觸發一次

1.3.計算屬性

計算屬性會對計算結果緩存,依賴項變了,會自動重新計算,并再次緩存,緩存可以被直接讀取(性能高)

1.methods屬性

<p>禮物總數:{{ total() }}</p>
<p>禮物總數:{{ total() }}</p>
<p>禮物總數:{{ total() }}</p><!-- js中 -->
data: {list: [{ id: 1, name: '籃球', num: 1 },{ id: 2, name: '玩具', num: 2 },{ id: 3, name: '鉛筆', num: 5 },]
},
methods: {total() {console.log("執行了一次。");return this.list.reduce((sum, item) => sum + item.num, 0)}
}
  • 控制臺會打印三次"執行了一次。"
  1. computed屬性
 <!-- 計算屬性依舊是屬性,不用加() -->
<p>禮物總數:{{ total }}</p>
<p>禮物總數:{{ total }}</p>
<p>禮物總數:{{ total }}</p><!-- js中 -->
computed: {封裝一段對于數據的處理,求得一個結果total() {console.log("執行了一次。");return this.list.reduce((sum, item) => sum + item.num, 0)}
}
  • 控制臺會打印一次"執行了一次。"

1.3.1.計算屬性的完整寫法

計算屬性默認只能訪問,不能修改,如果要修改,需要計算屬性的完整寫法

computed:{fullName(){return this.firstName + this.lastName}
}

以上寫法等價于

computed:{fullName:{get(){return this.firstName + this.lastName}}
}
  • 上面寫法只能通過監聽firstName和lastName,來動態改變fullName的值
  • 現在假設fullName會變化,我們fullName變化時,有對firstName和lastName進行拆分的需求,就需要計算屬性的完整寫法
computed:{fullName:{// 監聽firstName和lastName,動態改變fullName的值get(){return this.firstName + this.lastName},// 監聽fullName,動態改變firstName和lastName的值set(value){this.firstName = value.slice(0,1))this.lastName = value.slice(1)}}
}

從上面可以看出,set方法的形參value為fullName的值

當然除了改變firstName和lastName的值,還可以做出其他的一些操作,這里就不一一例舉了

1.3.2.【案例】成績

  • 成品圖
    在這里插入圖片描述
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><link rel="stylesheet" href="./styles/index.css" /><title>Document</title>
</head><body><div id="app" class="score-case"><div class="table"><table><thead><tr><th>編號</th><th>科目</th><th>成績</th><th>操作</th></tr></thead><tbody v-if="list.length>0"><tr v-for="(item,index) in list" :key="item.id"><td>{{item.id}}</td><td>{{item.subject}}</td><td :class="{red:item.score<60}">{{item.score}}</td><td><a href="#" @click="del(item.id)">刪除</a></td></tr></tbody><tbody v-else><tr><td colspan="5"><span class="none">暫無數據</span></td></tr></tbody><tfoot><tr><td colspan="5"><span>總分:{{total}}</span><span style="margin-left: 50px">平均分:{{average}}</span></td></tr></tfoot></table></div><div class="form"><div class="form-item"><div class="label">科目:</div><div class="input"><input type="text" placeholder="請輸入科目" v-model="subject" /></div></div><div class="form-item"><div class="label">分數:</div><div class="input"><input type="text" placeholder="請輸入分數" v-model="score" /></div></div><div class="form-item"><div class="label"></div><div class="input"><button class="submit" @click="add">添加</button></div></div></div></div><script src="../../vue/vue.js"></script><script>const app = new Vue({el: '#app',data: {list: [{ id: 1, subject: '語文', score: 20 },{ id: 2, subject: '數學', score: 99 },{ id: 3, subject: '英語', score: 70 },],subject: '',score: ''},methods: {del(id) {this.list = this.list.filter(item => item.id !== id)},add() {if (!this.subject || !this.score) {alert('沒有輸入科目或者分數!!!')} else {// 往數組前面加this.list.unshift({// 以時間戳作為id,來設置keyid: +new Date(),subject: this.subject,score: this.score})this.subject = ''this.score = ''}}},computed: {total() {return this.list.reduce((sum, item) => sum + item.score, 0)},average() {if (this.list.length == 0) {return 0} else {return this.total / (this.list.length)}}}})</script>
</body></html>

重要知識點

  1. 刪除邏輯

     del(id) {this.list = this.list.filter(item => item.id !== id)},
    
    • 通過點擊觸發del方法,傳入id
    • 通過filter,從list過濾出和被點擊項的id不同的id項,重新賦值給list(即從list刪除點擊項)
  2. 求和邏輯

      total() {return this.list.reduce((sum, item) => sum + item.score, 0)},
    
    • reduce累加器的運用
  3. 加入數組

    • 往數組前面加:unshift()方法
    • 往數組后面加:push()方法

1.4.watch

1.4.1.watch屬性

作用:監視數據變化,執行 業務邏輯 或 異步操作

watch:{//  該方法會在數據變化時調用執行// newValue新值, oldValue老值(一般不用) words(newValue, oldValue) {console.log('變化了', newValue,, oldValue)}
}

以上代碼監聽了data里的數據words,如果我們要監聽data里obj對象屬性words,則應該寫為 'obj.words'

 'obj.words'(newValue) {console.log('變化了', newValue)}

1.4.2.翻譯業務實現

 watch: {'obj.words'(newValue) {  clearTimeout(this.timerId)this.timerId = setTimeout(async () => {const res = await axios({url: 'https://applet-base-api-t.itheima.net/api/translate',params: {words:newValue}})this.result = res.data.data}, 300)},}

知識點

  • 防抖處理

1.4.3.watch屬性的完整寫法

  • 額外配置項

    配置項效果
    deep:true深度監視,對象的子元素變化也會觸發
    immediate:true初始化立即執行一次

上面的翻譯業務實現還可以升級為,通過改變翻譯語言也會觸發watch監聽

  • 對象obj有屬性words和屬性language
  • 對象進行深度監視,對象的任何一個屬性(words和language)發生變化,都會觸發重新翻譯
watch: {obj: {deep: true,         // 深度監視immediate: true,    // 立即執行handler(newValue) {clearTimeout(this.timerId)this.timerId = setTimeout(async () => {const res = await axios({url: 'https://applet-base-api-t.itheima.net/api/translate',params: newValue})this.result = res.data.data}, 300)}},
}

1.4.4.【案例】水果購物車

  • 成品圖
    在這里插入圖片描述
  • js代碼
const dedaultArr = [{id: 1,icon: 'img/火龍果.png',isChecked: true,num: 1,price: 6,},{id: 2,icon: 'img/荔枝.png',isChecked: false,num: 1,price: 20,},{id: 3,icon: 'img/榴蓮.png',isChecked: false,num: 1,price: 40,},{id: 4,icon: 'img/鴨梨.png',isChecked: true,num: 1,price: 3,},{id: 5,icon: 'img/櫻桃.png',isChecked: false,num: 1,price: 32,},
]
const app = new Vue({el: '#app',data: {// 水果列表bannerSrc: 'img/fruit.jpg',fruitList: JSON.parse(localStorage.getItem('list')) || dedaultArr},methods: {del(id) {return this.fruitList = this.fruitList.filter(item => item.id != id)}},computed: {// 計算選中個數totalCount() {return this.fruitList.reduce((sum, item) => {if (item.isChecked) {return sum + item.num} else {return sum}}, 0)},// 計算總價totalPrice() {return this.fruitList.reduce((sum, item) => {if (item.isChecked) {return sum + item.num * item.price} else {return sum}}, 0)},all: {get() {// return的值決定全選框是否勾選// 必須所有框都選中,全選按鈕才選中(every)return this.fruitList.every(item => item.isChecked)},set(value) {// 全選按鈕的value影響其他框this.fruitList.forEach(item => item.isChecked = value);}}},watch: {fruitList: {deep: true,handler(newValue) {localStorage.setItem('list', JSON.stringify(newValue))}}}
})
  • 部分html代碼展示
<div class="tbody"><div class="tr active" v-for="(item,index) in fruitList"><div class="td"><input type="checkbox" v-model="item.isChecked" /></div><div class="td"><img :src="item.icon" alt="" /></div><div class="td">{{item.price}}</div><div class="td"><div class="my-input-number"><button class="decrease" @click="item.num--"> - </button><span class="my-input__inner">{{item.num}}</span><button class="increase" @click="item.num++"> + </button></div></div><div class="td">{{item.num*item.price}}</div><div class="td"><button @click="del(item.id)">刪除</button></div></div>
</div><!-- 底部 -->
<div class="bottom"><!-- 全選 --><label class="check-all"><input type="checkbox" v-model="all" />全選</label><div class="right-box"><!-- 所有商品總價 --><span class="price-box">總價&nbsp;&nbsp;:&nbsp;&nbsp;&nbsp;<span class="price">{{totalPrice}}</span></span><!-- 結算按鈕 --><button class="pay">結算( {{totalCount}} )</button></div>
</div>

知識點

  • 全選框邏輯
    在這里插入圖片描述
    1. fruitList里添加屬性isChecked來標記item項是否勾選
    2. 再通過v-model="item.isChecked”將isChecked和每個子checkbox綁定,即checkbox和勾選狀態關聯
    3. 如果子checkbox發生變化,調用get()
    4. 再通過every檢查fruitList里的item.isChecked是否全為true,即檢查是否全勾選
    5. 如果全勾選,返回true,通過v-model="all"反作用于全選的checkbox,使其勾選
    6. 如果全選的checkbox發生變化,調用set(),并通過形參value傳入all的值
    7. 通過forEach,將所有子checkbox的isChecked設置為和all一樣的值

1.5.生命周期

在不同的生命周期,會自動運行一些函數,被稱為生命周期鉤子,讓開發者可以在特定階段運行代碼

  • 生命周期四個階段

    1.創建階段:創建響應式數據

    2.掛載階段:渲染模板

    3.更新階段:修改數據,更新視圖

    4.銷毀階段:銷毀Vue實例

    在這里插入圖片描述

  • 生命周期鉤子
    在這里插入圖片描述

1.5.1.【應用】初始化渲染

created生命周期,發送獲取數據的請求

const app = new Vue({el: '#app',data: {list: []},async created() {// 1. 發送請求獲取數據const res = await axios.get('http://hmajax.itheima.net/api/news')// 2.將獲取的數據寫入數據列表this.list = res.data.data}
})
</script>

1.5.2.【應用】獲取焦點

mounted生命周期,獲取焦點(操作dom)

const app = new Vue({el: '#app',data: {words: ''},mounted() {document.querySelector('#inp').focus()}
})

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

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

相關文章

Element Plus 圖標使用方式整理

Element Plus 圖標使用方式整理 以下是 Element Plus 圖標的所有使用方式&#xff0c;包含完整代碼示例和總結表格&#xff1a; 1. 按需引入圖標組件 適用場景&#xff1a;僅需少量圖標時&#xff0c;按需導入減少打包體積 示例代碼&#xff1a; <template><div>…

使用Scrapy官方開發的爬蟲部署、運行、管理工具:Scrapyd

一般情況下&#xff0c;爬蟲會使用云服務器來運行&#xff0c;這樣可以保證爬蟲24h不間斷運行。但是如何把爬蟲放到云服務器上面去呢&#xff1f;有人說用FTP&#xff0c;有人說用Git&#xff0c;有人說用Docker。但是它們都有很多問題。 FTP&#xff1a;使用FTP來上傳…

41、web前端開發之Vue3保姆教程(五 實戰案例)

一、項目簡介和需求概述 1、項目目標 1.能夠基于Vue3創建項目 2.能夠基本Vue3相關的技術棧進行項目開發 3.能夠使用Vue的第三方組件進行項目開發 4.能夠理解前后端分離的開發模式 2、項目概述 使用Vue3結合ElementPlus,ECharts工具實現后臺管理系統頁面,包含登錄功能,…

OpenCV--圖像平滑處理

在數字圖像處理領域&#xff0c;圖像平滑處理是一項極為重要的技術&#xff0c;廣泛應用于計算機視覺、醫學影像分析、安防監控等多個領域。在 OpenCV 這一強大的計算機視覺庫的助力下&#xff0c;我們能便捷地實現多種圖像平滑算法。本文將深入探討圖像平滑的原理&#xff0c;…

性能優化利器:前后端防抖方案解析

精心整理了最新的面試資料和簡歷模板&#xff0c;有需要的可以自行獲取 點擊前往百度網盤獲取 點擊前往夸克網盤獲取 在Web開發中&#xff0c;高頻觸發的事件&#xff08;如用戶輸入、按鈕點擊、滾動監聽等&#xff09;可能導致性能問題或資源浪費。防抖&#xff08;Debounce&…

【ES系列】Elasticsearch簡介:為什么需要它?(基礎篇)

?? 本文將詳細介紹Elasticsearch的前世今生,以及為什么它在當今的技術棧中如此重要。本文是ES起飛之路系列的基礎篇第一章,適合想要了解ES的讀者。 文章目錄 一、什么是Elasticsearch?1. ES的定義2. ES的核心特性2.1 分布式存儲2.2 實時搜索2.3 高可用性2.4 RESTful API3.…

用 HTML 網頁來管理 Markdown 標題序號

文章目錄 工具介紹核心優勢使用指南基本使用方法注意事項 部分截圖完整代碼 工具介紹 在日常的文檔編寫和博客創作中&#xff0c;Markdown因其簡潔的語法和良好的可讀性而廣受歡迎。然而&#xff0c;當文檔結構復雜、標題層級較多時&#xff0c;手動維護標題序號不僅耗時耗力&…

批量將 Markdown 轉換為 Word/PDF 等其它格式

在工作當中&#xff0c;我們經常會接觸到 Markdown 格式的文檔。這是一種非常方便我們做記錄&#xff0c;做筆記的一種格式文檔。現在很多互聯網編輯器都是支持 Markdown 格式的&#xff0c;編輯起文章來更加的方便簡介。有時候&#xff0c;我們會碰到需要將 Markdown 格式的文…

劍指Offer(數據結構與算法面試題精講)C++版——day8

劍指Offer&#xff08;數據結構與算法面試題精講&#xff09;C版——day8 題目一&#xff1a;鏈表中環的入口節點題目二&#xff1a;兩個鏈表的第1個重合節點題目三&#xff1a;反轉鏈表附錄&#xff1a;源碼gitee倉庫 題目一&#xff1a;鏈表中環的入口節點 這道題的有如下三個…

【BFT帝國】20250409更新PBFT總結

2411 2411 2411 Zhang G R, Pan F, Mao Y H, et al. Reaching Consensus in the Byzantine Empire: A Comprehensive Review of BFT Consensus Algorithms[J]. ACM COMPUTING SURVEYS, 2024,56(5).出版時間: MAY 2024 索引時間&#xff08;可被引用&#xff09;: 240412 被引:…

前端用用jsonp的方式解決跨域問題

前端用用jsonp的方式解決跨域問題 前端用用jsonp的方式解決跨域問題 前端用用jsonp的方式解決跨域問題限制與缺點&#xff1a;前端后端測試使用示例 限制與缺點&#xff1a; 不安全、只能使用get方式、后臺需要相應jsonp方式的傳參 前端 function jsonp(obj) {// 動態生成唯…

MySQL詳解最新的官方備份方式Clone Plugin

一、Clone Plugin的動態安裝 install plugin clone soname mysql_clone.so;select plugin_name,plugin_status from information_schema.plugins where plugin_name clone; 二、Clone Plugin配置持久化 在 MySQL 配置文件my.cnf中添加以下內容&#xff0c;確保插件在 MySQL …

解決python manage.py shell ModuleNotFoundError: No module named xxx

報錯如下&#xff1a; python manage.py shellTraceback (most recent call last):File "/Users/z/Documents/project/c/manage.py", line 10, in <module>execute_from_command_line(sys.argv)File "/Users/z/.virtualenvs/c/lib/python3.12/site-packa…

鴻蒙NEXT開發資源工具類(ArkTs)

import { AppUtil } from ./AppUtil; import { StrUtil } from ./StrUtil; import { resourceManager } from kit.LocalizationKit;/*** 資源工具類。* 提供訪問應用資源的能力&#xff0c;包括布爾值、數字、字符串等資源的獲取。** author 鴻蒙布道師* since 2025/04/08*/ ex…

css使用mix-blend-mode的值difference實現內容和父節點反色

1. 使用場景 往往開發過程中&#xff0c;經常遇到產品說你這個背景圖和文字顏色太接近了&#xff0c;能不能適配下背景圖&#xff0c;讓用戶能夠看清具體內容是啥。 這么說吧&#xff0c;這種需求場景非常合理&#xff0c;因為你做開發就是要給用戶一個交代&#xff0c;給他們…

el-input 中 select 方法使用報錯:屬性“select”在類型“HTMLElement”上不存在

要解決該錯誤&#xff0c;需明確指定元素類型為 HTMLInputElement&#xff0c;因為 select() 方法屬于輸入元素。 步驟解釋&#xff1a; 類型斷言&#xff1a;使用 as HTMLInputElement 將元素類型斷言為輸入元素。 可選鏈操作符&#xff1a;保持 ?. 避免元素為 null 時出錯…

Mybatis Plus與SpringBoot的集成

Mybatis Plus與SpringBoot的集成 1.引入Maven 依賴2.配置application.yml文件3.創建實體類4.分頁插件5.邏輯刪除功能6.忽略特定字段7.自動填充 1.引入Maven 依賴 提前創建好一個SpringBoot項目&#xff0c;然后在項目中引入MyBatis Plus依賴 <dependency><groupId&g…

大數據學習(104)-clickhouse與hdfs

&#x1f34b;&#x1f34b;大數據學習&#x1f34b;&#x1f34b; &#x1f525;系列專欄&#xff1a; &#x1f451;哲學語錄: 用力所能及&#xff0c;改變世界。 &#x1f496;如果覺得博主的文章還不錯的話&#xff0c;請點贊&#x1f44d;收藏??留言&#x1f4dd;支持一…

【簡歷全景認知2】電子化時代對簡歷形式的降維打擊:從A4紙到ATS的生存游戲

一、當簡歷遇上數字洪流:傳統形式的式微 在1990年代,一份排版精美的紙質簡歷還能讓HR眼前一亮;但今天,超過75%的 Fortune 500 企業使用ATS(Applicant Tracking System)進行初篩,未優化的簡歷可能在5秒內就會淪為數字廢土。這種變遷本質上符合「技術接納生命周期」理論—…

esp32cam -> 服務器 | 手機 -> 服務器 直接服務器傳輸圖片

服務器先下載python &#xff1a; 一、Python環境搭建&#xff08;CentOS/Ubuntu通用&#xff09; 一條一條執行 安裝基礎依賴 # CentOS sudo yum install gcc openssl-devel bzip2-devel libffi-devel zlib-devel # Ubuntu sudo apt update && sudo apt install b…