1. 程式人生 > >Vue的元件component(一)

Vue的元件component(一)

Vue本身是基於元件化開發的,每個元件相當於一個Vue例項。Vue的元件部分搞清楚,是學好Vue的重要一步。

1、Vue元件的全域性註冊

要註冊一個全域性元件,可以使用 Vue.component(tagName, options)。例如:

Vue.component('my-component', {
  // 選項
})
  • 1
  • 2
  • 3

使用的時候直接在dom中使用元件名。例如:

<my-component></my-component>
  • 1

下面是一個完整的帶有屬性傳遞的元件應用例項:

<!DOCTYPE html>
<htmllang
="en">
<head> <metacharset="UTF-8"> <title>Vue-demo</title> <scriptsrc="https://cdn.jsdelivr.net/npm/vue"></script> </head> <body> <divid="app"> <ol> <!--使用元件--> <todo-item v-for="item in todoList"v-bind:todo
="item" >
</todo-item> </ol> </div> <script>//定義一個最簡單的元件 Vue.component('todo-item',{ props:['todo'], template:'<li>name:{{todo.name}},age:{{todo.age}}</li>' }); new Vue({ el:'#app', data:{ todoList:[{name:
'張三',age:23},{name:'李四',age:24},{name:'王五',age:25}] } });
</script> </body> </html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

2、Vue元件的區域性註冊

可以通過Vue例項/元件示例的例項選項 components 來註冊屬於他們自己的元件。

var Child = {
    template:"<p>我是中國人</p>"
}
new Vue({
    el:'#app',
    components: { 
        "my-comp": Child
    }
})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

一個完整的區域性元件註冊的示例demo:

<!DOCTYPE html>
<htmllang="en">
<head>
    <metacharset="UTF-8">
    <title>Vue-demo</title>
    <scriptsrc="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<divid="app">

    <todo-item></todo-item>
</div>
<script>var Child = {
        template: '<div>A custom component!</div>'
    };
    new Vue({
        el:'#app',
        components:{
            'todo-item': Child
        }
    });
</script>
</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

3、元件中的data應該是函式

在new Vue()的例項的過程中,data可以是一個物件,但是在元件component中,data是一個函式。

下面的寫法在Vue中會報錯。

Vue.component('my-com',{
        template:'<span>{{message}}</span>',
        data: {
            message: 1
        }
    })
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

這個示例才是正確的寫法:

Vue.component('my-com',{
   template:'<span>{{message}}</span>',
    data: function() {
        return {
            message: 1
        }
    }
})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

4、元件應該是組合使用的

在react中,最外層是一個根元件,裡層的元件被一層層的巢狀在外層元件內,從而形成一個元件樹。

在 Vue 中,父子元件的關係可以總結為 prop 向下傳遞,事件向上傳遞。父元件通過 prop 給子元件下發資料,子元件通過事件給父元件傳送訊息。

使用props傳遞資料的語法:

Vue.component('child', {
  // 宣告 props
  props: ['message'],
  // 就像 data 一樣,prop 也可以在模板中使用
  // 同樣也可以在 vm 例項中通過 this.message 來使用
  template: '<span>{{ message }}</span>'
})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

4_1、通過props進行屬性傳遞的demo

<!DOCTYPE html>
<htmllang="en">
<head>
    <metacharset="UTF-8">
    <title>Vue-demo</title>
    <scriptsrc="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<divid="app">
    <ol>
        <!--使用元件-->
        <my-com
v-bind:todo="message"
        ></my-com>
    </ol>

</div>
<script>//定義一個最簡單的元件
    Vue.component('my-com',{
        props:['todo'],
        template:'<h3>{{todo}}</h3>'
    });
    new Vue({
        el:'#app',
        data:{
            message:'hello!'
        }
    });
</script>
</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

5、camelCase vs. kebab-case

兩者的區別是駝峰式命名規則,以及短橫線分隔式命名。

在JavaScript中,如果使用駝峰式命名camelCase。

由於在HTML中不區分大小寫,我們需要轉換成短橫線分隔式命名kebab-case。

<!DOCTYPE html>
<htmllang="en">
<head>
    <metacharset="UTF-8">
    <title>Vue-demo</title>
    <scriptsrc="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<divid="app">
    <ol>
        <!--使用元件-->
        <todo-item
my-todo="hello"
        ></todo-item>
    </ol>

</div>
<script>//定義一個最簡單的元件
    Vue.component('todo-item',{
        props:['myTodo'],
        template:'<h2>{{myTodo}}</h2>'
    });
    new Vue({
        el:'#app'
    });
</script>
</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

6、動態props

一般使用V-bind的方式,把一個屬性動態的繫結到props。

<todo-com v-bind:todo='message'></todo-com>
  • 1

如果沒有v-bind,就會展示message這個字串;但是現在,展示的是在data中動態繫結的變數message的資訊。

