Vue-day03 組件

1.組件機制

組件 (Component) 是 Vue.js 最強大的功能之一。組件可以擴展HTML元素,封裝可重用的代碼。在較高層面上,組件是自定義元素,Vue的編譯器為它添加特殊功能。在有些情況下,組件也可以表現為用is特性進行了擴展的原生 HTML 元素。組件注冊的時候需要為該組件指定各種參數。

因為組件是可復用的 Vue 實例,所以它們與 new Vue 接收相同的選項,例如 data、computed、watch、methods 以及生命周期鉤子等。僅有的例外是像 el 這樣根實例特有的選項。

### 組件的特點* 組件可以進行任意次數的復用。* 組件的data必須是一個函數,確保每個實例可以維護一份被返回對象的獨立的拷貝,也就是任何一個組件的改變不會影響到其他組件。
let component = { data () { return { count: 0 } },template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>' 
}
一個組件的 data 選項必須是一個函數,因此每個實例可以維護一份被返回對象的獨立的拷貝

2.組件注冊

要想進行組件使用得先進行組件注冊

  1. 全局注冊
    可以使用Vue.component(tagName, options) 注冊一個全局組件, 注冊之后可以用在任何新創建的 Vue 根實例的模板中
    Vue.component(‘my-component-name’,component)

  2. 局部注冊

全局注冊往往是不夠理想的。比如,如果你使用一個像 webpack 這樣的構建系統,全局注冊所有的組件意味著即便你已經不再使用一個組件了,它仍然會被包含在你最終的構建結果中。這造成了用戶下載的 JavaScript 的無謂的增加。局部注冊的組件只能在當前組件中使用

全局組件–>全局變量

局部組件–>局部變量

全局注冊
### js代碼// 1.創建組件let mycom = {data() {return {Commsg: '組件數據'}},methods:{changeObj(){if(this.Commsg==='組件數據'){this.Commsg='修改后的組件數據'}else{this.Commsg='組件數據'}}},// 模板template: `<div><br>組件使用<br>-------------------------<br><span>{{Commsg}}</span><span>{{Commsg}}</span><button @click='changeObj'>更改數據模型中的數據</button></div>`};// 全局注冊Vue.component('my-com',mycom)new Vue({el: '#app',data: {}})
### html代碼<div id="app"><my-com></my-com><my-com></my-com><my-com></my-com></div>
### 局部注冊
### html代碼<div id="app"><my-com-b></my-com-b>--------------------<my-com-a></my-com-a></div>
### js代碼// 創建組件let myComA={// 模板template:`<div>A組件</div>`};let myComB={components:{'my-com-a':myComA},// 模板template:`<div>B組件<my-com-a></my-com-a></div>`};//全局注冊//    Vue.component('my-com-a',myComA)Vue.component('my-com-b',myComB)new Vue({components:{'my-com-a':myComA},  el:'#app',data:{}})

3.組件交互/通信/傳值

組件 A 在它的模板中使用了組件 B。它們之間必然需要相互通信:父組件可能要給子組件下發數據,子組件則可能要將它內部發生的事情告知父組件。在 Vue 中,父子組件的關系可以總結為 prop 向下傳遞,事件向上傳遞。父組件通過 prop 給子組件下發數據,子組件通過事件給父組件發送消息。

1.子組件內使用父組件數據 父-子

? 1.父組件傳遞數據給子組件 (可以傳遞靜態屬性 動態屬性 )

?

? 2.子組件接收并處理數據

