vue2 基礎學習 day04 (結構/樣式/邏輯、組件通信、進階語法)下

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

1.作用

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

2.步驟

  1. 創建一個都能訪問的事件總線 (空Vue實例)

    import Vue from 'vue' const Bus = new Vue() export default Bus
    
  2. A組件(接受方),監聽Bus的 $on事件

    created () { ? Bus.$on('sendMsg', (msg) => { ? ? this.msg = msg ? }) }
    
  3. B組件(發送方),觸發Bus的$emit事件

    Bus.$emit('sendMsg', '這是一個消息')

3.代碼示例

EventBus.jsimport Vue from 'vue'
const Bus ?= ?new Vue()
export default Bus
BaseA.vue(接受方)<template><div class="base-a">我是A組件(接收方)<p>{{msg}}</p> ?</div>
</template>
?
<script>
import Bus from '../utils/EventBus'
export default {data() {return {msg: '',}},
}
</script>
?
<style scoped>
.base-a {width: 200px;height: 200px;border: 3px solid #000;border-radius: 3px;margin: 10px;
}
</style>
BaseB.vue(發送方)<template><div class="base-b"><div>我是B組件(發布方)</div><button>發送消息</button></div>
</template>
?
<script>
import Bus from '../utils/EventBus'
export default {
}
</script>
?
<style scoped>
.base-b {width: 200px;height: 200px;border: 3px solid #000;border-radius: 3px;margin: 10px;
}
</style>
App.vue<template><div class="app"><BaseA></BaseA><BaseB></BaseB> </div>
</template>
?
<script>
import BaseA from './components/BaseA.vue'
import BaseB from './components/BaseB.vue' 
export default {components:{BaseA,BaseB}
}
</script>
?
<style>
?
</style>

4.總結

1.非父子組件傳值借助什么?

2.什么是事件總線

3.發送方應該調用事件總線的哪個方法

4.接收方應該調用事件總線的哪個方法

5.一個組件發送數據,可不可以被多個組件接收

?

二、非父子通信-provide&inject

1.作用

跨層級共享數據

2.場景

3.語法

  1. 父組件 provide提供數據