下面是一個動態繫結props的示例:

<!DOCTYPE html>
<htmllang="en">
<head>
    <metacharset="UTF-8">
    <title>Vue-demo</title>
    <scriptsrc="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<divid="app">
    <ol>
        <!--使用元件-->
        <todo-item
v-bind:my-todo="message"
        ></todo-item>
    </ol>

</div>
<script>//定義一個最簡單的元件
    Vue.component('todo-item',{
        props:['myTodo'],
        template:'<h2>{{myTodo}}</h2>'
    });
    new Vue({
        el:'#app',
        data: {
            message: 'hello world!'
        }
    });
</script>
</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

7、動態props,繫結一個物件作為props傳遞給子元件。

比如一個物件是這樣的:

todo: {
  text:'Learn Vue',
  isComplete: false
}
  • 1
  • 2
  • 3
  • 4

然後:

<todo-item v-bind="todo"></todo-item>
  • 1

等價於:

<todo-item
  v-bind:text="todo.text"
  v-bind:is-complete="todo.isComplete"
></todo-item>
  • 1
  • 2
  • 3
  • 4

一個完整的示例demo如下:

<!DOCTYPE html><htmllang="en"><head><metacharset="UTF-8"><title>Vue-demo</title><scriptsrc="https://cdn.jsdelivr.net/npm/vue"></script></head><body><divid="app"><todo-comv-bind="todo"></todo-com></div><script>//定義一個最簡單的元件
    Vue.component('todo-com',{
        props:['text','isComplete'],
        template:'<h2>I has {{isComplete ? "completed ":"not completed "}}{{text}}</h2>'
    });
    new Vue({
        el:'#app',
        data: {
            todo:{
                text: 'Learn Vue',
                isComplete: false
            }
        }
    });
</script></body></html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

8、元件通訊,props傳遞子元件的使用場景。

1、在子元件中獲取props的值,並且在子元件中需要改變這個值。

我們可以定義一個區域性變數把props的值賦值給它。

props: ['initialCounter'],
data: function() {
  return { counter: this.initialCounter }
}
  • 1
  • 2
  • 3
  • 4

2、在子元件中需要把這個props進行一定的處理,再進行使用。

定義一個計算屬性,處理 prop 的值並返回

