五分鐘帶你摸透 Vue組件及組件通訊

一.組件化開發

  • 組件 (Component) 是 Vue.js 強大的功能之一。組件可以擴展 HTML 元素,封裝可重用的代 碼。在較高層面上,組件是自定義元素,Vue.js 的編譯器為它添加特殊功能。
  • 在vue中都是組件化開發的,組件化開發就是把一個完整的頁面分割成一個一個的小組件
  • 組件化開發 容易維護 可以復用

1.1.定義簡單的組件

1.1.1語法:

Vue.component()里面有兩個參數:

  1. 組件名稱
  2. 是個對象 對組件的設置 包括html模板 數據偵聽器等
 Vue.component('first-component',{  template:'<h1>我愛我的祖國</h1>'})
1.1.2組件的使用:
<div id="app">   <first-component></first-component> 
</div>

組件不能寫到#app的元素外面

1.1.3組件的重復使用

組件就是一個可以重復引用的Vue實例 可以在頁面中引用多次

<div id="app">    
<first-component></first-component>    
<first-component></first-component>    
<first-component></first-component>    
<first-component></first-component>    
<first-component></first-component> 
</div>
1.1.4定義的組件只能有一個根元素

案例:
下面定義組件中兩個h1都輸入根元素

Vue.component('aa',{
template:'<h1>愛我中華</h1><h1>建設我們的國家</h1>'
})

可以改寫成如下:

Vue.component('aa',{
template:'
<div><h1>愛我中華</h1><h1>建設我們的國家</h1>
</div>
'
})

1.2.組件中的事件

組件就是可以重復使用的Vue實例 所以組件中也有Vue中的事件
data computed watch methods 以及生命周期鉤子函數等 但是組件中沒有el

組件中也可以為元素添加事件:

        Vue.component('aa', {template: `<div class="bottom"><button @click="turnOn">我是測試按鈕</button></div>`,methods: {turnOn(){console.log('我是組件中的事件')}}})

1.3.組件中的數據

組件中的data數據 與new Vue中的不同 為了保證組件中的數據是私有的所以組件中的data數據是一個返回函數 組件中的數據都在函數的作用域中 保證組件中的數據互不感染

 data() {return {msg: '愛我中華'}}

二.組件通訊

因為組件對封閉的 但是在實際的開發中 組件之間的數據是相互依賴 需要相互傳遞的 具體來說組件通訊分為三大類:

  • 父組件為子組件傳遞數據
  • 子組件為父組件傳遞數據
  • 非父子組件之間傳遞數據

2.1 父傳子

父組件向子組件傳遞數據

  • 在子組件中定義props屬性 值為數組類似于data 但data中的數據來自本身 而props中的數據來自父組件
  • 子組件使用模板中使用props中的屬性和data中的用法相同
  • 父組件通過props傳值給子組件
    在這里插入圖片描述
    輸出結果為:
    在這里插入圖片描述
    說明:
  1. 創建Vue實例 data中的數據msg為一個數組
  2. 創建組件 在整個項目中 2組件相對就是1的子組件
  3. 通過3方式前者msg為props值中的數據 后者msg為newVue中data中的數據
  4. 最后正是props中的屬性也有data中的使用方法 將數據進行遍歷在頁面中
    **注意:props負責獲取父組件的傳遞過來的,props中的值是只讀的,不允許修改 **

2.2 子傳父

原理

  • 父組件使用子組件時 在其中定義一個自定義事件 并且綁定父組件中的一個自定義函數 當事件被調用時執行自定義函數
  • 子組件通過this$emit執行自定義事件
    在這里插入圖片描述
    最終輸出結果為3
  1. 在子組件中定義一個點擊事件 觸發時執行子組件中的dian函數 并且將參數傳入函數中
  2. 在上面的函數中通過this.$emit(‘事件名稱’,參數)調用3中的a自定義事件并且將參數傳過去
  3. 當a事件被觸發時 會執行4中的aaa自定義函數 同時獲取參數 最終實現子組件向父組件傳數據

實例改造

