Vue组件开发初探


Posted in Javascript onFebruary 14, 2017

注册一个组件

有两种方式可以注册一个组件,第一种是全局注册,第二种是局部注册

# 全局注册
Vue.component('my-component',{
  template: '<span>Hello</span>'
})

# 局部注册
var child = {
  template: '<span>Hello</span>'
}
new Vue({
  // ···
  components:{
    my-component: child
  }
})

注意:组件的注册必须要在Vue实例创建之前

使用组件

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

当我们需要使用到data时,data必须是一个函数,否则将会报错,这是Vue的一个规则,如下

Vue.component('my-component',{
  template: '<span>{{message}}</span>',
  data:function(){
    return {message:'hello'}
  }
})

组件间消息传递

当我们封装了组件A,但是组件A又嵌套了组件B,这时候组件AB形成了父子组件的关系,我们应该怎么来让父组件传递消息给子组件呢,这里用到了一个属性值props,如下

Vue.component('my-component',{
  props: ['message']
  template: '<span>{{message}}</span>'
})

# 通过props传递消息给子组件
<my-component message="Hello"></my-component>

上面的例子,我们通过props传递了参数给子组件,确实能改变子组件的值,但是,假如我们有这样一个要求,props的值是动态改变的,那么这种静态字面量传递参数的方式就不能满足我们的需求了。如下将说明如何进行动态的props值设定

<div id="app">
  <input v-model="parentMsg"><br>
  <my-component v-bind:message="parentMsg">
</div>

这里通过v-bind的命令,将我们的message与parentMsg进行绑定,这样,当我们的parentMsg改变时,message将能实时改变

自定义事件

父子组件之间如果通过props来传递数据的话,那么似乎只能进行单向的数据传递,只能从父组件向子组件传递,假如我们需要从子组件传递消息回去,那么就需要用到自定义事件了

# 使用v-on绑定自定义事件
Vue.component('my-component',{
  template: '<button v-on:click="increment">{{counter}}</button>',
  data: function(){
    return {counter: 0}
  },
  methods: {
    increment: function(){
      this.counter += 1;
      this.$emit(increment);
    }
  }
})
new Vue({
  el: '#app',
  data: {
    // ···
    total:0
  },
  methods: {
    // ···
    incrementTotal: function(){
      this.total += 1;

    }
  }
})
<div id="app">
  // ···
  <p>{{total}}</p>
  <my-component v-on:increment="incrementTotal"></my-component>
</div>

这里,我们点击按钮,按钮的显示的数值将会改变,同时,total的值也会动态的改变,这就是子组件回传数据的实例,我们点击按钮时,将会首先执行button的onclick方法,在onclick方法里面,通过this.$emit('increment')来执行我们自定义的事件,假如我们需要在$emit中添加参数,那么我们就要在$on()中进行回调的处理

我们接下来自定义一个表单输入控件,我们在输入框中输入信息,同时在P标签中显示出来。

这里我们平时使用的

v-model="message"

其实是下面语句的一个简化版本,也就是语法糖

v-bind:value="message" v-on:input="message = arguments[0]"

或者

v-bind:value="message" v-on:input="message = $event.target.value"

那么自定义表单控件我们需要干什么呢?

为了让v-model生效,我们需要在子组件中定义一个value的属性,还有一个监听新值产生的input事件
来看看我们的自定义控件

<my-input label="Message" :value="message" @input="message = arguments[0]"></my-input>

在上面,我们通过 :value="message" 绑定一个value使其与上一级组件的message相挂钩,后面这个 v-on:input 是子组件定义的事件,事件名可以自己定义,arguments[0] 是组件自定义时传入的第一个参数

完整代码如下:

# 使用自定义事件的表单输入控件
Vue.component('my-input',{
  template: '\
  <div>\
  <label>{{label}} :</label>\
  <input v-bind:value="value" v-on:input="onInput"></input>\
  </div>\
  '
  ,
  props:['value','label'],
  methods:{
    onInput:function(event){
      this.$emit('input',event.target.value);
      // this.$emit('input')
    }
  }

})
<div id="app">
  <p>{{message}}</p>
  <my-input label="Message" v-model="message"></my-input><br>
  <!-- <my-input label="Message" :value="message" @input="message = arguments[0]"></my-input> -->

</div>

我们在定义内部事件时,调用到了$emit(),为了让message能动态改变,我们需要将输入的参数回传回去,这样才能使外部组件与我们的表单控件显示一致