props: ['size'],
computed: {
  normalizedSize: function() {
    return this.size.trim().toLowerCase()
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

9、props驗證

要指定驗證規則,需要用物件的形式來定義 prop,而不能用字串陣列:

Vue.component('example', {
  props: {
    // 基礎型別檢測 (`null` 指允許任何型別)
    propA: Number,
    // 可能是多種型別
    propB: [String, Number],
    // 必傳且是字串
    propC: {
      type: String,
      required: true
    },
    // 數值且有預設值
    propD: {
      type: Number,
      default: 100
    },
    // 陣列/物件的預設值應當由一個工廠函式返回
    propE: {
      type: Object,
      default: function() {
        return { message: 'hello' }
      }
    },
    // 自定義驗證函式
    propF: {
      validator: function(value) {
        return value > 10
      }
    }
  }
})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

10、非props特性

所謂的非props特性是不用props申明,直接傳給子元件的一些特性。比如: class。

一般而言,父元件的非props特性對子元件的特性進行覆蓋和合並。

下面的示例中,如果父元件不使用class=’color2’,則陣列顏色是紅色,如果使用了,則顏色為綠色。

<!DOCTYPE html>
<htmllang="en">
<head>
    <metacharset="UTF-8">
    <title>Vue-demo</title>
    <style>.color1{
            color: red;
        }.color2{
            color: green;
        }</style>
    <scriptsrc="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<divid="app">
    <foo-componentclass="color2"v-bind:foo-message="fooMessage"></foo-component>
</
            
           

相關推薦

Vue元件component

Vue本身是基於元件化開發的,每個元件相當於一個Vue例項。Vue的元件部分搞清楚,是學好Vue的重要一步。 1、Vue元件的

vue元件:前期準備工作

前言   將近期專案內自行開發一個vue元件,做個總結,記錄下自己的思維過程~~~ 正文   接到這個任務後,還是要做些準備工作的。   主要內容如下:   1.優化下所在團隊前端開發流程 伺服器搭建gitlab,採用git進行程式碼版本管理 伺服器搭建npm私服(基於verdaccio

如何開發一個基於 Vue 的 ui 元件

開發模式 預覽 demo 在開發一個 ui 元件庫時,肯定需要一邊預覽 demo,一邊修改程式碼。 常見的解決方案是像開發一般專案一樣使用 webpack-dev-server 預覽元件,比如通過 vue-cli 初始化專案,或者自己配置指令碼。 文藝一點兒地可能會用到 parcel 來簡化 demo

Vue學習筆記元件

在做課設的時候,動態生成表格需要寫一堆js程式碼,於是乎決定採用一個前端框架來簡化編碼過程,之前已經學過Vue的一些知識了,因此直接從元件開始記錄。 1.簡單的元件例項 <div class="vue"> <button-c

vue基礎學習

time tle eight pla use logs new dial for 01-01 vue使用雛形      <div id="box"> {{msg}} </div> <sc

vue學習記錄—— vue開發調試神器vue-devtools安裝

shell gist 項目 擴展工具 code blog manifest false .net 網上有些貼子少了至關重要的一步導致我一直沒裝上, 切記!!install後還需build,且install和build都在vue-devtools文件夾內執行 github下載

vue入門練習

col pre 全局 run -c 初始 handbook serve 回車 1.安裝node,webpack   node -v   //查看已安裝版本   npm install -g webpack   //安裝webpack   npm install -g web

vue-cli教程

版本 目錄 pat api when 自動 ats template his 1.安裝vue-cli 再安裝完成npm之後,利用npm安裝vue-cli,全局安裝:npm insall -g vue-cli。倘若npm速度慢,建議替換為cnpm(https://npm.ta

vue 開發系列 vue 開發環境搭建

更新 AC .org 開發環境搭建 執行命令 taobao AR reg 開發技術 概要 目前前端開發技術越來越像後臺開發了,有一站式的解決方案。 1.JS包的依賴管理像MAVEN。 2.JS代碼編譯打包。 3.組件式的開發。 vue 是一個前端的一站式的前

Vue-router學習- 路由匹配

vue 配置 npm class () ons mount 配置路由 方法 一、Vue-router引入使用 Vue-router就是一個vue路由類,通過new一個Vue路由實例,然後Vue.use()嵌入即可。 一般分為以下步驟: 1.引入 (1)、方法一:n

vue知識掌握

files run 單元測試 most -s 目的 例如 再次 使用 vue項目的搭建 本文章主要講述vue項目的搭建,在搭建vue項目前需要準備一些材料。 1.node安裝 npm:在你安裝node的時候一般node已經自帶了npm,所以忽略。 webpack:npm i

前端小菜雞使用Vue+Element筆記

.proto 瀏覽器 csdn ams .com blank != .html *** 關於使用Vue+Element的項目簡介~ 最近因為項目組缺前端人員,所以自己現學現做頁面,先把前後臺功能調通 覺得前端可真的是不容易呀哎呀~ 首先記錄一下相關的Vue入門的教程: vu

Vue.js 筆記 起步

快速入門 <!DOCTYPE html> <html lang="zh" dir="ltr"> <head> <meta charset="utf-8"> <title>vue test </titl

現在很火的 vue 學習篇

記錄一下自己的學習過程,以及學習中遇到的問題。 學習什麼東西首先要知道為什麼去學習?學習它主要可以做什麼? 那什麼是vue.js? vue是一個輕量級框架,與其他重量級的框架不同的是,vue採用自底向上增量開發的設計。使用vue只需要關注檢視層,不過使用起來讓我感覺最不錯的是vue的響應

VUE學習筆記—安裝vue-cli和建立專案

Github:https://github.com/sueRimn 1.cmd開啟控制檯進行建立專案 (1)全域性安裝腳手架 在命令列輸入:npm install vue-cli -g (2)初始化專案 繼續輸入:vue init webpack myvue(myvue是我取的專案名,

從零開始Vue專案實戰-準備篇

從前參與過一個react專案的程式碼編寫,大神搭建的框架,我主要負責業務邏輯程式碼編寫,現在回想起來似乎又什麼都不會,現在為了鞏固前端知識,決定用Vue來做這個專案的移動端網站,我本人Vue是從零開始的,一邊學習一邊寫程式碼,在這裡記錄一下過程。 專案說明: 主要功能實現一個投資平臺,會員身份為融資人或投

vue簡單路由

在專案中,將vue的單頁面應用程式改為了多頁面應用程式,因此在某些場景下,需要頻繁的切換兩個頁面,因此考慮使用路由,這樣會減少伺服器請求。 使用vue-cli(vue腳手架)快速搭建一個專案的模板(webpack-simple),執行起來後,將原來index.html頁面掛載點中的內容刪除

winform控制元件縮寫標準控制元件

winform控制元件縮寫(一)標準控制元件 序號 縮寫 空間名 1 btn Button 2 chk CheckBo

Vue原始碼分析:入口檔案

Vue原始碼分析(一):入口檔案   首先開啟命令列,從github下載原始碼,下載到自己的工作目錄。 git clone https://github.com/vuejs/vue.git   這裡我下載的是2.5.17版本的,vue 原始碼是由各種模組用 rollup 工具

c#窗體學習——常用控制元件介紹

偷懶,轉自若雲流風,原文:https://blog.csdn.net/ruoyunliufeng/article/details/72874691  一.常用控制元件 Lable標籤→僅顯示文字; TextBox文字控制元件→文字框; Button按鈕控制元件