根據父子組件之間的數據傳遞實現產品列表的組件化開發
在這里插入圖片描述
代碼如下

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>div {width: 1000px;margin: 100px auto;text-align: center;}table {width: 900px;margin: 50px auto;border-collapse: collapse;}table,th,td {border: 1px solid rgb(218, 124, 17);}.color {background-color: rgb(26, 172, 152);}</style>
</head><body><div id="app"><atitle @tian="tian" :aatitle="aupda" @cha="cha"></atitle><acontent :content="newcontent" @del="del" @upda="upda"></acontent></div><script src="./node_modules/vue/dist/vue.js"></script><script>Vue.component('atitle', {props: ['aatitle'],data() {return {keyword: ''}},template: `<div>型號 <input type="text" v-model=aatitle.name>價格 <input type="text" v-model=aatitle.may @keyup.enter="tian"><button @click="tian">錄入</button><br><input type="text" v-model="keyword"></div>`,methods: {tian() {this.$emit('tian', this.aatitle.name, this.aatitle.may)this.aatitle.name = ''this.aatitle.may = ''}},watch: {keyword: {handler(newvalue) {this.$emit('cha', newvalue)},immediate: true}}})Vue.component('acontent', {props: ['content'],template: `<table><tr><th>編號</th><th>機型</th><th>價格</th><th>時間</th><th>操作</th></tr><tr v-show="this.content.length==0"><td colspan="5">沒有任何發布任何產品</td></tr><tr v-for="(item,index) in content"><td>{{item.id}}</td><td>{{item.name}}</td><td>{{item.may}}</td><td>{{item.time}}</td><td><a href="#"" @click.prevent="del(item.id)">刪除</a><a href="#"" @click.prevent='upda(item.id)'>編輯</a></td></tr></table>`,methods: {del(id) {this.$emit('del', id)},upda(id) {this.$emit('upda', id)}}})const app = new Vue({el: '#app',data: {newcontent: [],aupda: {},isup: false,upid: '',content: [{id: 1,name: '華為',may: 5000,time: Date.now()},{id: 2,name: '小米',may: 6000,time: Date.now()},{id: 3,name: '蘋果',may: 4500,time: Date.now()},{id: 4,name: '1+',may: 3000,time: Date.now()},{id: 5,name: 'oppo',may: 2000,time: Date.now()},{id: 6,name: '1+2',may: 8000,time: Date.now()},{id: 7,name: '1+3',may: 12000,time: Date.now()}]},methods: {del(id) {let index = this.content.findIndex(item => {return item.id == id})this.content.splice(index, 1)this.newcontent.splice(index, 1)},tian(name, may) {if (this.isup) {let a = this.content.find(item => {return item.id == this.upid})a.name = namea.may = may} else {let id = this.content.length - 1 < 0 ? 1 : this.content[this.content.length - 1].id + 1let content = {id: id,name: name,may: may,time: Date.now()}this.content.push(content)this.newcontent.push(content)}},cha(value) {this.newcontent = this.content.filter(item => {return item.name.includes(value)})},upda(id) {let a = this.content.find(item => {return item.id == id})this.aupda = {name: a.name,may: a.may}this.isup = truethis.upid = id}}})</script>
</body></html>

2.3 非父子之間的組件通訊

原理:

通過一個空的Vue實例來傳遞數據

const bus =new Vue()

核心邏輯:

組件A給組件B傳值:

  1. 組件A給bus注冊一個事件,監聽事件的處理程序
  2. 組件B觸發bus上對應的事件,把 值當成參數來傳遞
  3. 組件A通過事件處理程序獲取數據

在這里插入圖片描述
最終點擊h2控制臺會輸出2

  1. 創建1和2兩個非父子組件以及3空vue實例bus
  2. 在1組件中 鉤子函數created中通過bus.$on為bus自定義一個事件aa
  3. 在2組件中 當點擊h2元素時觸發dian函數 并且將值出過去
  4. 在2組件的dian函數中通過bus.$emit方觸發1中的aa事件 并傳參過去
  5. 當1中的aa事件被觸發時會執行其中的函數并獲取參數

實例:

通過非父子組件 實現開關燈案例

  1. 關閉狀態:
    在這里插入圖片描述
    開啟狀態:
    在這里插入圖片描述
    代碼如下
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>#app {width: 500px;height: 500px;margin: 100px auto;}.box {height: 200px;width: 200px;margin: 0 auto;background-color: black;border-radius: 50%;}.below {height: 200px;width: 400px;margin: 50px auto;}button {margin-left: 66px;width: 100px;height: 40px;}.on {background-color: rgb(160, 184, 25);}</style>
</head><body><div id="app"><zss></zss><sgy></sgy></div><script src="./node_modules/vue/dist/vue.js"></script><script>const bus = new Vue()Vue.component('zss', {data() {return {attribute: "on",state: false}},created() {bus.$on('lamp', result => {this.state = result})},template: `<div class="box" :class="state?attribute:''"></div>`})Vue.component('sgy', {template: `<div class="below"><button @click="on">開燈</button><button @click="off">關閉</button></div>`,methods: {on() {bus.$emit('lamp', true)},off() {bus.$emit('lamp', false)}}})const app = new Vue({el: '#app',data: {}})</script>
</body></html>

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

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

相關文章

Parameter 'userName' not found. Available parameters are [1, 0, param1, param2]

Mapper接口的方法的參數沒有加&#xff1a;Param("xxx")注解&#xff0c;或者是xxx寫不對轉載于:https://www.cnblogs.com/linliquan/p/10987136.html

微信公眾號開發-接入

一 首先實現內網穿透&#xff0c;公眾號需要連接我們的服務器&#xff0c;內外無法訪問&#xff0c;所以先實現自己的內網可以測試時連接外網&#xff0c;下載natapp&#xff0c;選擇windows&#xff0c;順便下載config,ini 配置文件。注冊好購買免費的隧道 然后將token寫入配置…

Vue 項目上線優化

上線項目的優化 優化上線項目&#xff0c;首先在上線打包時我們通過babel插件將console清除&#xff0c;當然對項目打包后的體積的影響是微乎其微&#xff0c;對項目的入口文件的改善也是很有必要的&#xff0c;因為在開發階段和上線如果我們使用的是同一入口文件&#xff0c;…

Python并發編程—進程

多任務編程 1.意義&#xff1a; 充分利用計算機多核資源&#xff0c;提高程序的運行效率。 2.實現方案 &#xff1a;多進程 &#xff0c; 多線程 3.并行與并發 并發 &#xff1a; 同時處理多個任務&#xff0c;內核在任務間不斷的切換達到好像多個任務被同時執行的效果&#xf…

Vue 腳手架中的.eslintrc.js代碼規范 的解決

在我們使用Vue腳手架 創建項目時 尤其是團隊共同開發項目時 會按照一個共同的代碼規范來編程 創建Vue腳手架中有一個.eslintrc.js格式 但是在編程中我們通常會使用 shiftaltf 進行代碼格式化 但是由于格式化后的代碼 與Vue中的.eslintrc規范不協調 尤其是 “” &#xff1b; 以…

innodb_locks_unsafe_for_binlog分析

mysql數據庫中默認的隔離級別為repeat-read. innodb默認使用了next-gap算法&#xff0c;這種算法結合了index-row鎖和gap鎖。正因為這樣的鎖算法&#xff0c;innodb在可重復讀這樣的默認隔離級別上&#xff0c;可以避免幻象的產生。 innodb_locks_unsafe_for_binlog最主要的作用…

emacs的使用方法

emacs的使用方法 emacs配置&#xff1a; 將文件命名為.emacs&#xff0c;把配置敲進去&#xff0c;放在home文件夾 emacs命令行&#xff1a; altx打開命令行 編譯&#xff1a; 在命令行輸入compile&#xff0c;回車&#xff0c;會出現make -k&#xff0c;刪掉它&#xff0c;輸入…

前端面試---Vue部分考點梳理

一. Vue的使用 1. Vue的基本使用 指令 插值 插值 表達式 指令 動態屬性 v-html 會有XSS風險 會覆蓋子組件 computed 和 watch computed 有緩存 data不變則不會重新計算watch 如何深度監聽watch 監聽引用類型時 拿不到oldVal v-for v-for 和 v-if 不能同時使用:key的值盡量…

.net core實現跨域

什么是跨域在前面已經講解過了&#xff0c;這里便不再講解&#xff0c;直接上代碼。 一、后臺API接口 用.net core創建一個Web API項目負責給前端界面提供數據。 二、前端界面 建立兩個MVC項目&#xff0c;模擬不同的ip&#xff0c;在view里面添加按鈕調用WEB API提供的接口進行…

