主頁 > 前端設計 > 一小時入門vue組件(建議收藏)

一小時入門vue組件(建議收藏)

2021-06-09 22:26:48 前端設計

本文原創為CSDN博主:安之ccy,博客首頁地址:https://blog.csdn.net/qq_43523725
轉載請注明出處,謝謝支持和鼓勵

先來張柯基的圖,給自己點鼓勵💕

在這里插入圖片描述
初識組件應用
實體化多個vue物件
全域組件
定義與使用
data是一個函式
區域組件
父向子傳值/傳參考:props
靜態傳值
動態傳值:v-bind
子向父:事件傳值$emit
使用腳手架創建專案并運用組件and傳值


初識組件應用

實體化多個vue物件

用new創建多個vue物件并命名,可以通過變數相互訪問
例子:物件2修改物件1的name變數

<!-- 第一個根元素 -->
<div id="vue-app-one">這里是:{{name}}</div> 

<!-- 第二個根元素 -->
<div id="vue-app-two">
    <p>這里是:{{name}}</p><br>
    <button @click="changeName">change-one-name</button>
    <!-- 點擊后修改vue-app-one的name值-->
</div>
 // 第一個vue物件
var one = new Vue({
    el:"#vue-app-one",
    data:{
        "name":"ccy1"
    }
})

 // 第二個vue物件
var two = new Vue({
    el:"#vue-app-two",
    data:{
        "name":"ccy2"
    },
    methods:{
        // 修改vue-app-one的name為'ccy333'
        changeName:function(){
            one.name = 'ccy333'
        }
    }
})

效果:點擊后修改”ccy1“為”ccy333“

在這里插入圖片描述

全域組件

定義與使用

  • 定義全域組件,需給組件一個名字,呼叫時,將組件名當作標簽名使用;相當于自定義標簽,該標簽下可以包含很多子html標簽;
  • 這些子html標簽定義在組件的template屬性中,每次呼叫該組件,都渲染template里的標簽
  • template里必須只有一個根元素
  • 在組件中,data是函式,將資料return回去
  • 依然可以用this來呼叫data中定義的資料

例子:

定義組件:

① 定義一個組件,命名為my-component
② 其中包含資料:name和方法:changeName
③ 渲染出的html效果有一個p標簽,包含一個按鈕,點擊按鈕時,修改name
④ 命名規范:camelCase (駝峰命名法) 與kebab-case (短橫線分隔命名)

  • 當寫成標簽時,遇到有大寫字母的命名,需要改成小寫并用橫桿鏈接前后兩個部分,如定義組件時命名為myComponent,寫成標簽時應寫成<my-component>;
  • 組件定義時也可以用橫桿法命名;
  • 如果定義時用myComponent,標簽用<my-component>是OK的,系統自動識別
// 自定義的全域組件my-component
// template中只有一個根元素p標簽,里面包含一個button按鈕
Vue.component('my-component',{
    template:`<p>
        我的名字是:{{name}}
        <button @click='changeName()'>btn</button>
        </p>`,
    data(){
        return {
            name:'ccy'
        }
    },
    methods:{
        changeName:function(){
            this.name = '安之'
        }
    }
})
// vue物件1
new Vue({
    el:"#vue-app-one",
})
// vue物件2
new Vue({
    el:"#vue-app-two",
})

使用組件:

① 在vue物件對應的根元素(el指定標簽)下使用
② 由于定義的是全域組件,所以可以在任意的vue物件下使用
③ 組件可復用,在一個vue物件下可以使用多次,且組件間互相獨立

<div id="vue-app-one">
    <my-component></my-component>
    <my-component></my-component>
</div> 

<div id="vue-app-two">
    <my-component></my-component>
</div>

效果:
在這里插入圖片描述

data是一個函式

在vue物件中,data屬性值是一個物件,比如這樣的:

在這里插入圖片描述
但是在全域組件中,同一份data可能被多個vue物件使用,每個物件不單獨維護一份data時,如果某一個vue物件修改了data中的一個變數,其他vue物件獲取data時就會被影響;

如果用上面的例子做案例,若組件中的data是物件(參考),其他地方均不改變,兩個vue物件便共享同一個name變數;當我通過其中一個vue物件改變name資料時(即點擊任一個btn按鈕),另一個物件獲得的name也發生了改變(其他按鈕處的’ccy’也都被改成了’安之’)

