您当前的位置 :首页 > 学习资料 >  Vue.js 组件
投稿

Vue.js 组件

2021-03-21 23:58:38 来源: 作者: 责任编辑:cncml

组件(Component)是 Vue.js 最强大的功能之一。
组件可以扩展 HTML 元素,封装可重用的代码。
组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的界面都可以抽象为一个组件树:
注册一个全局组件语法格式如下:
  1. Vue.component(tagName, options)
复制代码
tagName 为组件名,options 为配置选项。注册后,我们可以使用以下方式来调用组件:
  1. <tagName></tagName>
复制代码
全局组件
所有实例都能用全局组件。
全局组件实例
注册一个简单的全局组件 runoob,并使用它:
 
  1. <div id="app">
  2.     <runoob></runoob>
  3. </div>
  4.  
  5. <script>
  6. // 注册
  7. Vue.component('runoob', {
  8.   template: '<h1>自定义组件!</h1>'
  9. })
  10. // 创建根实例
  11. new Vue({
  12.   el: '#app'
  13. })
  14. </script>
复制代码
局部组件
我们也可以在实例选项中注册局部组件,这样组件只能在这个实例中使用:
局部组件实例
注册一个简单的局部组件 runoob,并使用它:
 
  1. <div id="app">
  2.     <runoob></runoob>
  3. </div>
  4.  
  5. <script>
  6. var Child = {
  7.   template: '<h1>自定义组件!</h1>'
  8. }
  9.  
  10. // 创建根实例
  11. new Vue({
  12.   el: '#app',
  13.   components: {
  14.     // <runoob> 将只在父模板可用
  15.     'runoob': Child
  16.   }
  17. })
  18. </script>
复制代码
Prop
prop 是父组件用来传递数据的一个自定义属性。
父组件的数据需要通过 props 把数据传给子组件,子组件需要显式地用 props 选项声明 "prop":
Prop 实例
  1. <div id="app">
  2.     <child message="hello!"></child>
  3. </div>
  4.  
  5. <script>
  6. // 注册
  7. Vue.component('child', {
  8.   // 声明 props
  9.   props: ['message'],
  10.   // 同样也可以在 vm 实例中像 "this.message" 这样使用
  11.   template: '<span>{{ message }}</span>'
  12. })
  13. // 创建根实例
  14. new Vue({
  15.   el: '#app'
  16. })
  17. </script>
复制代码
动态 Prop
类似于用 v-bind 绑定 HTML 特性到一个表达式,也可以用 v-bind 动态绑定 props 的值到父组件的数据中。每当父组件的数据变化时,该变化也会传导给子组件:
Prop 实例
  1. <div id="app">
  2.     <div>
  3.       <input v-model="parentMsg">
  4.       <br>
  5.       <child v-bind:message="parentMsg"></child>
  6.     </div>
  7. </div>
  8.  
  9. <script>
  10. // 注册
  11. Vue.component('child', {
  12.   // 声明 props
  13.   props: ['message'],
  14.   // 同样也可以在 vm 实例中像 "this.message" 这样使用
  15.   template: '<span>{{ message }}</span>'
  16. })
  17. // 创建根实例
  18. new Vue({
  19.   el: '#app',
  20.   data: {
  21.     parentMsg: '父组件内容'
  22.   }
  23. })
  24. </script>
复制代码
以下实例中将 v-bind 指令将 todo 传到每一个重复的组件中:
Prop 实例
  1. <div id="app">
  2.     <ol>
  3.     <todo-item v-for="item in sites" v-bind:todo="item"></todo-item>
  4.       </ol>
  5. </div>
  6.  
  7. <script>
  8. Vue.component('todo-item', {
  9.   props: ['todo'],
  10.   template: '<li>{{ todo.text }}</li>'
  11. })
  12. new Vue({
  13.   el: '#app',
  14.   data: {
  15.     sites: [
  16.       { text: 'Runoob' },
  17.       { text: 'Google' },
  18.       { text: 'Taobao' }
  19.     ]
  20.   }
  21. })
  22. </script>
