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 相关文章推荐
用Javascript实现UTF8编码转换成gb2312编码
Dec 22 Javascript
select组合框option的捕捉实例代码
Sep 30 Javascript
使用javascript为网页增加夜间模式
Jan 26 Javascript
JS通过分析userAgent属性来判断浏览器的类型及版本
Mar 28 Javascript
推荐25个超炫的jQuery网格插件
Nov 28 Javascript
基于jQuery仿淘宝产品图片放大镜代码分享
Jun 23 Javascript
jquery插件jquery.dragscale.js实现拖拽改变元素大小的方法(附demo源码下载)
Feb 25 Javascript
js实现添加删除表格(两种方法)
Apr 27 Javascript
记一次webapck4 配置文件无效的解决历程
Sep 19 Javascript
bootstrap table列和表头对不齐的解决方法
Jul 19 Javascript
Vue使用vue-recoure + http-proxy-middleware + vuex配合promise实现基本的跨域请求封装
Oct 21 Javascript
Vue.js中v-for指令的用法介绍
Mar 13 Vue.js
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二维数组排序详解
2013/11/06 PHP
浅析php数据类型转换
2014/01/09 PHP
PHP父类调用子类方法的代码例子
2014/04/09 PHP
PHP中array_slice函数用法实例详解
2014/11/25 PHP
php实现格式化多行文本为Js可用格式
2015/04/15 PHP
php版阿里云OSS图片上传类详解
2016/12/01 PHP
Windows下php+mysql5.7配置教程
2017/05/16 PHP
php实现简单的权限管理的示例代码
2017/08/25 PHP
PHP实现的装箱算法示例
2018/06/23 PHP
让JavaScript 轻松支持函数重载 (Part 1 - 设计)
2009/08/04 Javascript
jsTree树控件(基于jQuery, 超强悍)[推荐]
2009/09/01 Javascript
javascript alert乱码的解决方法
2013/11/05 Javascript
jQuery实现仿腾讯视频列表分页效果的方法
2015/08/07 Javascript
ES6中非常实用的新特性介绍
2016/03/10 Javascript
JavaScript中闭包的写法和作用详解
2016/06/29 Javascript
使用JavaScriptCore实现OC和JS交互详解
2017/03/28 Javascript
详解Vue2.X的路由管理记录之 钩子函数(切割流水线)
2017/05/02 Javascript
vue移动端实现下拉刷新
2018/04/22 Javascript
Cocos2d实现刮刮卡效果
2018/12/20 Javascript
原生JS实现列表内容自动向上滚动效果
2019/05/22 Javascript
Vue + Element UI图片上传控件使用详解
2019/08/20 Javascript
jQuery HTML获取内容和属性操作实例分析
2020/05/20 jQuery
[00:08]DOTA2勇士令状等级奖励“天外飞星”
2019/05/24 DOTA
Python实现拼接多张图片的方法
2014/12/01 Python
Python编程中的异常处理教程
2015/08/21 Python
Python批量提取PDF文件中文本的脚本
2018/03/14 Python
在Python中合并字典模块ChainMap的隐藏坑【推荐】
2019/06/27 Python
深入了解Python枚举类型的相关知识
2019/07/09 Python
Python imageio读取视频并进行编解码详解
2019/12/10 Python
Python浮点型(float)运算结果不正确的解决方案
2020/09/22 Python
Jupyter安装链接aconda实现过程图解
2020/11/02 Python
贝玲妃英国官网:Benefit英国
2018/02/03 全球购物
阳光体育:Sunny Sports(购买露营和远足设备)
2018/08/07 全球购物
小学安全教育材料
2014/02/17 职场文书
2014年机关作风建设工作总结
2014/10/23 职场文书
党员作风建设整改方案
2014/10/27 职场文书