因此,為保證資料的獨立性,即每個實體可以維護一份被回傳物件的獨立的拷貝,data為每個實體都return一份新創建的資料,不同的vue物件獲取的data均互不影響

在vscode中不允許組件中的data是物件,會報錯:

[Vue warn]: The “data” option should be a function that returns a per-instance value in component definitions.

區域組件

  • 區域組件注冊在某個vue物件中,
  • 只有注冊過該區域組件的vue物件才能使用這個區域組件

例子:
區域組件定義

// template僅一個根元素:ul
var msgComponent = {
	 // 資料是自身提供的 (hobbies)
    template:`<ul><li v-for='hobby in hobbies' v-bind:key='hobby.id'>{{hobby}}</li></ul>`,
    data(){
        return {
            hobbies:['看劇','看動漫','吃好吃的']
        }
    }
}

注冊區域組件:

// 僅由注冊過該區域組件的vue物件才能使用,此處為div#vue-app-one
// 注意命名規范,components中物件的key將會被作為標簽名,多個單詞拼接的命名需使用橫桿法
// 可以寫成msg-component,此處直接簡化了命名為msg,
new Vue({
    el:"#vue-app-one",
    components:{
        "msg": msgComponent
    }
})

html檔案中使用<msg></msg>

<div id="vue-app-one">
    <p>這里是vue-app-one</p>
    <mycomponent></mycomponent>
    <mycomponent></mycomponent>
    <p>我的愛好:</p>
    <msg></msg> <!--使用區域組件-->
</div> 

效果: 紅框圈出的部分就是區域組件渲染出來的
在這里插入圖片描述

父向子傳值/傳參考:prop

靜態傳值

創建子組件:

var titleComponent = {
    props:["title"],
    template:`<p>{{title}}</p>`
    // 所需要的資料title由父組件提供
}

在父組件的components屬性中注冊子組件:

new Vue({
    el:"#vue-app-one",
    components:{
        "msg": msgComponent,
        "titleComponent":titleComponent
    },
})

在父組件上使用子組件:

<!-- div#vue-app-one為父組件 -->
<div id="vue-app-one">
    <p>這里是vue-app-one</p>
    <mycomponent></mycomponent>
    <mycomponent></mycomponent>
	<!--使用子組件title-component,并傳值"我的愛好:"給子組件-->
    <title-component title="我的愛好:"></title-component>
    <msg></msg>
</div> 

效果:紅框標記處就是父向子傳值并展示

在這里插入圖片描述

動態傳值:v-bind

定義子組件:

var titleComponent = {
    props:["title"],
    template:`<p>{{title}}</p>`
}

在父組件的components屬性中注冊子組件:

new Vue({
    el:"#vue-app-one",
    components:{
        "msg": msgComponent,
        "titleComponent":titleComponent
    },
    data(){
        return {
            title:"my hobbies are ",
        }
    }
})

使用子組件,通過系結父組件data中的變數title來實作動態傳值:

<!-- div#vue-app-one為父組件 -->
<div id="vue-app-one">
    <p>這里是vue-app-one</p>
    <mycomponent></mycomponent>
    <mycomponent></mycomponent>
    <!-- 動態系結title -->
    <title-component v-bind:title="title"></title-component>
    <msg></msg>
</div> 

效果:紅框處就是動態系結獲取資料的展示
在這里插入圖片描述
傳遞陣列等復雜資料時,也可以使用v-bind來動態傳值,如:
需要向子級傳遞hobbies陣列,在vue實體物件(父)中創建資料hobbies

new Vue({
    el:"#vue-app-one",
    components:{
        "msg": msgComponent,
        "titleComponent":titleComponent
    },
    data:{
        title:"my hobbies are ",
        hobbies:['看劇','看動漫','吃好吃的'], //需要向子組件傳遞的資料
    }
})

定義子組件

var msgComponent = {
    template:`
            <p>{{hobby}}</p>
            `,
    props:["hobby"],
    data(){
        return {   
        }
    }
}

使用子組件

<!-- div#vue-app-one為父組件 -->
<div id="vue-app-one">
    <p>這里是vue-app-one</p>
    <mycomponent name="ccy"></mycomponent>
    <mycomponent name="ccy"></mycomponent>
    <title-component v-bind:title="title"></title-component>
    <!-- 動態傳值:hobbies -->
    <msg v-for="hobby in hobbies" v-bind:hobby="hobby" v-bind:key="hobby.id"></msg>