复制代码
注意: prop 是单向绑定的:当父组件的属性变化时,将传导给子组件,但是不会反过来。
Prop 验证
组件可以为 props 指定验证要求。
prop 是一个对象而不是字符串数组时,它包含验证要求:
  1. Vue.component('example', {
  2.   props: {
  3.     // 基础类型检测 (`null` 意思是任何类型都可以)
  4.     propA: Number,
  5.     // 多种类型
  6.     propB: [String, Number],
  7.     // 必传且是字符串
  8.     propC: {
  9.       type: String,
  10.       required: true
  11.     },
  12.     // 数字,有默认值
  13.     propD: {
  14.       type: Number,
  15.       default: 100
  16.     },
  17.     // 数组/对象的默认值应当由一个工厂函数返回
  18.     propE: {
  19.       type: Object,
  20.       default: function () {
  21.         return { message: 'hello' }
  22.       }
  23.     },
  24.     // 自定义验证函数
  25.     propF: {
  26.       validator: function (value) {
  27.         return value > 10
  28.       }
  29.     }
  30.   }
  31. })
复制代码
type 可以是下面原生构造器:
  • String
  • Number
  • Boolean
  • Function
  • Object
  • Array
type 也可以是一个自定义构造器,使用 instanceof 检测。

自定义事件
父组件是使用 props 传递数据给子组件,但如果子组件要把数据传递回去,就需要使用自定义事件!
我们可以使用 v-on 绑定自定义事件, 每个 Vue 实例都实现了事件接口(Events interface),即:
  • 使用 $on(eventName) 监听事件
  • 使用 $emit(eventName) 触发事件
另外,父组件可以在使用子组件的地方直接用 v-on 来监听子组件触发的事件。
以下实例中子组件已经和它外部完全解耦了。它所做的只是触发一个父组件关心的内部事件。
实例
  1. <div id="app">
  2.     <div id="counter-event-example">
  3.       <p>{{ total }}</p>
  4.       <button-counter v-on:increment="incrementTotal"></button-counter>
  5.       <button-counter v-on:increment="incrementTotal"></button-counter>
  6.     </div>
  7. </div>
  8.  
  9. <script>
  10. Vue.component('button-counter', {
  11.   template: '<button v-on:click="incrementHandler">{{ counter }}</button>',
  12.   data: function () {
  13.     return {
  14.       counter: 0
  15.     }
  16.   },
  17.   methods: {
  18.     incrementHandler: function () {
  19.       this.counter += 1
  20.       this.$emit('increment')
  21.     }
  22.   },
  23. })
  24. new Vue({
  25.   el: '#counter-event-example',
  26.   data: {
  27.     total: 0
  28.   },
  29.   methods: {
  30.     incrementTotal: function () {
  31.       this.total += 1
  32.     }
  33.   }
  34. })
  35. </script>
复制代码
如果你想在某个组件的根元素上监听一个原生事件。可以使用 .native 修饰 v-on 。例如:
  1. <my-component v-on:click.native="doTheThing"></my-component>
复制代码
父组件给子组件传值的时候,如果想传入一个变量,写法如下:
  1. // 注册
  2. Vue.component('child', {
  3.   // 声明 props
  4.   props: ['message'],
  5.   // 同样也可以在 vm 实例中像 "this.message" 这样使用
  6.   template: '<span>{{ message }}</span>'
  7. })
  8. // 创建根实例
  9. new Vue({
  10.   el: '#app',
  11.   data:{
  12.     message:"hello",
  13.   }
  14. })
复制代码
子组件通过 $emit 触发父组件的方法时,如果需要传递参数,可在方法名后面加参数数组。
比如 $emit("FunctionName") 当要传递参数时 :$emit("FunctionName",[arg1,arg2...])。
  1. methods: {
  2.     incrementHandler: function (v) {
  3.         if(v==1){
  4.             this.counter -= 1
  5.             this.$emit('increment',[1])
  6.         }else{
  7.             this.counter += 1
  8.             this.$emit('increment',[2])
  9.         }
  10.     }
  11. }
复制代码

 
 
 
 

文章来源: 责任编辑:cncml
版权声明:
1、本主题所有言论和图片纯属会员个人意见,与本网站立场无关
2、本站所有主题由该文章作者发表,该文章作者与享有文章相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该文章作者和的同意
4、文章作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、管理员和版主有权不事先通知发贴者而删除本文
不良信息举报信箱 新闻热线:18733599993 技术服务:18733599993 网上投稿
关于本站 | 广告服务 | 免责申明 | 招聘信息 | 联系我们
在线网 版权所有 Copyright(C)2005-2025