TCP/IP簡介

TCP/IP簡介 OSI的“實現”&#xff1a;TCP/IP參考模型 并不完全符合OSI的七層參考模型&#xff0c;但我們可以理解為OSI的一種實現 TCP/IP協議簡述 在很多情況下&#xff0c;它只是利用IP協議進行通信時&#xff0c;所必須用到的協議群的統稱&#xff0c;具體來說&#xff0c;I…

Spring-Cloud 學習筆記-(4)負載均衡器Ribbon

目錄 Spring-Cloud 學習筆記-&#xff08;4&#xff09;負載均衡器Ribbon1、前言2、什么是負載均衡2.1、問題分析2.2、什么是Ribbon3、快速入門3.1、實現方式一3.1.1、修改代碼3.2、實現方式二3.2.1、啟動類3.2.2、調用代碼3.2.3、測試3.2.4、實現原理3.2.5、斷點調式3.3、修改…

‘仿微信發表朋友圈’項目中登錄功能的業務邏輯

登錄功能 手機號驗證碼都通過后端驗證后 返回用戶數據 登陸成功 成功后 調用store中的setUser方法 store中的setUser方法 將后端返回的用戶信息存儲到localStorage中 同時登錄成功后服務器會將token自動存入我們的cookie中 有過期時間 在我們請求需要登錄的接口時將cookie中的…

kubernetes--配置文件

轉載于:https://www.cnblogs.com/caiciadeliliang/p/10993388.html

微信動態中的背景圖更換

初衷&#xff1a; 圖一中的紅框中的部分&#xff0c;作為用戶自定義的背景圖&#xff0c;如果用戶沒有上傳也會為其自動設置一張背景圖&#xff0c;當用戶點擊時則會出現圖二中的選項 &#xff0c;點擊取消則選項消失&#xff0c;點擊從相冊選擇則會跳轉本機的相冊&#xff0c…

大數據學習——akka自定義RPC

實現 package cn.itcast.akkaimport akka.actor.{Actor, ActorSystem, Props} import akka.actor.Actor.Receive import com.typesafe.config.ConfigFactoryimport scala.collection.mutableimport scala.concurrent.duration._class Master(val host: String, val port: Int) …

從Client應用場景介紹IdentityServer4(一)

從Client應用場景介紹IdentityServer4&#xff08;一&#xff09; 原文:從Client應用場景介紹IdentityServer4&#xff08;一&#xff09;一、背景 IdentityServer4的介紹將不再敘述&#xff0c;百度下可以找到&#xff0c;且官網的快速入門例子也有翻譯的版本。這里主要從Clie…

開發常用代碼筆記

Vue 使用moment插件對時間進行格式化&#xff08;全局設置&#xff09; 下載插件 npm install moment --save 在main.js中引入插件 import moment from ‘moment’ 在main.js中定義全局過濾器 Vue.filter(dataFilter,function (dataStr,patten YYYY-MM-DD HH:mm:ss) {retur…

springboot 參數校驗詳解

https://www.jianshu.com/p/89a675b7c900 在日常開發寫rest接口時&#xff0c;接口參數校驗這一部分是必須的&#xff0c;但是如果全部用代碼去做&#xff0c;顯得十分麻煩&#xff0c;spring也提供了這部分功能,本文來探究一下如何實現 1.配置 spring-boot-starter-web包自動依…

微信小程序——賬號及開發工具

1. 注冊微信小程序賬號 點擊我進入微信公眾平臺 進入后點擊立即注冊 注冊成功且登錄后進入小程序管理后臺 2. 安裝開發者工具 點擊進入開發文檔 進入安裝開發工具&#xff08;穩定版本&#xff09; 一路默認下一步進行安裝 3. 開發者工具的使用 使用注冊微信小程序的微信號…

CSS注意的地方

content-box和border-box的區別 2018年02月27日 22:20:16 sulingliang 閱讀數&#xff1a;8011盒子模型 盒子寬度&#xff1a;paddingbordercontent-width 盒子高度&#xff1a;paddingbordercontent-height 如圖所示 盒子模型content-box 說明&#xff1a;在內容寬度和高度之…