</div> 

效果:
在這里插入圖片描述
跳回“一點想法”處

子向父:事件傳值$emit

子組件不能通過prop向父組件傳遞資料,需要使用事件向父組件拋出一個值,告知父組件我需要實作一個功能,由父組件處理這個事件

例子:點擊按鈕,改變名稱chinesename
(由于data變數名不支持chinese-name形式,花括號里不支持chineseName形式,所以這里我都用了小寫,此處記錄一下,日后學到了新知再來填坑)

先在父組件的data中定義chinesename的初始值:

new Vue({
    el:"#vue-app-one",
    data:{
         chinesename:"anzhi" // chinesename初始值
    }
})

創建子組件,并注冊事件change-name(就像click事件一樣,需要讓系統能夠辨認這是一個事件并監聽,當事件被觸發時,執行某項約定好的操作):

  Vue.component('blog-post', {
    props: ['chinesename'],
    template: `
      <div class="blog-post">
        <h3>{{ chinesename }}</h3>
        <button v-on:click='$emit("change-name","ruosu")'>
            修改名字
        </button>
      </div>
    `
    // blog-post組件包含一個h3,顯示chinesename,和一個按鈕
    // 點擊這個按鈕,觸發change-name事件,將"ruosu"作為引數傳遞給指定的處理函式onChangeName
  })

在父組件中使用子組件,定義change-name的處理函式為onChangeName:

<div id="vue-app-one">
    <p>這里是vue-app-one</p>
	<!-- v-bind:通過prop給子組件傳遞chinesename的初始值 -->
	<!-- v-on:子組件通過$emit給父組件傳遞新的chinesename的值 -->
	<div id="blog-posts-events-demo">
	      <blog-post
	        v-bind:chinesename='chinesename'
	        v-on:change-name = "onChangeName"
	      ></blog-post>
	 </div>
</div>

在父組件處定義事件處理函式onChangeName:

new Vue({
    el:"#vue-app-one",
    data:{
          chinesename:"anzhi"
    },
    methods:{
        onChangeName:function(value){
        	// 將chinesename換成傳遞過來的資料
            this.chinesename=value
        }
    }
})

效果:
在這里插入圖片描述

一點想法

