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 相关文章推荐
使用jQuery仿苹果官网焦点图特效
Dec 23 Javascript
javascript简单实现类似QQ头像弹出效果的方法
Aug 03 Javascript
AngularJS基础 ng-src 指令简单示例
Aug 03 Javascript
性能优化之代码优化页面加载速度
Mar 01 Javascript
jQuery插件FusionCharts绘制2D环饼图效果示例【附demo源码】
Apr 10 jQuery
Node.js中的http请求客户端示例(request client)
May 04 Javascript
深入研究jQuery图片懒加载 lazyload.js使用方法
Aug 16 jQuery
使用JQ完成表格隔行换色的简单实例
Aug 25 Javascript
微信小程序日历组件使用方法详解
Dec 29 Javascript
vue实现压缩图片预览并上传功能(promise封装)
Jan 10 Javascript
JavaScript实现的拼图算法分析
Feb 13 Javascript
在react-antd中弹出层form内容传递给父组件的操作
Oct 24 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/26 PHP
php 根据url自动生成缩略图并处理高并发问题
2014/01/23 PHP
linux下安装php的memcached客户端
2014/08/03 PHP
简单理解PHP的面向对象编程方式
2016/05/17 PHP
Yii2 ActiveRecord多表关联及多表关联搜索的实现
2016/06/30 PHP
解决tp5在nginx下修改配置访问的问题
2019/10/16 PHP
ThinkPHP5框架中使用JWT的方法示例
2020/06/03 PHP
如何获取JQUERY AJAX返回的JSON结果集实现代码
2012/12/10 Javascript
Jquery实现三层遍历删除功能代码
2013/04/23 Javascript
JavaScript实现找出字符串中第一个不重复的字符
2014/09/03 Javascript
Angular.js回顾ng-app和ng-model使用技巧
2016/04/26 Javascript
nodejs读写json文件的简单方法(必看)
2017/03/09 NodeJs
从零开始学习Node.js系列教程一:http get和post用法分析
2017/04/13 Javascript
vue中component组件的props使用详解
2017/09/04 Javascript
在Debian(Raspberry Pi)树莓派上安装NodeJS的教程详解
2017/09/19 NodeJs
vue微信分享 vue实现当前页面分享其他页面
2017/12/02 Javascript
vue中使用protobuf的过程记录
2018/10/26 Javascript
ES6使用新特性Proxy实现的数据绑定功能实例
2020/05/11 Javascript
jquery实现上传图片功能
2020/06/29 jQuery
[01:07:53]RNG vs VG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
python使用cStringIO实现临时内存文件访问的方法
2015/03/26 Python
python创建列表并给列表赋初始值的方法
2015/07/28 Python
python 产生token及token验证的方法
2018/12/26 Python
python图形工具turtle绘制国际象棋棋盘
2019/05/23 Python
pytorch 模型可视化的例子
2019/08/17 Python
基于Python的OCR实现示例
2020/04/03 Python
python+openCV对视频进行截取的实现
2020/11/27 Python
三年级数学教学反思
2014/01/31 职场文书
禁止高声喧哗的标语
2014/06/11 职场文书
汉语言文学专业自荐信
2014/06/11 职场文书
禁毒宣传活动总结
2014/08/26 职场文书
2014年银行工作总结范文
2014/11/12 职场文书
2014小学年度工作总结
2014/12/20 职场文书
高三英语教学反思
2016/03/03 职场文书
PHP获取学生成绩的方法
2021/11/17 PHP
Redis Lua脚本实现ip限流示例
2022/07/15 Redis