? {

? props:[‘title’,‘msg’,'attrA],

? template:``

? }

? 2.父組件內使用子組件的數據

? 事件發射 自定義事件

? 在子組件內發射 在父組件內接受

? 子組件發射時機

? 1.手動按鈕發送

? 2.監聽子組件內數據變化,然后發射

 在子組件內監聽comMsg的變化,this.$emit('',this.comMsg)

父組件的事件處理程序調用,可以更改父組件數據模型中的數據,同步反映到父組件視圖中

### 父組件傳遞數據給子組件
### html代碼<div id="app"><!-- 父組件給子組件傳遞數據 --><my-com :msg='msg' title='父組件向子組件傳值' attr-a='父組件給自組件的靜態數據'></my-com></div>
### js代碼// 創建組件let myCom={// 接受父組件傳遞的數據props:['title','msg','attrA'],data(){return {}},template:`<div>組件通信<br><span>{{msg}}--{{title}}--{{attrA}}</span></div>`}new Vue({components:{"my-com":myCom},el:"#app",data:{msg:'我是父組件'}})
### 子組件向父組件傳遞數據
### html代碼<div id="app">{{msg}}<my-a title='父組件靜態數據' :msg='msg' data-attr='父組件靜態數據' @my-event='handler'>			</my-a></div></div>### js代碼<script>// 創建組件let myA={props:['title','msg','dataAttr'],data(){return {subMsg:'子組件數據'}},methods:{toSend(){// 參數  第一個參數自定義事件名稱 第二個參數傳遞的數據this.$emit('my-event',this.subMsg,100)}},template:`<div>{{subMsg}}--{{msg}}--{{dataAttr}}--<button @click='toSend'>發射數據</button></div>};// 全局注冊Vue.component('my-a',myA)new Vue({el:"#app",data:{msg:'父組件數據'},methods: {handler(a,b){console.log(a,b)}},})

4.組件傳值

父組件通過屬性綁定的方式將參數傳遞給子組件,子組件通過props聲明期望從父組件那里獲取的參數。camelCase (駝峰命名法) 的 prop 名需要使用其等價的 kebab-case (短橫線分隔命名) 命名:

希望每個prop都有指定的值類型。這時,你可以以對象形式列出prop,這些property的名稱和值分別是prop各自的名稱和類型

父組件給子組件數據的時候,子組件可以定義數據類型
靜態傳參:不加冒號,傳字符串
動態傳參:加冒號,傳number、boolean、object、數組類型的值,變量

props: {
title: String,
likes: Number,
isPublished: Boolean,
commentIds: Array,
author: Object,
callback: Function,
contactsPromise: Promise // or any other constructor
}

prop驗證

? 我們可以為組件的 prop 指定驗證要求,例如你知道的這些類型。如果有一個需求沒有被滿足,則 Vue 會在瀏覽器控制臺中警告你。這在開發一個會被別人用到的組件時尤其有幫助。

Vue.component(‘my-component’, {
props: {
// 基礎的類型檢查 (nullundefined 會通過任何類型驗證)
propA: Number,
// 多個可能的類型
propB: [String, Number],
// 必填的字符串
propC: { type: String, required: true },
// 帶有默認值的數字
propD: { type: Number, default: 100 }
})

### js代碼// 創建組件let myA={props:['title','msg'],data(){return {subMsg:'子組件' }},template:`<div>{{title}}-{{msg}}</div>`}Vue.component('my-a',myA)new Vue({el:'#app',data:{msg:'父組件'}})
### html代碼<div id="app">{{msg}}<my-a title='hello' :msg='msg' ></my-a></div>
### html代碼
<div id="app">{{msg}}<!-- <my-a sub-msg="父給子" :stus="[1,2,3]" :is-active="undefined"></my-a> --><!-- <my-a sub-msg="父給子" :stus="[1,2,3]" :is-active="true"></my-a> --><my-a :msg="msg" sub-msg="父給子" :is-active="true" :age="80"></my-a></div>
### js代碼
let myA = {props: {msg: String,subMsg: String,// stus: Array,stus: {type: Array,// 錯誤// default: [6, 7, 8]// 正確  Object/Array要一個工廠函數返回默認值default() {return [6, 7, 8];}},// isActive: BooleanisActive: [String, Boolean],name: {type: String,// 必填項// required: truedefault: "lisi"},// 自定義校驗規則age: {type: Number,// 校驗器 // value 是形參,實參是將來父組件給子組件傳遞的數據validator(value) {/* if(value>50){return true;}else{return false;} */return value > 50;}}},template: `<div>{{subMsg}}{{stus}}{{isActive}}  {{name}}{{age}}{{msg}}</div>`};Vue.component('my-a', myA);let vm = new Vue({el: '#app',data: {msg: 'hello'},methods: {}})

單向數據流(數據更改的方向)

父組件可以改給子組件的數據
父改子可以
子組件不可以改父組件的數據
子改父不行

修改父組件的msg 子組件的msg跟著修改但是反過來不行

vm.msg=‘hello vue’ 觀察子組件的變化

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

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

相關文章

chatgpt和xmind結合起來幫你制作精美的思維導圖

介紹 chatgpt和xmind結合起來幫你制作精美的思維導圖。 1.輸出Markdown格式 2.xmind導入.md文件

web集群學習:nginx+keepalived實現負載均衡高可用性

目錄 項目架構 一&#xff0c;環境介紹 二&#xff0c;項目部署 在Web服務器上配置Web測試頁面 nginx負載均衡配置 配置Nginx_Master 通過vrrp_script實現對集群資源的監控&#xff08;1>通過killall命令探測服務運行狀態&#xff09; 通過vrrp_script實現對集群資源…

div輸入框的文字超過指定行數用省略號表示css

實現效果&#xff1a;超過四行用省略號表示 實現方法&#xff1a; .text{overflow: hidden;text-overflow: ellipsis;display: -webkit-box;-webkit-line-clamp: 4; // 自定義行數-webkit-box-orient: vertical; }

Go和Java實現外觀模式

Go和Java實現外觀模式 下面我們通過一個構造各種形狀的案例來說明外觀模式的使用。 1、外觀模式 外觀模式隱藏系統的復雜性&#xff0c;并向客戶端提供了一個客戶端可以訪問系統的接口。這種類型的設計模式屬于結構型 模式&#xff0c;它向現有的系統添加一個接口&#xff…

【設計模式】代理模式

在代理模式&#xff08;Proxy Pattern&#xff09;中&#xff0c;一個類代表另一個類的功能。這種類型的設計模式屬于結構型模式。 在代理模式中&#xff0c;我們創建具有現有對象的對象&#xff0c;以便向外界提供功能接口。 介紹 意圖&#xff1a;為其他對象提供一種代理以…

【面試問題】事務中執行了異步任務分發數據,由于事務未提交,導致異步任務無法執行

文章目錄 問題描述&#xff1a;解決辦法&#xff1a; 問題描述&#xff1a; OverrideTransactional(rollbackFor Exception.class)public ServiceResponse ctsqCallbackProcess(OaFlowRecord params) {// 查詢任務單數據// 更新任務單信息// 異步分發數據到CRMS系統}客戶數據分…

TX Text Control .NET Server for ASP.NET Crack

TX Text Control .NET Server for ASP.NET Crack TX Text Control.NET Server for ASP.NET是用于Web應用程序或服務的服務器端組件。它是一個完全可編程的ASP.NET文字處理引擎&#xff0c;提供了廣泛的文字處理功能。使用TX Text Control.NET Server&#xff0c;程序員可以開發…

react組件化開發詳解

React是一個流行的JavaScript庫&#xff0c;用于構建用戶界面&#xff0c;并且以組件化的方式進行開發。下面將詳解React組件化開發的概念和步驟&#xff1a; 組件化思維&#xff1a; 組件化開發是將復雜的用戶界面劃分為獨立、可重用的小部件&#xff08;組件&#xff09;。…

【833. 字符串中的查找與替換】

來源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 你會得到一個字符串 s (索引從 0 開始)&#xff0c;你必須對它執行 k 個替換操作。替換操作以三個長度均為 k 的并行數組給出&#xff1a;indices, sources, targets。 要完成第 i 個替換操作: 檢查…

Spring事務傳播機制

hi ,大家好,繼續為大家帶來Spring事務傳播機制的相關知識 文章目錄 &#x1f917;1.事務傳播機制是什么&#x1f917;2.事務傳播機制作用&#x1f917;3.事務傳播機制 &#x1f917;1.事務傳播機制是什么 定義了多個包含了事務的?法&#xff0c;相互調?時&#xff0c;事務是…

C++教程 - How to C++系列專欄第3篇

關于專欄 這個專欄是優質的C教程專欄&#xff0c;如果你還沒看過第0篇&#xff0c;點擊C教程 - How to C系列專欄第0篇去第0篇 本專欄一致使用操作系統&#xff1a;macOS Ventura&#xff0c;代碼編輯器&#xff1a;CLion&#xff0c;C編譯器&#xff1a;Clang 感謝一路相伴…

[C++ 網絡協議編程] UDP協議

目錄 1. UDP和TCP的區別 2. UDP的工作原理 3. UDP存在數據邊界 4. UDP的I/O函數 4.1 sendto函數 4.2 recvfrom函數 4. 已連接(connected)UDP套接字和未連接(unconnected)UDP套接字 5. UDP的通信流程 5.1 服務器端通信流程 5.2 客戶端通信流程 1. UDP和TCP的區別 主要…

從安全角度分析Angular本地存儲

隨著Web應用程序的不斷增長&#xff0c;前端開發人員慢慢意識到使用瀏覽器提供的本地存儲技術可以在不使用外部數據庫的情況下方便地保存應用程序的數據。Angular作為目前最流行的前端框架之一&#xff0c;也在其API中提供了許多本地存儲技術的支持。但是&#xff0c;在使用本地…

Electron教程_編程入門自學教程_菜鳥教程-免費教程分享

教程簡介 Electron是一個是使用JavaScript&#xff0c;HTML和CSS構建跨平臺的桌面應用程序框架。 Electron 通過將 Chromium 和 Node.js 合并到同一個運行時環境中&#xff0c;并將其打包為 Mac&#xff0c;Windows 和 Linux 系統下的應用來實現這一目的。 Electron入門教程 …

【深度學習】日常筆記16

可以將pd.DataFrame數據結構理解為類似于Excel中的表格。pd.DataFrame是pandas庫提供的一個二維數據結構&#xff0c;用于存儲和操作具有行和列的數據。它類似于Excel中的工作表&#xff0c;其中每一列可以是不同的數據類型&#xff08;例如整數、浮點數、字符串等&#xff09;…

關于安卓打包生成aar,jar實現(一)

關于安卓打包生成aar&#xff0c;jar方式 背景 在開發的過程中&#xff0c;主項目引入三方功能的方式有很多&#xff0c;主要是以下幾個方面&#xff1a; &#xff08;1&#xff09;直接引入源代碼module&#xff08;優點&#xff1a;方便修改源碼&#xff0c;易于維護&#…

Spring_AOP

一、AOP簡介 AOP&#xff0c;Aspect Oriented Programming,面向切面編程,是對面向對象編程0OP的升華。OOP是縱向對一個事物的抽象&#xff0c;一個對象包括靜態的屬性信息&#xff0c;包括動態的方法信息等。而AOP是橫向的對不同事物的抽象,屬性與屬性、方法與方法、對象與對象…

算法訓練營題目day17

110. 平衡二叉樹 給定一個二叉樹&#xff0c;判斷它是否是高度平衡的二叉樹。 本題中&#xff0c;一棵高度平衡二叉樹定義為&#xff1a; 一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1 。 func isBalanced(root *TreeNode) bool {h:getHeight(root)if h -1{r…

Vue 安裝開發者工具

1.下載開發者工具&#xff0c;下載地址&#xff1a;http://book.wiyp.top/App/Vue3開發者工具-谷歌/Vue3.crx 2.打開谷歌瀏覽器&#xff0c;點擊擴展&#xff0c;點擊管理擴展程序。 3.開啟開發者模式&#xff0c;將 Vue3 開發者工具文件拖拽到瀏覽器中進行安裝。 注&#xff…

chatGPT小白快速入門培訓課程-001

一、前言 本文是《chatGPT小白快速入門培訓課程》的第001篇文章&#xff0c;全部內容采用chatGPT和chatGPT開源平替軟件生成。完整內容大綱詳見&#xff1a;《chatGPT小白快速入門課程大綱》。 本系列文章&#xff0c;參與&#xff1a; AIGC征文活動 #AIGC技術創作內容征文# …