export default {provide () {return {// 普通類型【非響應式】color: this.color, // 復雜類型【響應式】userInfo: this.userInfo, }}
}

2.子/孫組件 inject獲取數據

export default {inject: ['color','userInfo'],created () {console.log(this.color, this.userInfo)}
}

4.注意

  • provide提供的簡單類型的數據不是響應式的,復雜類型數據是響應式。(推薦提供復雜類型數據)

  • 子/孫組件通過inject獲取的數據,不能在自身組件內修改

三、v-model原理

?

1.原理:

v-model本質上是一個語法糖。例如應用在輸入框上,就是value屬性 和 input事件 的合寫

<template><div id="app" ><input v-model="msg" type="text"><input :value="msg" @input="msg = $event.target.value" type="text"></div>
</template>

?

2.作用:

提供數據的雙向綁定

  • 數據變,視圖跟著變 :value

  • 視圖變,數據跟著變 @input

3.注意

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

4.代碼示例

<template><div class="app"><input type="text"  /><br /> <input type="text" /></div>
</template><script>
export default {data() {return {msg1: '',msg2: '',}},
}
</script> 
<style>
</style>

5.v-model使用在其他表單元素上的原理

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

底層處理的是 checked屬性和change事件。

不過咱們只需要掌握應用在文本框上的原理即可

?

四、.sync修飾符(父子組件的雙向綁定)

1.作用

可以實現 子組件父組件數據雙向綁定,簡化代碼

簡單理解:子組件可以修改父組件傳過來的props值

2.場景

封裝彈框類的基礎組件, visible屬性 true顯示 false隱藏

3.本質

.sync修飾符 就是 :屬性名@update:屬性名 合寫

?

父組件

isShow.sync ?=> :isShow="isShow" @update:isShow="isShow=$event"

4.案例:

5、代碼

父組件

<template><div class="app"><button @click="openDialog">退出按鈕</button><!-- isShow.sync  => :isShow="isShow" @update:isShow="isShow=$event" --><BaseDialog :isShow.sync="isShow"></BaseDialog></div>
</template><script>
import BaseDialog from './components/BaseDialog.vue'
export default {data() {return {isShow: false,}},methods: {openDialog() {this.isShow = true// console.log(document.querySelectorAll('.box')); },},components: {BaseDialog,},
}
</script><style>
</style>

子組件

<template><div class="base-dialog-wrap" v-show="isShow"><div class="base-dialog"><div class="title"><h3>溫馨提示:</h3><button class="close" @click="closeDialog">x</button></div><div class="content"><p>你確認要退出本系統么?</p></div><div class="footer"><button>確認</button><button>取消</button></div></div></div>
</template><script>
export default {props: {isShow: Boolean,},methods:{closeDialog(){this.$emit('update:isShow',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和$refs

?

1.作用

????????利用ref 和 $refs 可以用于 獲取 dom 元素 或 組件實例

2.特點:

????????查找范圍 → 當前組件內(更精確穩定)

3.語法

????????1.給要獲取的盒子添加ref屬性

<div ref="chartRef">我是渲染圖表的容器</div>

????????2.獲取時通過 $refs獲取 this.$refs.chartRef 獲取

mounted () {console.log(this.$refs.chartRef)
}

4.代碼示例

父級代碼

<template><div class="app"><BaseChart></BaseChart></div>
</template><script>
import BaseChart from './components/BaseChart.vue'
export default {components:{BaseChart}
}
</script><style>
</style>

子代碼

<template><div class="base-chart-box" ref="baseChartBox">子組件</div>
</template><script>
// yarn add echarts 或者 npm i echarts
import * as echarts from 'echarts'export default {mounted() {// 基于準備好的dom,初始化echarts實例var myChart = echarts.init(document.querySelect('.base-chart-box'))// 繪制圖表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>

六、異步更新 & $nextTick

1、 $nextTick:是等 DOM更新后,才會觸發執行此方法里的函數體

語法: this.$nextTick(函數體)

this.$nextTick(() => {this.$refs.inp.focus()
})

注意:$nextTick 內的函數體 一定是箭頭函數,這樣才能讓函數內部的this指向Vue實例

2、代碼示例

<template><div class="app"><div v-if="isShowEdit"><input type="text" v-model="editValue" ref="inp" /><button>確認</button></div><div v-else><span>{{ title }}</span><button @click="editFn">編輯</button></div></div>
</template><script>
export default {data() {return {title: '大標題',isShowEdit: false,editValue: '',}},methods: {editFn() {// 1.顯示文本框this.isShowEdit = true// 2.讓文本框聚焦 (會等dom更新完之后 立馬執行nextTick中的回調函數)// this.$nextTick(() => {//   console.log(this.$refs.inp)//   this.$refs.inp.focus()// })setTimeout(() => {this.$refs.inp.focus()}, 0)},},
}
</script><style>
</style>

?

?

?

?

?

?

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

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

相關文章

ubuntu 20.04 C和C++的標準頭文件都放在哪個目錄?

在 Ubuntu 20.04 中&#xff0c;C 和 C 標準頭文件的存放目錄主要由編譯器&#xff08;如 GCC&#xff09;的安裝路徑決定&#xff0c;通常分為以下兩類&#xff1a;?1. C 標準頭文件?C 語言的標準頭文件&#xff08;如 <stdio.h>、<stdlib.h> 等&#xff09;默認…

change和watch

是的&#xff0c;你理解得很對&#xff01; change 與 v-model 的結合&#xff1a;change 事件通常用于監聽 表單元素的變化&#xff0c;但它并不一定意味著值發生了變化。它主要是當 用戶與輸入框交互時&#xff08;如點擊選項、選擇文本框內容、提交表單等&#xff09;觸發的…

分布式微服務--GateWay(1)

一、什么是微服務網關&#xff08;API Gateway&#xff09; 定義&#xff1a;微服務網關是整個系統請求的統一入口&#xff0c;負責請求轉發、過濾處理、安全校驗等。 作用&#xff1a; 請求路由 日志記錄 權限控制 參數校驗 解決跨域問題 黑白名單控制 限流、熔斷、降級…

大文件斷點續傳(vue+springboot+mysql)

斷點續傳vue前端代碼后端代碼controller 層service層持久層主表&#xff0c;初始化單次上傳文件表&#xff0c;單次上傳所有的文件記錄文件分塊表科普信息參考其他博主 流程圖 vue前端代碼 這里是只做了demo示例&#xff0c;主線測試沒什么問題&#xff0c;前端同學可參考修…

Nodejs》》MySql

Node.js 操作MySQL數據庫 文檔 # 項目要先安裝mysql包npm i mysqlxx // 安裝指定版本npm i mysql // 默認安裝最新版本 # 連接 mysq// 使用連接池連接const mysql require(mysql)# 建立連接const db mysql.createPool({host:, // 數據庫的IP地址user:ro…

金倉數據庫常見問題(持續更新)

目錄 1.查看大小是否敏感寫參數&#xff0c;提示&#xff1a;未認可的配置參數 "case_sensitive" 2.sys_backup.sh init時提示can not connect the primary node 3.設置邏輯備份運行腳本時提示錯誤are not allowed to use this program (crontab) 4.修改表字段類…

Docker Buildx最佳實踐:多架構鏡像構建指南

文章目錄為什么需要 Docker Buildx安裝與啟用 Docker Buildx創建多架構構建器實例構建多架構鏡像優化構建性能調試多架構構建實戰案例&#xff1a;構建 Go 應用多架構鏡像總結Docker Buildx 是 Docker 官方推出的擴展工具&#xff0c;用于支持多平臺鏡像構建&#xff0c;簡化跨…

你用的是什么鍵盤?

在電競行業飛速發展的當下&#xff0c;游戲鍵盤作為玩家操作的核心載體&#xff0c;其性能表現直接影響著游戲體驗與競技結果。而賽卓電子推出的磁軸鍵盤專用芯片 SC4823&#xff0c;憑借一系列突破性的技術特性&#xff0c;正成為游戲鍵盤領域的性能革新者。?對于游戲玩家而言…

Activiti 中各種 startProcessInstance 接口之間的區別

前言在用 RuntimeService 接口啟動流程實例時&#xff0c;總是分不清楚不同 startProcessInstanceXXX 接口之間的區別&#xff0c;這篇文章基于 Activiti 7.0.0.GA 版本&#xff0c;對這一類接口進行一個梳理和歸類。詳解接口列表RuntimeService 接口中以 startProcessInstance…

新手BUG:函數中 static 變量的賦值語句只會執行一次

在 C 函數中使用 static 變量時&#xff0c;很多新手會陷入一個認知誤區&#xff1a;認為變量的初始化語句會在每次函數調用時執行。比如在bool funcA() { // Q&#xff1a;多次調用funcA&#xff0c;funcB會被執行幾次&#xff1f;// A&#xff1a;1次static bool value func…

Python 基礎詳解:數據類型(Data Types)—— 程序的“數據基石”

一、引言&#xff1a;為什么數據類型如此重要&#xff1f;在 Python 編程中&#xff0c;數據類型決定了&#xff1a;數據的存儲方式可以對數據執行的操作數據的取值范圍不同類型之間的運算規則理解數據類型是編寫正確、高效程序的基礎。Python 是動態類型語言&#xff0c;雖然你…

WindowsLinux系統 安裝 CUDA 和 cuDNN

Windows安裝前的準備工作 檢查硬件兼容性&#xff1a;確認電腦顯卡為 NVIDIA GPU。通過快捷鍵 Win R 喚出“運行”&#xff0c;輸入“control /name Microsoft.DeviceManager”喚出“設備管理器”&#xff0c;點擊“顯示適配器”查看是否有 NVIDIA 字樣。 驗證 CUDA 支持性&a…

工業數采引擎-通信鏈路SOCKET

通信庫&#xff1a;DotNetty 封裝實現&#xff1a;TcpServer、TcpClient、Udp TCP協議特性&#xff1a;面向連接協議&#xff1b;每個新連接都會創建獨立的ChannelHandler實例&#xff1b;TcpHandler構造函數在每次客戶端連接時觸發 UDP協議特性&#xff1a;無連接協議&#…

PHP小白零基礎入門(附視頻教程)

概述 PHP是一種通用開源腳本語言&#xff0c;常用于服務器端Web開發&#xff0c;具有語法簡單、上手快等特點。視頻教程&#xff1a;https://pan.quark.cn/s/8f214c23301b 搭建開發環境&#xff1a; 選擇集成工具&#xff1a;可選擇XAMPP&#xff08;支持Windows/Mac/Linux…

驗證碼等待時間技術在酒店自助入住、美容自助與社區場景中的應用必要性研究—仙盟創夢IDE

代碼 代碼 完整<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>驗證碼倒計時</title><s…

Flask從入門到實戰:基礎、進階、項目架構與接口測試

本文將帶你從零開始掌握Flask框架&#xff0c;涵蓋基礎使用、進階技巧、項目架構設計&#xff0c;并提供完整的接口測試客戶端代碼。 目錄一、Flask基礎入門1.1 Flask簡介與安裝1.2 第一個Flask應用1.3 路由與請求處理1.4 請求與響應處理二、Flask進階使用2.1 模板引擎Jinja22.…

華為云產品圖解

框架圖核心說明: 1. 分層邏輯清晰 基礎設施層(IaaS):提供最基礎的計算(ECS/BMS)、存儲(OBS/EVS)、網絡(VPC/CDN)資源,是所有上層服務的 “物理底座”。 平臺服務層(PaaS):基于 IaaS 構建,提供容器編排(CCE)、數據庫(GaussDB)、大數據與 AI(ModelArts)、中…

Git 中如何回退到以前的提交記錄?

回答重點要在 Git 中回退到以前的提交記錄&#xff0c;你可以使用 git reset 命令。這個命令有三個常用選項來控制你想要回退的程度&#xff1a;1&#xff09; git reset --soft <commit> &#xff1a;僅修改 HEAD 指針&#xff0c;不修改索引和工作區內容。2&#xff09…

JavaWeb03——基礎標簽及樣式(表單)(黑馬視頻筆記)

1.表單標簽 及 表單屬性表單標簽是 &#xff1a;<form> 表單屬性有&#xff1a;action 和 method&#xff1b;action屬性&#xff1a;規定向何處發送表單數據。method屬性&#xff1a;規定用什么方法發送數據。&#xff08;get和post&#xff09;get:在發送的url后面拼接…

STM32的SPI通信(軟件讀寫W25Q64)

在了解完I2C通信后&#xff0c;不免會接觸到到SPI通信。而一開始&#xff0c;可能會覺得兩者好似沒什么區別。為什么要學SPI呢&#xff0c;I2C和SPI有什么區別呢。為此我詳細展開說說。1.什么是 SPI&#xff1f;SPI&#xff0c;全稱 Serial Peripheral Interface&#xff0c;中…