前端技術Vue學習筆記--005

Vue學習筆記

一、非父子通信-event bus 事件總線

作用:非父子組件之間,進行簡易消息傳遞。(復雜場景用----Vuex)

使用步驟:

請添加圖片描述

  1. 創建一個都能訪問的事件總線 (空Vue實例)-----utils/EventBus.js
// 1.創建一個都能訪問你的時間總線(空閑的Vue實例)
import Vue from "vue"const Bus = new Vue()export default Bus
  1. A組件(接受方),監聽Bus的 $on事件
<script>
import Bus from '../utils/EventBus'
export default {created(){// 2.在A組件(接收方),進行監聽Bus的事件(訂閱消息)Bus.$on('sendMsg',(msg) => {consloe.log(msg)})}
}
</script>
  1. B組件(發送方),觸發Bus實例的事件
<script>
//導入事件總線
import Bus from '../utils/EventBus'
export default {methods:{clickSend(){// 3.B組件(發送方)觸發事件的方式來傳遞參數(發布消息)Bus.$emit('sendMsg','今日天氣不錯')}}
}
</script>

二、非父子通信(拓展)----provide&indect(跨層級共享數據)

provide&indect作用:跨層級共享數據

語法:

  1. 父組件 provide提供數據
export default {provide () {return {// 普通類型【非響應式】color: this.color, // 復雜類型【響應式】userInfo: this.userInfo, }}
}
  1. 子/孫組件 inject獲取數據
export default {inject: ['color','userInfo'],created () {console.log(this.color, this.userInfo)}
}

注意:

  • provide提供的簡單類型的數據不是響應式的復雜類型數據是響應式推薦提供復雜類型數據
  • 子/孫組件通過inject獲取的數據,不能在自身組件內修改

三、子組件與父組件之間的雙向綁定

3.1、原理介紹

v-model本質上是一個 語法糖(語法的簡寫)。例如應用在輸入框上,就是value屬性 和 input事件 的合寫(不同的表單元素會有所不同)

作用:提供數據的雙向綁定

  1. 數據發生改變,頁面就會自動變 :value(v-bind:value=‘實例中的數據’)
  2. 頁面輸入改變,數據會自動變化 @input

注意:$event 用于在模板中,獲取事件的形參

下面兩種寫法等價:

<template><div class="app">1:<input v-model="msg1"  type="text"/><br><!-- 模版中獲取事件的形參  ->  $event獲取 -->2:<input :value="msg2" @input=" msg2 = $event.target.value" type="text"/></div>
</template>

不同的表單元素, v-model在底層的處理機制是不一樣的。比如給checkbox使用v-model
底層處理的是 checked屬性和change事件。

3.2、表單類組件封裝&v-model簡化代碼

  1. 表單類組件封裝—>實現了子組件和父組件數據的雙向綁定
    • 父傳子數據 應該是父組件props傳遞過來的,v-model拆解綁定數據
    • 子傳父監聽輸入,子傳父值給父組件修改

在這里插入圖片描述
App.vue

<template><div class="app"><!-- $event就可以拿到當前子傳父的形參 --><BaseSelect :cityId="selectId" @changeId=" selectId = $event"></BaseSelect></div>
</template><script>
import BaseSelect from './components/BaseSelect.vue'
export default {data(){return{selectId: '102'}},components:{BaseSelect:BaseSelect}
}

BaseSelect

<template><div><!-- 父傳子 ::value="cityId" --><select :value="cityId" @change="handlerChange" ><option value="101">北京</option><option value="102">上海</option><option value="103">武漢</option><option value="104">廣州</option><option value="105">深圳</option></select></div>
</template><script>
export default {props:{cityId: String },methods:{handlerChange(e){//e.target.value 獲取下拉菜單的值// alert(e.target.value)this.$emit('changeId',e.target.value)}}}
</script><style>
</style>

注意:不是自己的數據不能用v-model實現雙向綁定,只能通過將v-model拆解,利用父子通信的手段進行修改。

  1. 父組件v-model簡化代碼實現子組件和父組件的雙向綁定

相比與上述代碼并沒有大致區別,只是將子組件的一些名字替換為value與input,從而在父組件中利用v-model實現數據綁定

v-model其實就是 :value和@input事件的簡寫
步驟:

  • 子組件:props通過value接收數據事件觸發 input
  • 父組件v-model直接綁定數據
    在這里插入圖片描述

輸入框子組件通信

App.vue

<template><div class="app"><!-- <BaseSelect :value="inputValue" @input="inputValue = $event"></BaseSelect> --><!-- :value="inputValue" @input="inputValue = $event" 等價于v-model="inputValue" --><BaseSelect v-model="inputValue"></BaseSelect></div>
</template><script>
import BaseSelect from './components/BaseSelect.vue'
export default {data(){return{inputValue: 'i love china'}},components:{BaseSelect:BaseSelect}}
</script><style></style>

BaseSelect

<template><div><!-- 父傳子 ::value="cityId" --><input type="text" :value="value" @change="handleChange"></div>
</template><script>
export default {props:{value: String },methods:{handleChange(e){//e.target.value 獲取下拉菜單的值// alert(e.target.value)this.$emit('input',e.target.value)}}}
</script><style>
</style>

四、.sync修飾符(重要)

作用:可以實現子組件父組件雙向綁定,簡化代碼
特點:prop屬性名,可以自定義,非固定為value(用v-model)
場景:封裝彈框類的基礎組件,visible屬性 true顯示 false隱藏
本質:就是 :屬性名@update:屬性名 合寫
子父組件的使用方式
在這里插入圖片描述
彈出框數據
App.vue

<template><div class="app"><button @click=" isShow = true ">退出按鈕</button><!-- :visible.sync 等價于  :visible  和@update:visible整合 --><!-- <BaseDialog :visible.sync="isShow"></BaseDialog> --><!-- $event用來接收  this.$emit('update:visible',false)的參數 --><BaseDialog :visible="isShow"  @update:visible=" isShow = $event"></BaseDialog></div>
</template><script>
import BaseDialog from './components/BaseDialog.vue'
export default {data() {return {isShow: false,}},components: {BaseDialog,}
}
</script><style>
</style>

BaseDialog

<template><div class="base-dialog-wrap" v-show="visible"><div class="base-dialog"><div class="title"><h3>溫馨提示:</h3><button class="close" @click="close">x</button></div><div class="content"><p>你確認要退出本系統么?</p></div><div class="footer"><button @click="close">確認</button><button @click="close">取消</button></div></div></div>
</template><script>
export default {props: {visible: Boolean,},methods:{close(){this.$emit('update:visible',false)}}
}
</script><style scoped>
.base-dialog-wrap {width: 300px;height: 200px;box-shadow: 2px 2px 2px 2px #ccc;position: fixed;left: 50%;top: 50%;transform: translate(-50%, -50%);padding: 0 10px;
}
.base-dialog .title {display: flex;justify-content: space-between;align-items: center;border-bottom: 2px solid #000;
}
.base-dialog .content {margin-top: 38px;
}
.base-dialog .title .close {width: 20px;height: 20px;cursor: pointer;line-height: 10px;
}
.footer {display: flex;justify-content: flex-end;margin-top: 26px;
}
.footer button {width: 80px;height: 40px;
}
.footer button:nth-child(1) {margin-right: 10px;cursor: pointer;
}
</style>

五、ref和$ref

5.1、獲取dom

在這里插入圖片描述

BaseChart

<template><div class="base-chart-box"  ref="myCharts">子組件</div><!--  -->
</template><script>
// yarn add echarts 或者 npm i echarts
import * as echarts from 'echarts'
// import echarts from 'echarts'export default {mounted() {// 基于準備好的dom,初始化echarts實例// this.$refs.myCharts替代document.querySelector('.base-chart-box')查找范圍是當前頁面的盒子var myChart = echarts.init(this.$refs.myCharts)// 繪制圖表myChart.setOption({title: {text: 'ECharts 入門示例',},tooltip: {},xAxis: {data: ['襯衫', '羊毛衫', '雪紡衫', '褲子', '高跟鞋', '襪子'],},yAxis: {},series: [{name: '銷量',type: 'bar',data: [5, 20, 36, 10, 10, 20],},],})},
}
</script><style scoped>
.base-chart-box {width: 400px;height: 300px;border: 3px solid #000;border-radius: 6px;
}
</style>

5.2、獲取組件實例

在這里插入圖片描述
App.vue

<template><div class="app"><h4>父組件 -- <button @click="getData">獲取組件實例</button></h4><BaseFromVue ref="fromVue"></BaseFromVue><div><button @click="getData">獲取數據</button><button @click="resetData">重置數據</button></div></div>
</template><script>
import BaseFromVue from './components/BaseFrom.vue'export default {components: {BaseFromVue :BaseFromVue},data(){return{user :{username : '',password : ''}}},methods: {getData(){var user =this.$refs.fromVue.getFromValue()// alert(user.username)this.user=user},resetData(){this.$refs.fromVue.resetFrom()}}
}
</script><style>
</style>

BaseFrom.vue

<template><div class="app"><div>賬號: <input v-model="username" type="text"></div><div>密碼: <input v-model="password" type="text"></div></div>
</template><script>
export default {data(){return{//定義數據username : '',password : ''}},methods:{//獲取到表單數據并返回getFromValue(){console.log("用戶名:"+this.username)return{username : this.username,password : this.password}},resetFrom(){this.username=''this.password=''}}
}
</script><style scoped>
.app {border: 2px solid #ccc;padding: 10px;
}
.app div{margin: 10px 0;
}
.app div button{margin-right: 8px;
}
</style>

六、Vue異步更新、$nextTick

需求:點擊編輯按鈕,顯示編輯框,并讓編輯框自動聚焦

this.isShowEdit = true   //控制顯示this.$refs.inp.focus()  //利用ref得到Dom聚焦

問題:“顯示后”,立即獲取焦點失敗
原因:Vue是異步更新Dom(提升性能)

解決方法:
$nextTick:等Dom更新后,才會觸發方法里的函數體
語法:this. $ nextTick

 methods: {editFn() {// 顯示輸入框(異步dom更新)---this.$refs.inp獲取不到Domthis.isShowEdit = true  //$nextTick()this.$nextTick(()=>{// 獲取焦點this.$refs.inp.focus() })//setTimeout等待的時間不精準 -------- 推薦使用 $nextTick()//    setTimeout(() => {//      this.$refs.inp.focus() //    }, 100);}  }

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

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

相關文章

兩個數組的交集-C語言/Java

描述 給定兩個數組 nums1 和 nums2 &#xff0c;返回 它們的交集 。輸出結果中的每個元素一定是 唯一 的。我們可以 不考慮輸出結果的順序。&#xff08;1 < nums1.length, nums2.length < 1000&#xff0c;0 < nums1[i], nums2[i] < 1000&#xff09; 示例1 輸入…

【golang】通道(channel)的基本原理(一)

通道類型的值本身就是并發安全的&#xff0c;這也是Go語言自帶的、唯一一個可以滿足并發安全性的類型。 聲明一個通道類型變量的時候&#xff0c;我們首先要確定該通道類型的元素類型&#xff0c;決定了我們可以通過這個通道傳遞什么類型的數據。 在初始化通道的時候&#xf…

一鍵批量修改文件夾名稱,中文瞬間變日語,輕松搞定重命名

大家好&#xff01;現在為了更好地適應全球化發展&#xff0c;許多人都有了海外交流、旅行、學習的需求。但是難免遇到一個問題&#xff1a;在電腦中的中文文件夾名稱如何快速翻譯成日語&#xff1f; 首先&#xff0c;第一步&#xff0c;我們需要打開文件批量改名&#xff0c;…

【Unity】編輯器下查找制定文件下的所有特定資源

需求上很簡單&#xff0c;就是在編輯器下&#xff0c;找到某個制定文件下的所有特定資源&#xff08;UnityEngine.Object&#xff09;。Unity 沒有提供專門的 API&#xff0c;我一開始想在網上搜索代碼&#xff0c;發現沒有現成可以直接用的。 功能實現本身并不復雜&#xff0c…

AWS EKS 集群自動擴容 Cluster Autoscaler

文章目錄 一&#xff0c;需求工作需求說明 二&#xff0c;部署精簡命令執行1&#xff0c;要求2&#xff0c;查看EC2 Auto Scaling groups Tag3&#xff0c;創建Serviceaccount需要的Policy&#xff0c;Role4&#xff0c;部署Cluster Autoscaler5&#xff0c;驗證6&#xff0c;常…

zotero在不同系統的安裝(win/linux)

1 window系統安裝 zotero 官網&#xff1a; https://www.zotero.org/ 官方文檔 &#xff1a;https://www.zotero.org/support/ (官方)推薦常用的插件: https://www.zotero.org/support/plugins 入門視頻推薦&#xff1a; Zotero 文獻管理與知識整理最佳實踐 點擊 exe文件自…

【環境配置】Windows 10 安裝 PyTorch 開發環境,以及驗證 YOLOv8

Windows 10 安裝 PyTorch 開發環境&#xff0c;以及驗證 YOLOv8 最近搞了一臺Windows機器&#xff0c;準備在上面安裝深度學習的開發環境&#xff0c;并搭建部署YOLOv8做訓練和測試使用&#xff1b; 環境&#xff1a; OS&#xff1a; Windows 10 顯卡&#xff1a; RTX 3090 安…

Bug日記-webstorm運行yarn 命令報錯

在windows中輸入yarn -v正確輸出&#xff0c;在webstrom終端中運行yarn命令輸出錯誤 問題&#xff1a;可能是由于 WebStorm 配置問題導致的。 解決方案&#xff1a; 檢查 WebStorm 的終端配置&#xff1a;在 WebStorm 中&#xff0c;點擊菜單欄的 “File”&#xff08;文件&am…

DeepSort:基于檢測的目標跟蹤的經典

本文來自公眾號“AI大道理” DeepSORT在SORT的基礎上引入了深度學習的特征表示和更強大的目標關聯方式&#xff0c;有效地減少了身份切換的數量&#xff0c;緩解了重識別問題。 ? 1、DeepSORT簡介 DeepSORT的主要思想是將目標檢測和目標跟蹤兩個任務相結合。 首先使用目標檢…

排序算法分析——什么時候 用 什么排序

排序算法 & 分析 排序算法歷史排序算法分析很快的排序較快的排序中等的排序很慢的排序 分析的結果0.沒有要求1.對速度有要求2.邊排序邊操作3.條件1&條件24.在有序數中操作5.條件1&條件4 了解各種排序&#xff0c;詳見排序專欄 排序算法歷史 縱觀排序算法的歷史&a…

硬件產品經理:從入門到精通(新書發布)

目錄 簡介 新書 框架內容 相關課程 簡介 在完成多款硬件產品從設計到推向市場的過程后。 筆者于2020年開始在產品領域平臺輸出硬件相關的內容。 在這個過程中經常會收到很多讀者的留言&#xff0c;希望能推薦一些硬件相關的書籍或資料。 其實&#xff0c;筆者剛開始做硬…

10. 實現業務功能--退出登錄

目錄 1. 實現 Controller 2. 單體測試 3. 實現前端界面 退出的具體實現邏輯如下&#xff1a; 1. 用戶訪問退出接口 2. 服務器注銷 Session( 在 Controller 中可以直接進行處理 &#xff09; 3. 返回成功或失敗 4. 如果返回成功瀏覽器跳轉到相應頁面 5. 結束 一般來說&#…

使用VS2015打開.pro文件后,編譯報錯

編譯報錯內容&#xff1a; MSB8036 找不到 Windows SDK 版本10.0.18362.0。請安裝所需的版本的 Windows SDK 或者在項目屬性頁中或通過右鍵單擊解決方案并選擇“重定解決方案目標”來更改 SD 方法&#xff1a; 1.右鍵點擊 Solution上&#xff0c;在彈出的框中點擊“Retarget…

調整數組使奇數全部都位于偶數前面

題目內容&#xff1a; 輸入一個整數數組&#xff0c;實現一個函數&#xff0c; 來調整該數組中數字的順序使得數組中所有的奇數位于數組的前半部分&#xff0c; 所有偶數位于數組的后半部分。 題目思路&#xff1a; 將奇數部分放在前半部分&#xff0c;偶數部分放在后半部分&am…

學習筆記230804---restful風格的接口,delete的傳參方式問題

如果后端提供的刪除接口是restful風格&#xff0c;那么使用地址欄拼接的方式發送請求&#xff0c;數據放在主體中&#xff0c;后端接受不到&#xff0c;當然也還有一種可能&#xff0c;后端在這個接口的接參設置上是req.query接參。 問題描述 今天遇到的問題是&#xff0c;de…

新榜 | CityWalk本地生活商業價值洞察報告

如果說現在有人問&#xff0c;最新的網絡熱詞是什么? “CityWalk”&#xff0c;這可能是大多數人的答案。 近段時間&#xff0c;“CityWalk”刷屏了各種社交媒體&#xff0c;給網友們帶來了一場“城市漫步”之旅。 脫離群體狂歡&#xff0c;這個在社交媒體引發熱議的詞匯背后又…

首發 | FOSS分布式全閃對象存儲系統白皮書

一、 產品概述 1. 當前存儲的挑戰 隨著云計算、物聯網、5G、大數據、人工智能等新技術的飛速發展&#xff0c;數據呈現爆發式增長&#xff0c;預計到2025年中國數據量將增長到48.6ZB&#xff0c;超過80%為非結構化數據。 同時&#xff0c;數字經濟正在成為我國經濟發展的新…

RabbitMQ安裝配置,筆記整理 RabbitMQ3.12.2版本安裝配置

官網下載 RabbitMQ 官方地址&#xff1a;RabbitMQ: easy to use, flexible messaging and streaming — RabbitMQ 下載時需注意Erlang Versions的版本 這里下載的是3.12.2 2.安裝依賴環境 在線安裝依賴環境&#xff1a; yum install build-essential openssl openssl-dev…

銳捷無線產品運維(Web登錄、 命令行登錄)

目錄 登錄AP產品 Console登錄&#xff08;只可以現場登錄&#xff09; Web/Telnet/SSH登錄&#xff08;可以現場、遠程登錄&#xff09; 配置AP的管理地址 通過Web界面遠程登錄 通過Telnet、SSH等命令行的方式登錄 登錄AC產品 Console登錄&#xff08;只可以現場登錄&a…