關于父子組件的區分,在此寫一點總結,還是日后學了新知識再來填坑 ┗|`O′|┛ 嗷~~

官網中沒有很明確指明兩者的定義和區別,在網上搜了一圈,覺得比較多人認可并且好理解的是:

  • el指定的根元素為父組件(使用之處為父組件)
  • vue實體物件也可看做組件

在前面這些父子傳值的例子中,我們可以看到,對于區域組件,我們會在某個html根元素中注冊并使用,所以此時el指定的根元素在html檔案中是這個區域組件的父組件,區域組件在html使用時便是這個父組件的一份子,承擔資料傳輸的責任
跳轉到父向子動態傳值案例

在這里插入圖片描述
在這里插入圖片描述

再用繞口令說一波,即:title-component組件定義處與使用處,兩者身份是不一樣的,在定義處,它是區域組件,也是子組件,需注冊才能使用;在使用處,它是根元素的包含一部分,根元素為父組件,而“它”,承擔著父組件與子組件資料溝通的重任

這個總結在全域組件情況下也適用,使用該全域組件的根元素是父組件,如上面的子向父傳值的案例,div#vue-app-one是父組件,<blog-post></blog-post>作為父子組件溝通的橋梁,全域組件blog-post為子組件
跳轉到子向父案例

圖示:
在這里插入圖片描述


如果是子組件又嵌套了子組件,被嵌套的組件是子子組件,以此類推

使用腳手架創建專案并運用組件and傳值

CLI腳手架安裝步驟可以看我的這篇文章,使用CLI腳手架創建專案,簡單快捷,特別的是,頁面內容和資料傳遞需要寫在.vue檔案里,每個vue檔案為一個模塊,
我們通過合理組裝各模塊(組件)來完成某項具體的功能,組件之間的配合以及父子傳值的作用在此處體現得更明顯一些,每一個vue檔案都可看作一個組件,我們可以把頁面按照需求劃分成若干個部分,如導航欄,中間內容和底部三個部分,每個部分的實作分散到各子組件中完成,包括頁面的展示和資料的獲取,

如自定義博客頁面:

  • 主頁面由vue-app主組件構成,包含導航欄、中間部分、底部欄三部分

  • 導航欄由vue-header子組件完成

  • 中間內容按照功能劃分

    • 添加博客:addBlob子組件
    • 顯示博客:showBlob子組件
    • 修改博客:modifyBlob子組件
    • 點擊顯示單篇博客內容:singleBlob子組件
  • 底部資訊欄由vue-footer完成
    除了主頁面,其他子部分和組件均根據功能劃分,輔助主頁面展示

個人博客父向子傳值的示意圖如下:

  • 各個子功能由不同組件構成,拼成一個大一些的功能組件
  • 點擊展示單篇博客和修改博客兩個組件均需要從主頁面獲取博客id,才能進行相應展示和操作,這便是典型的父向子傳值
    在這里插入圖片描述
    好啦,本次分享就到這里啦,歡迎點贊、評論、收藏,謝謝支持~
    在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/286339.html

標籤:其他

上一篇:手把手帶你10分鐘手擼一個簡易的Markdown編輯器

下一篇:聊天室應用——jquery + node.js + websocket

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • vue移動端上拉加載

    可能做得過于簡單或者比較low,請各位大佬留情,一起探討技術 ......

    uj5u.com 2020-09-10 04:38:07 more
  • 優美網站首頁,頂部多層導航

    一個個人用的瀏覽器首頁,可以把一下常用的網站放在這里,平常打開會比較方便。 第一步,HTML代碼 <script src=https://www.cnblogs.com/szharf/p/"js/jquery-3.4.1.min.js"></script> <div id="navigate"> <ul> <li class="labels labels_1"> ......

    uj5u.com 2020-09-10 04:38:47 more
  • 頁面為要加<!DOCTYPE html>

    最近因為寫一個js函式,需要用到$(window).height(); 由于手寫demo的時候,過于自信,其實對前端方面的認識也不夠體系,用文本檔案直接敲出來的html代碼,第一行沒有加上<!DOCTYPE html> 導致了$(window).height();的結果直接是整個document的高 ......

    uj5u.com 2020-09-10 04:38:52 more
  • WordPress網站程式手動升級要做好資料備份

    WordPress博客網站程式在進行升級前,必須要做好網站資料的備份,這個問題良家佐言是遇見過的;在剛開始接觸WordPress博客程式的時候,因為升級問題和博客網站的修改的一些嘗試,良家佐言是吃盡了苦頭。因為購買的是西部數碼的空間和域名,每當佐言把自己的WordPress博客網站搞到一塌糊涂的時候 ......

    uj5u.com 2020-09-10 04:39:30 more
  • WordPress程式不能升級為5.4.2版本的原因

    WordPress是一款個人博客系統,受到英文博客愛好者和中文博客愛好者的追捧,并逐步演化成一款內容管理系統軟體;它是使用PHP語言和MySQL資料庫開發的,用戶可以在支持PHP和MySQL資料庫的服務器上使用自己的博客。每一次WordPress程式的更新,就會牽動無數WordPress愛好者的心, ......

    uj5u.com 2020-09-10 04:39:49 more
  • 使用CSS3的偽元素進行首字母下沉和首行改變樣式

    網頁中常見的一種效果,首字改變樣式或者首行改變樣式,效果如下圖。 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ......

    uj5u.com 2020-09-10 04:40:09 more
  • 關于a標簽的講解

    什么是a標簽? <a> 標簽定義超鏈接,用于從一個頁面鏈接到另一個頁面。 <a> 元素最重要的屬性是 href 屬性,它指定鏈接的目標。 a標簽的語法格式:<a href=https://www.cnblogs.com/summerxbc/p/"指定要跳轉的目標界面的鏈接">需要展示給用戶看見的內容</a> a標簽 在所有瀏覽器中,鏈接的默認外觀如下: 未被訪問的鏈接帶 ......

    uj5u.com 2020-09-10 04:40:11 more
  • 前端輪播圖

    在需要輪播的頁面是引入swiper.min.js和swiper.min.css swiper.min.js地址: 鏈接:https://pan.baidu.com/s/15Uh516YHa4CV3X-RyjEIWw 提取碼:4aks swiper.min.css地址 鏈接:https://pan.b ......

    uj5u.com 2020-09-10 04:40:13 more
  • 如何設定html中的背景圖片(全屏顯示,且不拉伸)

    1 <style>2 body{background-image:url(https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture); 3 background-size:cover;background ......

    uj5u.com 2020-09-10 04:40:16 more
  • Java學習——HTML詳解(上)

    HTML詳解 初識HTML Hyper Text Markup Language(超文本標記語言) 1 <!--DOCTYPE:告訴瀏覽器我們要使用什么規范--> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <!--meta 描述性的標簽,描述一些 ......

    uj5u.com 2020-09-10 04:40:33 more
最新发布
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 07:59:23 more
  • 生產事故-走近科學之消失的JWT

    入職多年,面對生產環境,盡管都是小心翼翼,慎之又慎,還是難免捅出簍子。輕則滿頭大汗,面紅耳赤。重則系統停擺,損失資金。每一個生產事故的背后,都是寶貴的經驗和教訓,都是專案成員的血淚史。為了更好地防范和遏制今后的各類事故,特開此專題,長期更新和記錄大大小小的各類事故。有些是親身經歷,有些是經人耳傳口授 ......

    uj5u.com 2023-04-18 07:55:04 more
  • 記錄--Canvas實作打飛字游戲

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 打開游戲界面,看到一個畫面簡潔、卻又富有挑戰性的游戲。螢屏上,有一個白色的矩形框,里面不斷下落著各種單詞,而我需要迅速地輸入這些單詞。如果我輸入的單詞與螢屏上的單詞匹配,那么我就可以獲得得分;如果我輸入的單詞錯誤或者時間過長,那么我就會輸 ......

    uj5u.com 2023-04-04 08:35:30 more
  • 了解 HTTP 看這一篇就夠

    在學習網路之前,了解它的歷史能夠幫助我們明白為何它會發展為如今這個樣子,引發探究網路的興趣。下面的這張圖片就展示了“互聯網”誕生至今的發展歷程。 ......

    uj5u.com 2023-03-16 11:00:15 more
  • 藍牙-低功耗中心設備

    //11.開啟藍牙配接器 openBluetoothAdapter //21.開始搜索藍牙設備 startBluetoothDevicesDiscovery //31.開啟監聽搜索藍牙設備 onBluetoothDeviceFound //30.停止監聽搜索藍牙設備 offBluetoothDevi ......

    uj5u.com 2023-03-15 09:06:45 more
  • canvas畫板(滑鼠和觸摸)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canves</title> <style> #canvas { cursor:url(../images/pen.png),crosshair; } #canvasdiv{ bo ......

    uj5u.com 2023-02-15 08:56:31 more
  • 手機端H5 實作自定義拍照界面

    手機端 H5 實作自定義拍照界面也可以使用 MediaDevices API 和 <video> 標簽來實作,和在桌面端做法基本一致。 首先,使用 MediaDevices.getUserMedia() 方法獲取攝像頭媒體流,并將其傳遞給 <video> 標簽進行渲染。 接著,使用 HTML 的 < ......

    uj5u.com 2023-01-12 07:58:22 more
  • 記錄--短視頻滑動播放在 H5 下的實作

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 短視頻已經無數不在了,但是主體還是使用 app 來承載的。本文講述 H5 如何實作 app 的視頻滑動體驗。 無聲勝有聲,一圖頂百辯,且看下圖: 網址鏈接(需在微信或者手Q中瀏覽) 從上圖可以看到,我們主要實作的功能也是本文要講解的有: ......

    uj5u.com 2023-01-04 07:29:05 more
  • 一文讀懂 HTTP/1 HTTP/2 HTTP/3

    從 1989 年萬維網(www)誕生,HTTP(HyperText Transfer Protocol)經歷了眾多版本迭代,WebSocket 也在期間萌芽。1991 年 HTTP0.9 被發明。1996 年出現了 HTTP1.0。2015 年 HTTP2 正式發布。2020 年 HTTP3 或能正... ......

    uj5u.com 2022-12-24 06:56:02 more
  • 【HTML基礎篇002】HTML之form表單超詳解

    ??一、form表單是什么

    ??二、form表單的屬性

    ??三、input中的各種Type屬性值

    ??四、標簽 ......

    uj5u.com 2022-12-18 07:17:06 more