Vue组件的就先写到这,接下来还有事件分发,就接下来再写。由于理解的不同,可能有写得不好的,所以有错误的地方请指正。

Javascript 相关文章推荐
js变量作用域及可访问性的探讨
Nov 23 Javascript
页面中iframe相互传值传参
Dec 13 Javascript
jquery实现metro效果示例代码
Sep 06 Javascript
JQuery记住用户名和密码的具体实现
Apr 04 Javascript
jQuery实现高亮显示网页关键词的方法
Aug 07 Javascript
简单了解JavaScript操作XPath的一些基本方法
Jun 03 Javascript
解决在vue+webpack开发中出现两个或多个菜单公用一个组件问题
Nov 28 Javascript
详解如何在vue项目中使用eslint+prettier格式化代码
Nov 10 Javascript
JavaScript中的一些实用小技巧总结
Apr 07 Javascript
将Vue组件库更换为按需加载的方法步骤
May 06 Javascript
vue中实现拖动调整左右两侧div的宽度的示例代码
Jul 22 Javascript
浅谈JavaScript节流和防抖函数
Aug 25 Javascript
JavaScript Base64 作为文件上传的实例代码解析
Feb 14 #Javascript
JavaScript实现定时页面跳转功能示例
Feb 14 #Javascript
javaScript嗅探执行神器-sniffer.js
Feb 14 #Javascript
JS实现的简单图片切换功能示例【测试可用】
Feb 14 #Javascript
Javascript下拉刷新的简单实现
Feb 14 #Javascript
Vue 短信验证码组件开发详解
Feb 14 #Javascript
JS去除字符串中空格的方法
Feb 14 #Javascript
You might like
php学习笔记之 函数声明(二)
2011/06/09 PHP
php使用date和strtotime函数输出指定日期的方法
2014/11/14 PHP
PHP生成条形图的方法
2014/12/10 PHP
php并发加锁示例
2016/10/17 PHP
php文件上传原理与实现方法详解
2019/12/20 PHP
实现局部遮罩与关闭原理及代码
2013/02/04 Javascript
《JavaScript DOM 编程艺术》读书笔记之DOM基础
2015/01/09 Javascript
jQuery仿Flash上下翻动的中英文导航菜单实例
2015/03/10 Javascript
javascript学习总结之js使用技巧
2015/09/02 Javascript
js canvas画布实现高斯模糊效果
2018/11/27 Javascript
jQuery zTree插件快速实现目录树
2019/08/16 jQuery
js实现随机点名程序
2020/09/17 Javascript
VUE 实现动态给对象增加属性,并触发视图更新操作示例
2019/11/29 Javascript
ng-alain的sf如何自定义部件的流程
2020/06/12 Javascript
[04:30]显微镜下的DOTA2第五期——拉比克
2013/09/26 DOTA
Python Trie树实现字典排序
2014/03/28 Python
仅用500行Python代码实现一个英文解析器的教程
2015/04/02 Python
Python简单实现子网掩码转换的方法
2016/04/13 Python
Python正则表达式知识汇总
2017/09/22 Python
Python编程实现二分法和牛顿迭代法求平方根代码
2017/12/04 Python
python实现QQ邮箱/163邮箱的邮件发送
2019/01/22 Python
Python字符串逆序的实现方法【一题多解】
2019/02/18 Python
python利用后缀表达式实现计算器功能
2021/02/22 Python
HTMl5的存储方式sessionStorage和localStorage详解
2014/03/18 HTML / CSS
Mankind美国/加拿大:英国领先的男士美容护发用品公司
2018/12/05 全球购物
Craghoppers德国官网:户外和旅行服装
2020/02/14 全球购物
在什么时候需要使用"常引用"
2015/12/31 面试题
大学毕业的自我鉴定
2013/10/08 职场文书
内刊编辑求职自荐书范文
2014/02/19 职场文书
群众路线教育实践活动个人对照检查材料思想汇报(社区班子)
2014/10/06 职场文书
2015年清明节活动总结
2015/02/09 职场文书
贷款收入证明范本
2015/06/12 职场文书
2015年乡镇食品安全工作总结
2015/10/22 职场文书
浅谈移动端中的视口(viewport)的具体使用
2021/04/13 HTML / CSS
解决Golang中goroutine执行速度的问题
2021/05/02 Golang
SQL Server #{}可以防止SQL注入
2022/05/11 SQL Server